WordPress开启Nginx fastcgi_cache缓存加速

WordPress开启Nginx fastcgi_cache缓存加速,这是一篇转载并整理的文章,只为备忘,文章内容大部分来源于张戈博客。

在希望使用Nginx缓存前需要查看一下你的Nginx是否编译了ngx_cache_purge 模块,如果没有则需要编译之

查看ngx_cache_purge是否安装

nginx -V 2>&1 | grep -o ngx_cache_purge

显示ngx_cache_purge表示已经安装,如果没有,则需要重新编译Nginx,在原有的编译参数上新增一个 ngx_cache_purge 模块,比如:

–add-module=../ngx_cache_purge-2.3

编译完后,进行Nginx配置

要用这个缓存功能,建议重新弄一个 server 模块(替换之前的)

#下面2行的中的wpcache路径请自行提前创建,否则可能会路径不存在而无法启动nginx,max_size请根据分区大小自行设置
# 其实你还可以把fastcgi_cache_path缓存路径设置在tmpfs内存中,操作系统不同tmpfs路径也不同,如下:CentOS:/dev/shm   Ubuntu和Debian:/run/shm

fastcgi_cache_path /tmp/wpcache levels=1:2 keys_zone=WORDPRESS:250m inactive=1d max_size=1G;

fastcgi_temp_path /tmp/wpcache/temp;

fastcgi_cache_key “$scheme$request_method$host$request_uri”;

fastcgi_cache_use_stale error timeout invalid_header http_500;

#忽略一切nocache申明,避免不缓存伪静态等

fastcgi_ignore_headers Cache-Control Expires Set-Cookie;

#Ps:如果是多个站点,以上内容不要重复添加,否则会冲突,可以考虑将以上内容添加到nginx.conf里面,避免加了多次。

server

{

listen 80;

#请修改为自己的域名

server_name zhang.ge;

index index.html index.htm index.php default.html default.htm default.php;

#请修改为自己网站的存放路径

root /home/wwwroot/zhang.ge;

set $skip_cache 0;

#post访问不缓存

if ($request_method = POST) {

set $skip_cache 1;

}

#动态查询不缓存

if ($query_string != “”) {

set $skip_cache 1;

}

#后台等特定页面不缓存(其他需求请自行添加即可)

if ($request_uri ~* “/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml”) {

set $skip_cache 1;

}

#对登录用户、评论过的用户不展示缓存(这个规则张戈博客并没有使用,所有人看到的都是缓存)

if ($http_cookie ~* “comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in”) {

set $skip_cache 1;

}

#这里请参考你网站之前的配置,特别是sock的路径,弄错了就502了!

location ~ [^/]\.php(/|$) {

try_files $uri =404;

fastcgi_pass unix:/tmp/php-cgi.sock;

fastcgi_index index.php;

include fastcgi.conf;

#新增的缓存规则

fastcgi_cache_bypass $skip_cache;

fastcgi_no_cache $skip_cache;

add_header X-Cache “$upstream_cache_status From $host”;

fastcgi_cache WORDPRESS;

fastcgi_cache_valid 200 301 302 1d;

}

location / {

#此处可以添加自定义的伪静态规则(之前你新增的伪静态规则可以添加到这,没有就不用了)

try_files $uri $uri/ /index.php?$args;

rewrite /wp-admin$ $scheme://$host$uri/ permanent;

}

#缓存清理配置(可选模块,请细看下文说明)

location ~ /purge(/.*) {

allow 127.0.0.1;

allow “此处填写你服务器的真实外网IP”;

deny all;

fastcgi_cache_purge WORDPRESS “$scheme$request_method$host$1”;

}

location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {

access_log off; log_not_found off; expires max;

}

location = /robots.txt { access_log off; log_not_found off; }

location ~ /\. { deny all; access_log off; log_not_found off; }

#请注意修改日志路径

access_log /home/wwwlogs/zhang.ge.log access;

}

在wordpress中,还一个专门为WordPress量身定做的缓存清理插件:Nginx Helper。下面是部分功能说明

fastcache4

