Archive for November, 2012

作者:AngryFox 分类: Uncategorized November 27th, 2012 暂无评论
/**
 *
 * 中文字符串截取
 * @param string $string
 * @param int $sublen
 * @param int $start
 * @param string $code
 */
function substr_zh($string, $sublen, $start = 0, $code = 'UTF-8') {
    if ($code == 'UTF-8') {
        $pa = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|\xe0[\xa0-\xbf][\x80-\xbf]|[\xe1-\xef][\x80-\xbf][\x80-\xbf]|\xf0[\x90-\xbf][\x80-\xbf][\x80-\xbf]|[\xf1-\xf7][\x80-\xbf][\x80-\xbf][\x80-\xbf]/";
        preg_match_all( $pa, $string, $t_string );

        if (count( $t_string[0] ) - $start > $sublen) return join( '', array_slice( $t_string[0], $start, $sublen ) ) . "...";
        return join( '', array_slice( $t_string[0], $start, $sublen ) );
    } else {
        $start = $start * 2;
        $sublen = $sublen * 2;
        $strlen = strlen( $string );
        $tmpstr = '';

        for($i = 0; $i < $strlen; $i ++) {
            if ($i >= $start && $i < ($start + $sublen)) {
                if (ord( substr( $string, $i, 1 ) ) > 129) {
                    $tmpstr .= substr( $string, $i, 2 );
                } else {
                    $tmpstr .= substr( $string, $i, 1 );
                }
            }
            if (ord( substr( $string, $i, 1 ) ) > 129) $i ++;
        }
        if (strlen( $tmpstr ) < $strlen) $tmpstr .= "...";
        return $tmpstr;
    }
}
作者:AngryFox 分类: Uncategorized November 27th, 2012 暂无评论
$ing = imagecreatetruecolor(700,410);
$red = imagecolorallocate($ing,255,0,0);
$yellw=imagecolorallocate($ing,255,255,45);

imagefill($ing,0,0,$red); 

$a = array(90,30,108,73,157,73,119,102,135,152,93,123,52,152,66,102,29,74,76,73,90,30);
imagefilledpolygon($ing,$a,10,$yellw);
$a1 = array(229,25,229,43,248,48,229,55,229,74,217,60,198,66,210,50,197,34,218,39,229,25);
imagefilledpolygon($ing,$a1,10,$yellw);
$a2 = array(227,108,227,127,245,134,228,139,227,157,215,143,196,149,208,132,196,117,215,122,227,108);
imagefilledpolygon($ing,$a2,10,$yellw);
$a3 = array(163,184,163,204,181,211,163,216,163,234,152,220,132,225,144,209,132,193,151,199,163,184);
imagefilledpolygon($ing,$a3,10,$yellw);
$a4 = array(65,209,65,228,84,235,65,240,65,259,54,245,33,249,46,233,34,217,53,224,68,209);
imagefilledpolygon($ing,$a4,10,$yellw);

header("Content-Type:image/jpeg");
imagejpeg($ing);
imagedestroy($ing);
作者:AngryFox 分类: Uncategorized November 27th, 2012 暂无评论

旋风专用链接
比较省事 普通下载地址直接通过base64编码 最后头部加上qqdl://

快车专用链接
普通下载地址头尾分别加入[FLASHGET]后通过base64编码 最后头部加上flashget://

迅雷专用链接
普通下载地址头部加入AA 尾部加入ZZ后通过base64编码 最后头部加上thunder://

$url = '专用下载链接';
$url = str_ireplace('thunder://','',$url);
$url = str_ireplace('qqdl://','',$url);
$url = str_ireplace('flashget://','',$url);//通过3个替换去除专用链的头部
$url = base64_decode($url);//对使用base64编码的数据进行解码
$url = str_ireplace('[FLASHGET]','',$url);
if(preg_match('/AA(.*)ZZ/',$url,$result))//通过替换及正则获得真实链接
{
    $result = $result[1];
}else{
    $result = $url;
}
echo $result;
作者:AngryFox 分类: Uncategorized November 27th, 2012 暂无评论