清理模式建议选择模式二(Delete local server cache files),不过由于插件作者定义的缓存路径是 /var/run/nginx-cache ,而我们可能会根据服务器实际情况来自定义缓存路径,这样一来,缓存路径的不同就会导致插件无法找到缓存文件并删除!

解决办法:

很简单,在WordPress根目录下的wp-config.php中新增如下代码即可:

//根据实际情况定义缓存的存放路径

define( ‘RT_WP_NGINX_HELPER_CACHE_PATH’,’/tmp/wpcache’);


Ps:不知道添加到第几行的话,可以添加到 define(‘WPLANG’, ‘zh_CN’); 的后面即可。添加后建议重载一下php,确保变量生效(主要针对开启了PHP缓存的网站)。

实际使用过程中,很多人还是有这样那样的问题,主要的问题就是

1、移动端缓存和PC端缓存混肴,导致某些wordpress在相应端显示错误!

2、某些页面我不想缓存

其实,根据上面的代码很简单!

针对问题1,张戈在评论也有介绍,主要是要去百度或者Google下Nginx对移动端的判断,下面是我整理出的,可能不完整,大家自己补充:

if ($http_user_agent ~* “Android|webOS|iPhone|iPod|BlackBerry|IEMoble|Mobile|Tablet”) {

set $skip_cache 1;

}

 

针对问题2,其实注意看张戈提供的代码

#后台等特定页面不缓存(其他需求请自行添加即可)

if ($request_uri ~* “/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml”) {

set $skip_cache 1;

}

 

已经很明确了,比如我友情链接页面不想缓存,就加上

#后台等特定页面不缓存(其他需求请自行添加即可)

if ($request_uri ~* “/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml|links.html”) {

set $skip_cache 1;

}

附录:fastcgi_cache配合timthumb.php缩略图组件直接缓存到本地。

首先,自然是要先按上面教程配置好fastcgi_cache,然后在Nginx配置中添加Nginx重写PHP缩略图URL规则

#Nginx重写PHP缩略图URL规则

location ~ .*\.(gif|jpg|jpeg|png|bmp)$ {

set $width ”;

set $height ”;

set $width $arg_w;

set $height $arg_h;

#只要图片带上宽度(?w=)或高度(?h=)参数,都会将访问重写到/thumb/timthumb.php?src=* 这个动态缩略图生成的接口上

if ( $width != ” ) {

rewrite ^(.*)$ /thumb/timthumb.php?src=http://$host/$1 last;

}

if ( $height != ” ) {

rewrite ^(.*)$ /thumb/timthumb.php?src=http://$host/$1 last;

}

expires max;

}