[PHP]

$getfilter="'|(and|or)\\b.+?(>|<|=|in|like)|\\/\\*.+?\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)";
$postfilter="\\b(and|or)\\b.{1,6}?(=|>|<|\\bin\\b|\\blike\\b)|\\/\\*.+?\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)";
$cookiefilter="\\b(and|or)\\b.{1,6}?(=|>|<|\\bin\\b|\\blike\\b)|\\/\\*.+?\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)";

function stop_attack($StrFiltKey,$StrFiltValue,$ArrFiltReq)
{
if(is_array($StrFiltValue))
{
$StrFiltValue = implode($StrFiltValue);
}
if (preg_match("/".$ArrFiltReq."/is",$StrFiltValue)==1){
slog("

操作IP: “.$_SERVER["REMOTE_ADDR"].”
操作时间: “.strftime(“%Y-%m-%d %H:%M:%S”).”
操作页面:”.$_SERVER["PHP_SELF"].”
提交方式: “.$_SERVER["REQUEST_METHOD"].”
提交参数: “.$StrFiltKey.”
提交数据: “.$StrFiltValue);
print “websec notice:Illegal operation!”;
exit();
}
}

function slog($logs)
{
$toppath = $_SERVER["DOCUMENT_ROOT"].”/log.htm”;
$Ts=fopen($toppath,”a+”);
fputs($Ts,$logs.”\r\n”);
fclose($Ts);
}

if($_REQUEST)
{
foreach($_REQUEST as $key=>$value)
{
stop_attack($key,$value,$getfilter);
}
}

[/PHP]

作者:AngryFox 分类: Uncategorized November 27th, 2012 暂无评论
/usr/local/mysql/bin/mysqldump -u root -p'密码' platlib k_special_song > k_special_song.sql
sftp -oPORT=端口号 113.106.27.243

[root@Kgnewsql01 ~]# sftp -oPORT=37212 113.106.27.243
Connecting to 113.106.27.243...
root@113.106.27.243's password: 输入密码
sftp> get k_similar.sql
Couldn't stat remote file: No such file or directory
File "/root/k_similar.sql" not found.
sftp> put k_similar.sql
另一台机:
 /root/mysql-5.5.3-m3/client/mysql -u root -p'密码'
use platlib;
soure k_class_song.sql
导入已经OK
作者:AngryFox 分类: Uncategorized November 26th, 2012 暂无评论

编译redis 2.6报错: zmalloc.o: In function zmalloc_used_memory’:

/home/xx/redis-2.6.2/src/zmalloc.c:223: undefined reference to__sync_add_and_fetch_4′
collect2: ld 返回 1
make[1]: *** [redis-server] 错误 1
make[1]: Leaving directory `/home/xx/redis-2.6.2/src’
make: *** [all] 错误 2

google了下找到解决方法.

在src/Makefile开头加 CFLAGS= -march=i686
编辑src/.make-settings里的OPT,改为OPT=-O2 -march=i686。
Make 32bit,但是接下来又过不了,报错如下
You need ‘tclsh8.5′ in order to run the Redis test
需要tcl.
rpm –ivh tclsh-xxxx.rpm

tar zxvf tcl8.5.11-src.tar.gz
cd tcl8.5.11/unix/
./configure
/// 貌似不需要了 –prefix=/opt/software/tcl8.5.11-install
make
make install
/// cd /opt/software/tcl8.5.11-install
/// 复制tclsh8.5到/usr/bin
/// cp bin/tclsh8.5 /usr/bin/

最后运行redis
cp /root/redis-2.6.5/redis.conf
./src/redis-server redis.conf
安装完可以了.

补充: 运行 src/redis-server ,置于后台工作: src/redis-server &

linux 下 redis php 的安装

安装步骤:

下载redis php扩展 : https://github.com/owlient/phpredis/downloads

# wget https://github.com/owlient/phpredis/tarball/master

# mv master redis-php.tar.gz

# tar -zxvf owlient-phpredis-2.1.1-1-g90ecd17.tar.gz

# cd owlient-phpredis-90ecd17

# /usr/local/php/bin/phpize

# ./configure

# make && make install

编译结果:

Build complete.
Don’t forget to run ‘make test’.

Installing shared extensions: /usr/lib/php/modules/

# vim /etc/php.ini

在最后一行加入: extension = redis.so

# service httpd restart

从下面的下载地址找个最新的

https://github.com/owlient/phpredis/downloads

如果使用Centos自带php则确保php-devel安装

否则执行: yum install php-devel -y

如果是源码编译安装则在安装目录的bin/phpize

如:/usr/php/bin/phpize

注意这里的phpize 可能不有所不同,可使用下面方式查到phpize 所在位置:

[root@localhost owlient-phpredis-90ecd17]# phpize –help
Usage:/usr/bin/phpize [--clean|--help|--version|-v]

作者:AngryFox 分类: Uncategorized November 20th, 2012 暂无评论

Gevent是一个基于greenlet的Python的并发框架,以微线程greenlet为核心,使用了epoll事件监听机制以及诸多其他优化而变得高效。
于greenlet、eventlet相比,性能略低,但是它封装的API非常完善,最赞的是提供了一个monkey类,可以将现有基于Python线程直接转化为greenlet,相当于proxy了一下(打了patch)。
1.安装
安装python工具包,在centos上,yum install python-setuptools
Gevent依赖libevent和greenlet,需要分别安装。
安装依赖包: yum -y install libevent-devel
yum -y install python-devel

#easy_install
wget -q http://peak.telecommunity.com/dist/ez_setup.py
python ./ez_setup.py

#greenlet
wget http://pypi.python.org/packages/source/g/greenlet/greenlet-0.3.1.tar.gz#md5=8d75d7f3f659e915e286e1b0fa0e1c4d
tar -xzvf greenlet-0.3.1.tar.gz
cd greenlet-0.3.1/
python setup.py install

#gevent
wget http://pypi.python.org/packages/source/g/gevent/gevent-0.13.6.tar.gz#md5=7c836ce2315d44ba0af6134efbcd38c9
tar -xzvf gevent-0.13.6.tar.gz
cd gevent-0.13.6/
python setup.py install

2.测试代码:XML-RPC

from gevent import pool
g = pool.Pool()
def a():
        for i in xrange(100):
                g.spawn(b)
def b():
        print 'b'
g.spawn(a)
g.join()
作者:AngryFox 分类: Uncategorized November 19th, 2012 暂无评论

php-fpm.conf有两个至关重要的参数:
一个是”max_children”,
另一个是”request_terminate_timeout”
两个设置的值一个是”40″,一个是”900″,但是这个值不是通用的,需要自己计算的。

计算的方式如下:
如果你的服务器性能足够好,且宽带资源足够充足,PHP脚本没有系循环或BUG的话你可以直接将”request_terminate_timeout”设置成0s。0s的含义是让PHP-CGI一直执行下去而没有时间限制。而如果你做不到这一点,也就是说你的PHP-CGI可能出现某个BUG,或者你的宽带不够充足或者其他的原因导致你的PHP-CGI能够假死那么就建议你给”request_terminate_timeout”赋一个值,这个值可以根据你服务器的性能进行设定。一般来说性能越好你可以设置越高,20分钟-30分钟都可以。由于我的服务器PHP脚本需要长时间运行,有的可能会超过10分钟因此我设置了900秒,这样不会导致PHP-CGI死掉而出现502 Bad gateway这个错误。

而”max_children”这个值又是怎么计算出来的呢?这个值原则上是越大越好,php-cgi的进程多了就会处理的很快,排队的请求就会很少。设置”max_children”也需要根据服务器的性能进行设定,一般来说一台服务器正常情况下每一个php-cgi所耗费的内存在20M左右,因此我的”max_children”我设置成40个,20M*40=800M也就是说在峰值的时候所有PHP-CGI所耗内存在800M以内,低于我的有效内存1Gb。而如果我的”max_children”设置的较小,比如5-10个,那么php-cgi就会“很累”,处理速度也很慢,等待的时间也较长。如果长时间没有得到处理的请求就会出现504 Gateway Time-out这个错误,而正在处理的很累的那几个php-cgi如果遇到了问题就会出现502 Bad gateway这个错误。

max_requests即是说每个进程若超过这个数目(跟php进程有一点点关系,关系不大),就自动杀死..我这里应该设置512的,不过懒得压力测试了,设置大一点,不过也不要设置过大,是个结构体,没测试过,接近8K到9K大小.网上动辄设置100k,有点浪费内存了.一个进程浪费大小接近1M.按照网上常用配置的128个进程,大概浪费100M左右.好吧,我承认100M是白菜价,但也别这样浪费..= =

max_children基本就是进程数,跟nginx的进程没有想象中的那么大,因为FPM会自己管理进程(有待考证,起码我简单浏览了一下源码,认为是这个意思).参数不宜设置过大,很占内存,进程的消耗就不用我多说了.

max_children较好的设置方式根据req/s来设置,若程序是 100 req/s的处理能力..最大并发是10K,那么就设置 100比较好,这是动态来调整的.

不过你若用php 5.3,也可以把style设置为apache-like,那么设置start_servers,min_spare_servers,max_spare_servers三个参数就可以自动调整
很简单,具体看配置文件,这样的设置之后,在高负载和复杂的php程序会省事一点,毕竟测试req/s是可恶的体力活.

作者:AngryFox 分类: Uncategorized November 19th, 2012 暂无评论
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

# Check if user is root
if [ $(id -u) != "0" ]; then
    echo "Error: You must be root to run this script, please use root to install lnmp"
    exit 1
fi

nv=`/usr/local/nginx/sbin/nginx -v 2>&1`
old_nginx_version=`echo $nv | cut -c22-`
#echo $old_nginx_version

if [ "$1" != "--help" ]; then

#set nginx version

nginx_version=""
echo "Current Nginx Version:$old_nginx_version"
echo "Please input Tengine version you want:"
echo "You can get version number from http://tengine.taobao.org/download.html"
read -p "(example: 1.2.1 ):" nginx_version
if [ "$nginx_version" = "" ]; then
echo "Error: You must input Tengine version!!"
exit 1
fi
echo "==========================="

echo "You want to upgrade Tengine version to $nginx_version"

echo "==========================="

get_char()
{
SAVEDSTTY=`stty -g`
stty -echo
stty cbreak
dd if=/dev/tty bs=1 count=1 2> /dev/null
stty -raw
stty echo
stty $SAVEDSTTY
}
echo ""
echo "Press any key to start...or Press Ctrl+c to cancel"
char=`get_char`

echo "============================check files=================================="
if [ -s nginx-$nginx_version.tar.gz ]; then
  echo "Tengine-$nginx_version.tar.gz [found]"
  else
  echo "Error: Tengine-$nginx_version.tar.gz not found!!!download now......"
  wget -c http://tengine.taobao.org/download/tengine-$nginx_version.tar.gz
  dl_status=`echo $?`
  if [ $dl_status = "0" ]; then
echo "Download Tengine-$nginx_version.tar.gz successfully!"
  else
echo "WARNING!May be the Tengine version you input was wrong,please check!"
echo "Nginx Version input was:"$nginx_version
sleep 5
exit 1
  fi
fi
echo "============================check files=================================="

rm -rf tengine-$nginx_version/

tar zxvf tengine-$nginx_version.tar.gz

echo "Press any key to start...or Press Ctrl+c to cancel"
char=`get_char`

cd tengine-$nginx_version/
./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-ipv6
make

mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
cp objs/nginx /usr/local/nginx/sbin/nginx
/usr/local/nginx/sbin/nginx -t
make upgrade
echo "Upgrade completed!"
echo "Program will display Nginx Version......"
/usr/local/nginx/sbin/nginx -v
cd ../

echo "========================================================================="
echo "You have successfully upgrade from $old_nginx_version to $nginx_version"
echo "========================================================================="
fi

以上脚本保存为upgrade_tengine.sh

chmod +x ./upgrade_tengine.sh
./upgrade_tengine.sh 
作者:AngryFox 分类: Uncategorized November 9th, 2012 暂无评论

一、const
在编程中,我们一般用常量来定义那些在运行时不能被改变的常数值,下面让我们来看看php中的const吧。在定义一个常量的时候我们可以使用const来修饰这个常量,使用const修饰的常量更其它的常量有点不同的地方就是:常量名前不要使用”$”,切记!当然这个常量值也是不能修改的,一旦定义就不能程序的任何地方进行“人为”的修改。这跟使用 define定义是一样,还有就是使用const来定义当然也遵守其它常量的命名规则――使用大字的字母。

看个小例子吧:
class say_const{
const CHARSET = "中国";
public function say_hello(){
echo slef::CHARSET;
}
}
$const1 = new say_const();
$const1->say_hello();

作为其它要说明的,请看下面这个扩展阅读:
常量前面没有美元符号($);
常量只能用 define() 函数定义,而不能通过赋值语句;
常量可以不用理会变量范围的规则而在任何地方定义和访问;
常量一旦定义就不能被重新定义或者取消定义;
常量的值只能是标量;
常量只能包含标量数据(boolean,integer,float 和 string),不要定义 resource常量.
可以用函数 constant() 来读取常量的值.get_defined_constants()可以获得所有已定义的常量列表.
如果使用了一个未定义的常量,PHP 假定想要的是该常量本身的名字,如同用字符串调用它一样(CONSTANT 对应 “CONSTANT”),此时将发出一个 E_NOTICE 级的错误.

PHP 的“魔术常量”.
__LINE__
__FILE__
__FUNCTION__
__CLASS__
__METHOD__

在面向对象中
接口:
1 不能够定义静态变量在类的 成员变量(常量除外)
2 定义的常量 const YOUCONST = VALUE,不能在子类中覆盖,在子类中以 interfaceName::YOUCONST的方式调用
3 不能使用parent::YOUCONST的方式调用接口的常量

类:
1 const 变量可以使用parent::YOUCONST的方式,className::YOUCONST的方式在子类中访问
2 const定义的变量,在子类中可以被覆盖
3 当然在类中可以定义静态成员变量了

二、define
什么是自定义常量?

所谓自定义常量,就是指用一个字符标识来代表另外一个对象,这个对象可以是一个数值,一个字符串,一个布尔值等等。它的定义与变量有着许多相似之处。只有一点不一样,那就是变量的值在程序运行过程中可以任意更改,而自定义常量一旦定义下来后,在程序运行中就再也不能修改了。
定义方式如下:
define(“YEAR”,”2012″);
使用define关键字来将2012这个字符串绑定到YEAR上来,以后在程序当中出现YEAR的地方就用2012来代替。一般情况下,我们定义常量时,常量名都使用大写字母。例,
define("YEAR","2012");
define("MONTH","12");
define("DATE","21");
define("THING","Doomsday");
echo YEAR."-".MONTH."-".DATE." ".THING;
?>

三、static
static关键字在类中是,描述一个成员是静态的,static能够限制外部的访问,因为static后的成员是属于类的,是不属于任何对象实例,其他类是无法访问的,只对类的实例共享,能一定程序对该成员尽心保护。类的静态变量,非常类似全局变量,能够被所有类的实例共享,类的静态方法也是一样的,类似于全局函数。类的静态方法能访问类的静态的属性。另外说明的是,static的成员,必须使用self来访问,使用this会出错。

static变量与局部变量的区别是,当静态变量离开了它的作用范围后,它的值不会自动消亡,而是继续存在,当下次再用到它的时候,可以保留最近一次的值。