如果你只想缓存timthumb.php生存的缩略图,那么在上面的Nginx配置中“location ~ [^/]\.php(/|$) { ” 这段上面加入

location ~* /timthumb.php { #指定仅timthumb.php使用fastcgi_cache缓存
try_files $uri =404;
fastcgi_pass  unix:/tmp/php-73-cgi.sock;
fastcgi_index  index.php;
fastcgi_param  SCRIPT_FILENAME  $DOCUMENT_ROOT$fastcgi_script_name;
fastcgi_param PATH_INFO $2;
include fcgi.conf;
add_header X-Cache “$upstream_cache_status From $host”;
fastcgi_cache WORDPRESS;
fastcgi_cache_valid 200 301 302 1d;
}

资料来源https://zhang.ge/5042.html

实现高性能wordpress ajax文章分页功能

wordpress实现高性能的ajax文章分页功能。首先我们需要对后端进行处理,使除了当前使用AJAX可以无刷新浏览外,还可以直接请求改变的URL后也可以正常浏览。方法是对使用pushState的AJAX的发送一个特殊的头,当后端获取到的时候通用的部分不再输出〜

大致代码如下,具体根据主题不同可以略微有差别,编辑的index.php,改成如下结构

<?php

if(isset($_GET[“action”]) && $_GET[“action”] == “ajax_postsss”){

nocache_headers();?>

…..需要ajax调出来的部分….

<?php }else{

get_header() ;

?>

…..文章内容….

<?php get_sidebar() ;?>

<?php get_footer() ;?>

<?php }?>

在引用JQ库的情况下使用此代码实现:

jQuery(document).ready(function(a) {

var n = null, H = false, i = document.title, t, h = window.opera ? document.compatMode == “CSS1Compat” ? a(“html”) :a(“body”) :a(“html,body”);

if (window.history && window.history.pushState) {

a(document).on(“click”, “.content-page a”, function(b) {

b.preventDefault();

if (n == null) {

t = {

url:document.location.href,

title:document.title,

html:a(“#content”).html(),

top:h.scrollTop()

};

} else {

n.abort();

}

t.top = h.scrollTop();

var q = a(this).attr(“href”).replace(“?action=ajax_postsss”, “”);

a(“.content-page”).text(“\u6587\u7ae0\u52a0\u8f7d\u4e2d\x2e\x2e\x2e”);

n = a.ajax({

url:q + “?action=ajax_postsss”,

success:function(v) {

H = true;

var state = {

url:q,

title:i,

html:v

};

history.pushState(state, i, q);

document.title = i;

h.animate({

scrollTop: 0

},

0);

a(“#content”).html(v);

}

});

return false;

});

window.addEventListener(“popstate”, function(i) {

if (n == null) {

return;

} else {

if (i && i.state) {

H = true;

document.title = i.state.title;

a(“#content”).html(i.state.html);

} else {

H = false;

document.title = t.title;

a(“#content”).html(t.html);

h.animate({

scrollTop: t.top

},

0)

}

}

});

}

});

#content 标签要包含文章列表和翻页导航, .content-page a 是翻页标签,内容请根据你自己的网页模板修改。

简单实用的网站动静分离优化方案

简单实用的网站动静分离优化方案,这是一篇转载文章,自己收藏起来慢慢琢磨。

先啰嗦一下网站动静分离的概念和好处。

一、动静分离

我们的网站简单来说分为 2 种数据资源,一种是动态的数据,即 PHP 等程序语言实时吐出来的数据,在网页内容上主要是 HTML 代码,另一种则是静态资源,比如图片、css、js、视频等(当然,图片等资源也可能是实时动态生成的,比如 PHP 缩略图,这里就不展开讨论了)。

一般网站初建,因为流量小、业务简单等原因,都默认将两种数据放到一台服务器上提供服务。访问量大到一定程度之后,就可能出现带宽不足、甚至磁盘高 IO 等问题。这时,作为运维工程师或者架构师就会给出动静分离优化的建议了。做法并不复杂,运维工程师会将图片等静态资源同步到另一台 WEB 服务器,然后新增绑定一个二级域名,比如 static.domain.com,最后让开发将网页代码中的静态资源替换成这个二级域名即可。

这样一来,图片等静态资源的访问就落到了新增的服务器上,从而分担了大部分访问数据流量和 IO 负载,我们还可以针对性的给静态资源 WEB 做一些优化,比如 JS/CSS/图片压缩、内存缓存、浏览器缓存等等。进一步,我们还可以将静态资源接入 CDN,实现资源就近访问。

二、好处分析

1、常规做法的好处

从上文的通俗解释来看,很明显的一个好处就是解决带宽问题,像博客圈子里的服务器,绝大部分主机都是国内的小管道云服务器(带宽小于 2M),并发访问量上来之后,就能很明显的感觉到带宽成为了瓶颈。

不过,博客圈大部分都是“一穷二白”,一般都不愿意再买一台服务器来专门承载静态资源,而且多台服务器之间的数据同步等日常维护问题也变相提高了折腾门槛。因此,国内大部分小博客都热衷于套一层 CDN 来解决带宽问题,确实是一个很好的解决方案。在《分享张戈博客的 WordPress 优化方案,缓解国内云服务器配置低下的问题》一文中,也是特别提到了这一茬。

2、本文分享方案的好处

上文说张戈博客使用了一种偷懒的方案,做法很简单:网站只用一台服务器,但是会新增绑定一个和主站完全不一样的二级域名,比如张戈博客主站是 zhangge.net,而二级域名用的是 res.zgboke.com,并且给这个二级域名套了一层 CDN。

这样做又有什么好处?和直接套一层 CDN(比如云加速)有什么不同?

第 1 个好处:显而易见比常规动静分离成本更低,分离前后服务器数量不变;

第 2 个好处:解决主站直接使用一级域名带来的 cookies“污染”,即静态资源不会再带上主站的 cookies 数据,减小了体积。这个在上文提到的优化方案一文中也着重提到,详细就不再赘述;

第 3 个好处:这个方案对于网站内容没法备案又想体验国内 CDN 加速快感的网站绝对是福音!很多网站因为内容特殊(邪恶脸)没法完成备案,所以无法使用国内的 CDN,那么就可以用本文分享的方法,直接花钱买一个备过案的垃圾域名,做好动静分离,然后将这个二级域名接入国内的 CDN,网站速度绝对可以得到质的飞跃,是不是爽歪歪?

第 4 个好处:这个和第二个比较类似,主要针对在百度云加速购买了付费套餐的朋友。因为,对于一般流量的网站,你只需要在百度云加速给一个域名购买一个专业版,那么就可以分离多个二级域名给 N 个网站使用,那么多个人合买一个专业版完全不成问题吧?当然,现在百度云加速也学聪明了,现在流量限制 50G/天(我开始用这个方案的时候无此限制),但是对于普通网站已经很够用了!!!

第 5 个好处:CDN 配置更加比较简单,因为这种静态二级域名,接入 CDN 之后,完全不用考虑缓存规则的问题,因为直接设置成全部缓存就好了!简单粗暴。

三、部署教程

啰嗦了好长篇幅,下面给出具体做法!

原理贼简单,就是在服务器上利用反向代理新增了一个新网站,内容则是反向代理了我们的主站,从而实现了 2 个域名共享相同的网站数据。

Vhost 示范规则如下:

server

{

listen 80;

# HTTPS配置略

server_name res.zgboke.com; # 改成实际二级域名

index index.html index.htm index.php default.html default.htm default.php;

root /data/wwwroot/zhangge.net;

# 图片等静态资源请求代理到本地主站(关键配置)

location ~* .*\.(js|css|png|jpeg|jpg|bmp|ico|ogg|ogv|svg|svgz|eot|otf|woff|woff2|mp4|ttf|rss|atom|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {

add_header Access-Control-Allow-Origin *; # 解决字体跨站问题

add_header Access-Control-Allow-Headers X-Requested-With;

add_header Access-Control-Allow-Methods GET,OPTIONS;

proxy_pass http://127.0.0.1; # 如果是启用了https的网站,这里最好改成 https://127.0.0.1,避免主站加了非https协议的跳转配置,导致不成功。

proxy_set_header X-Forwarded-For $remote_addr;

proxy_redirect off;

proxy_set_header Host zhangge.net; # 这里改为实际主站域名(必须)

expires max; # 设置浏览器304缓存为最长期限

}

# 为这个二级域名额外设置一个robots文件

location ~ (robots.txt) {

rewrite /robots.txt /resrobots.txt last; # 在网站根目录新增一个resrobots.txt,内容和七牛CDN类似,禁止搜索引擎抓取非静态资源(resrobots.txt内容参考:https://zhangge.net/5104.html)

}

# 如果通过静态域名访问的是非静态资源,比如访问了我们的文章页面,则跳到主站对应的页面。

location / {

if ( $request_uri !~* .*\.(js|css|png|jpeg|jpg|gif|bmp|ico|ogg|ogv|svg|svgz|eot|otf|woff|woff2|mp4|ttf|rss|atom|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf))

{

rewrite ^(.*)$ $scheme://zhangge.net$1 permanent; # zhangge.net 修改为实际主站域名

}

}

location ~ /\. { deny  all; access_log off; log_not_found off; }

access_log /data/wwwlogs/res.zhangge.net.log access;

}

这样就在本地新增了和主站共用一份数据的二级域名,只提供静态资源访问,其他访问都跳到主站对应页面。

完成新增后,只需要使用以前分享的七牛 CDN 代码或者 CDN 插件,将网站的静态资源替换为这个新二级域名,比如以前分享的纯代码版,加到 functions.php 即可完成替换:

/**

* WordPress CDN代码版 By 张戈博客

* 原文地址:http://zhangge.net/4905.html

**/

function QiNiuCDN(){

function Rewrite_URI($html){

$domain = ‘zhangge\.net’; //填写主站域名,小数点前需要加上反斜杠转义

$static = ‘res.zgboke.com’; //填写二级静态域名

//更多静态资源需要替换,可以将后缀加到后面的括号,使用分隔符分割

$html = preg_replace(‘/http(s|):\/\/’.$domain.’\/wp-([^"\’]*?)\.(jpg|png|gif|bmp|jpeg|css|js)/i’,’//’.$static.’/wp-$2.$3′,$html);

return $html;

}

if(!is_admin()){

ob_start("Rewrite_URI");

}

}

add_action(‘init’, ‘QiNiuCDN’);

完成部署后,我们网站的前台页面中的图片、js 等静态资源链接就全部换成了新的二级域名了。

Tips:其他部署方法

如果网站未启用 https,完全可以更简单,只需要在我们的主站 vhost 配置的 server_name 参数中新增一个域名即可,比如:

server_name zhangge.net res.zgboke.com;

当然,强迫症患儿们,还可以根据域名判断,来进行上述 Vhost 类似跳转,此处就不展开了。

同样的,对于虚拟主机来说,只需要在虚拟主机控制面板中新增一个二级域名绑定即可。但是这个方法不适用于 https 站点,因为一般的 https 证书并不能用于 2 个完全不一样域名。

文章来源:https://zhangge.net/5130.html

wordpress页面随机位置插入Adsense广告

该代码用于在循环内的随机位置输出adsense广告(或任何其他输出块),限制为预设数量的可能位置。

<?php $ad_positions = array(1,2,4); // array of preset possible ad positions

do { $rnd_ad = $ad_positions[rand(0,count($ad_positions)-1)]; } while ($rnd_ad >= $wp_query->post_count);

// to make sure that the random output fits into the available number of posts

?>

<?php if(have_posts()) : while(have_posts()) : the_post(); // start of the loop // ?>

some part of the post output here

<?php if( ($wp_query->current_post+1) == $rnd_ad ) : ?>

adsense code here

<?php endif; ?>

more post output here

<?php endwhile; endif; // end of the loop // ?>

WordPress 在文章随机段落中插入广告

WordPress 在文章随机段落中插入广告的实现方式很简单,只要把下面代码插入你主题的functions.php中即可实现(记得将:你的广告代码替换为你的广告内容)

add_filter( 'the_content', 'prefix_insert_post_ads' );

function prefix_insert_post_ads($content){

$pattern = "/<p>.*?<\/p>/";

$paragraph_count = preg_match_all($pattern,$content); //计算文章的段落数量

if($paragraph_count >= 8 && is_single()){//如果文章的段落数量少于8段,则不会插入文章段落广告

$paragraph_count -=2;

$insert_paragraph=rand(3,$paragraph_count);

$ad_code = '<div>你的广告代码</div>';

return prefix_insert_after_paragraph( $ad_code, $insert_paragraph, $content );

}

return $content;

}

// 插入广告所需的功能代码

function prefix_insert_after_paragraph( $insertion, $paragraph_id, $content ) {

$closing_p = '</p>';

$paragraphs = explode( $closing_p, $content );

foreach ($paragraphs as $index => $paragraph) {

if ( trim( $paragraph ) ) {

$paragraphs[$index] .= $closing_p;

}

if ( $paragraph_id == $index + 1 ) {

$paragraphs[$index] .= $insertion;

}

}

return implode( '', $paragraphs );

}

php获取远程图片并下载保存到本地

php获取远程图片并下载保存到本地的方法。收藏备忘

远程图片指的是远端服务器上的数据我们可以通过php的许多函数来读取下载了,这里整理了几个可以自动下载远程图片并下载保存到本地的方法。

方法1,可以自动识别图片类型然后进行对应的保存

/*

*功能:php完美实现下载远程图片保存到本地

*参数:文件url,保存文件目录,保存文件名称,使用的下载方式

*当保存文件名称为空时则使用远程文件原来的名称

*/

function getImage($url,$save_dir='',$filename='',$type=0){

if(trim($url)==''){

return array('file_name'=>'','save_path'=>'','error'=>1);

}

if(trim($save_dir)==''){

$save_dir='./';

}

if(trim($filename)==''){//保存文件名

$ext=strrchr($url,'.');

if($ext!='.gif'&&$ext!='.jpg'){

return array('file_name'=>'','save_path'=>'','error'=>3);

}

$filename=time().$ext;

}

if(0!==strrpos($save_dir,'/')){

$save_dir.='/';

}

//创建保存目录

if(!file_exists($save_dir)&&!mkdir($save_dir,0777,true)){

return array('file_name'=>'','save_path'=>'','error'=>5);

}

//获取远程文件所采用的方法

if($type){

$ch=curl_init();

$timeout=5;

curl_setopt($ch,CURLOPT_URL,$url);

curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);

curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);

$img=curl_exec($ch);

curl_close($ch);

}else{

ob_start();

readfile($url);

$img=ob_get_contents();

ob_end_clean();

}

//$size=strlen($img);

//文件大小

$fp2=@fopen($save_dir.$filename,'a');

fwrite($fp2,$img);

fclose($fp2);

unset($img,$url);

return array('file_name'=>$filename,'save_path'=>$save_dir.$filename,'error'=>0);

}

注意:当请求https的数据时,会要求证书,需要加上下面这两个参数,规避ssl的证书检查

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE );

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);

方法2,如果不是图片会自动跳过

<?php

function GrabImage($url, $filename = "") {

if ($url == ""):return false;

endif;

//如果$url地址为空,直接退出

if ($filename == "") {

//如果没有指定新的文件名

$ext = strrchr($url, ".");

//得到$url的图片格式

if ($ext != ".gif" && $ext != ".jpg"):return false;

endif;

//如果图片格式不为.gif或者.jpg,直接退出

$filename = date("dMYHis") . $ext;

//用天月面时分秒来命名新的文件名

}

ob_start();//打开输出

readfile($url);//输出图片文件

$img = ob_get_contents();//得到浏览器输出

ob_end_clean();//清除输出并关闭

$size = strlen($img);//得到图片大小

$fp2 = @fopen($filename, "a");

fwrite($fp2, $img);//向当前目录写入图片文件,并重新命名

fclose($fp2);

return $filename;//返回新的文件名

}

$img = GrabImage("//www.jb51.net /6648d73db0edd1e89f3d62f7.jpg", "");

if ($img):echo '<pre><img src="' . $img . '"></pre>';

//如果返回值为真,这显示已经采集到服务器上的图片

else:echo "false";

endif;

//否则,输出采集失败

?>

方法3:PHP下载远程图片

function downFile($url,$filename){
$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_CUSTOMREQUEST, ‘GET’ );
curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, false );
curl_setopt ( $ch, CURLOPT_URL, $url );
ob_start ();
curl_exec ( $ch );
$return_content = ob_get_contents ();
ob_end_clean ();
$return_code = curl_getinfo ( $ch, CURLINFO_HTTP_CODE );
$fp=@fopen($filename,”a”); //将文件绑定到流
if($fp){
fwrite($fp,$return_content); //写入文件}
return $filename;
}else{
return ”;
}

方法4:本地抓取远程图片资源

<?php
function getImage($url,$filename)
{
    # 1 若是图片资源地址为空,则无需往下进行
    if($url == “”){
        return false;
    }
    # 2 获取资源文件的后缀名且判断是否为合法资源
    if($filename === “”){
        $ext_name = strrchr($url, ‘.’);
        if($ext_name != ‘.jpg’ && $ext_name != ‘.tmp’ && $ext_name != ‘.gif’ && $ext_name != ‘.png’){
            return false;
        }
        # 将资源文件重新命名
        $filename = time() . $ext_name;
    }
    # 3 打开输出控制缓冲
    ob_start();
    readfile($url);
    $img_data = ob_get_contents();
    ob_end_clean();
    # 4 处理获取到的图片信息
    $size = strlen($img_data);
    $local_file = fopen($filename,’a’);
    fwrite($local_file, $img_data);
    fclose($local_file);
    return $filename;
}
$url = ‘http://www.offcn.com/statics/images/zgIT_wb.jpg’;
# 调用获取图片
$res = getImage($url,””);
if($res){
    echo ‘<script type=”text/javascript”>alert(“图片已扣下来”);</script>’;   
    return;
}else{
    echo ‘<script type=”text/javascript”>alert(“图片扒拉不到”);</script>’;
    return;
}
?>

file_get_contents函数也经常用来获取远程文件内容,包括下载图片,不过有时候file_get_contents有时候会返回为空或函数不可用。

附:file_get_contents返回为空或函数不可用的解决方案

function file_get_content($url) {
if (function_exists(‘file_get_contents’)) {
$file_contents = @file_get_contents($url);
}
if ($file_contents == “) {
$ch = curl_init();
$timeout = 30;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$file_contents = curl_exec($ch);
curl_close($ch);
}
return $file_contents;
}

WordPress检查一篇文章是否存在的方法

WordPress 两种方法 检查一篇文章是否存在,两个方法都需要先获取文章的id:

方法一:通过 get_permalink() 检测文章是否存在

if(get_permalink($post_id) === false){
    // 文章不存在后执行操作
}

方法二:通过 get_post_status() 检测

if(get_post_status($post_id) === false){
    // 文章不存在后执行操作
}

下面的方法其实和第二种方法一样,只是写法不同。

if (get_post_status($post_id)!== 'publish' ) {

@header("http/1.1 404 not found");
@header("status: 404 not found");
get_template_part(404);//返回404模板页面
exit;

}

get_post_status() 函数可用于检测当前文章或指定文章的状态,如果检测不到状态(即文章不存在)就返回false,也就实现了检查文章是否存在。

扩展:你也可以使用get_post_status() 函数来检测文章的状态来实现一些操作,可以返回的状态为:

你也可以使用它来检测文章的状态来实现一些操作,可以返回的状态为:

‘publish’ – 公开发布的文章或页面

‘pending’ – 待审文章

‘draft’ – 草稿

‘auto-draft’ – 最新自动保存的草稿,没有文章内容

‘future’ – 定时发布

‘private’ – 私密文章

‘inherit’ – 修订版本

‘trash’ – 在回收站中的

WordPress添加注册和登录用户名黑名单

WordPress添加注册和登录用户名黑名单实现代码(将下面代码加入主题的functions.php):

//注册登录检查
function dmeng_check_authentication($username){
    //用 | 分割用户名,且 | 前后不留空格
    $black_list = ‘admin|administrator|guest|root|test|tester’;
    if( !empty($black_list) ){
        $black_list = explode(‘|’, $black_list);
        if( in_array($username, $black_list) ){
            wp_die( __( ‘该用户名已被系统保留,不能用于注册或登录!’, ‘dmeng’ ), ”, array( ‘back_link’=>true ) );
        }
    }
}
add_action (‘wp_authenticate’ , ‘dmeng_check_authentication’);
add_action (‘register_post’ , ‘dmeng_check_authentication’);

以上的代码拒绝了 admin、administrator、guest、root、test、tester 这几个用户名的注册和登录动作,当然了,如果你只想拒绝登录,你可以把这行删掉:

add_action ('register_post' , 'dmeng_check_authentication');

如果你只想拒绝注册,你可以把拒绝登录这行删掉:

add_action (‘wp_authenticate’ , ‘dmeng_check_authentication’);

如果你想要注册黑名单和登录黑名单不一样,你可以分别调用两个不同函数。但是!请注意:在这个名单里的用户名都不能注册或登录,包括管理员(假如管理员用户名也在里面的话)。

建议给WordPress添加邮箱登录功能,然后把管理员用户名也加入黑名单,然后使用管理员邮箱登录,这样做的话,那些使用获取到的管理员用户名进行暴力破解的就全都被拒绝登录动作了!

资料来源:http://azfashao.com/wordpress-black-list/