存档

文章标签 ‘php’

PHP中错误处理

2012年2月9日 effect 没有评论

PHP提供了很多的错误等级,这里不一一罗列出来,有兴趣可以翻翻PHP的手册获取。本文主要是讲述在生产环境和开发环境中,错误的处理方式。

1 错误等级

在生产环境中建议 error_reporting(E_ALL ^ E_NOTICE) ,意义是除了notice,其他错误都会记录在案。

在开发环境中如果想严格控制错误,那么可以这样:error_reporting(E_ALL | E_STRICT); 这里几乎所有的错误都会记录,其实也可以和生产环境一致,notice不记录。

2 错误相关的配置(php.ini)

display_errors   是否展示错误,建议开发环境On,生产环境一定要Off,

log_errors  是否记录错误到日志文件中,建议开发环境On,如果你生产环境并发请求比较大,建议Off,当你生产环境出现莫名其妙的问题可以打开几分钟记录一下。

error_log   错误日志的文件路径,当log_errors为On的时候,出现错误的时候,会把错误记录到此文件中。

综上所述,建议在开发环境中如下配置

display_errors = On

log_errors = On

error_log = “/path/to/php/log/file”

生产环境中这样配置:

display_errors=Off

log_errors=Off   #当需要定位问题的时候,可以改为On

error_log = “/path/to/php/log/file”

3 自定义错误处理方式

有时候需要对错误进行更加高级的处理,那么可以使用函数set_error_handler。如set_error_handler(‘my_error_handler’),出现错误的时候会调用函数my_error_handler来处理,也可以这样set_error_handler(array(‘eobj’,'emethod’)),这样的话,出现错误会调用eobj对象中的emethod方法。这里要注意的是,如果你这样声明了自定义错误处理,那么如果你设置了日志记录的配置都不起错用,就是说出现错误了也不会记录到配置文件中的error_log中,当然如果错误是致命错误,编译都没通过,那就会记录到error_log中。

有时候需要自己主动抛出错误的时候可以使用trigger_error。想象某个场景,你提供的某个接口需要一个关键的参数,而调用人确没有给或者给的参数不符合要求,那么可以trigger_error(‘param $obj is not valid’);  更加详细的使用方法请参看手册

分类: php 标签:

为什么要用安全模式?

2011年8月1日 effect 没有评论

什么是安全模式?

为了解决一些共享服务器上的安全问题而设立的模式,有一些文件操作的属主检查和一些函数的限制等等。在一些ISP供应商提供的服务器上面,一台服务器往往运行了N个web site,所以为了保证每个站点以及操作系统的安全,这些服务器往往启用了安全模式。

有什么影响?

安全模式才初衷是为了保证操作系统的安全性以及各个web site的安全性。操作系统的安全性可以防止用户恶意的调用一些系统命令以及限制一些文件的访问,所以会限制了exec、system等函数有一个目录检查,如果执行的命令在safe_mode_exec_dir 下面才可以被允许执行。其次会限制一些文件操作的相关函数,比如fopen、mkdir、copy、unlink、link、rename、chown等,这里会检查被操作的目录或者文件是否与被执行的脚本有相同的 UID(所有者)。其他的影响请参看手册/安全/安全模式。

真的有用吗?

正如手册所说:在PHP这一层解决服务器的安全性问题,似乎不太靠谱。对于ISP提供商来说,启用安全模式是必须的,但是还需要其他的安全性限制,比如限制配置disable_functions、disable_classes,每个用户建立自己的执行账户等。而对于公司的服务器来说,没必要启用安全模式,但是代码的安全要严格查询,尤其是一些根据用户的输入来处理对应的文件,这一步要检查是否有漏掉导致引入了一个系统文件等。

分类: php 标签: ,

php性能测试工具:xhprof

2010年8月31日 effect 没有评论

以前最常用的工具是是xdebug加上Webgrind来检测,效果也不错。现在推荐另外一个工具:xhprof,facebook开源的工具。
最主要的是他提供了一个WEB方式的UI界面,提供的参数有:相应时间,内存占用,函数调用次数等,还有把每个函数调用的次数、执行时间和内存占用都有列出,让你一目了然,知道瓶颈在什么地方,看图说话:

请求总揽

函数调用情况

看到上面的效果是不是有点心动呢?开始进入正题。

安装

从pecl下载安装包,下载地址:http://pecl.php.net/get/xhprof-0.9.2.tgz

开始标准化的安装流程:

tar -zxvf xhprof-0.9.2.tgz
cd xhprof-0.9.2
/usr/local/php5.3/bin/phpize
./configure --with-php-config=/usr/local/php5.3/bin/php-config
make
make install

然后在你的php.ini加上:

extension=xhprof.so
[xhprof]
xhprof.output_dir=/data/tmp/ #日志文件保存路径

现在可以看看phpinfo();是不是已经有了xhprof的信息。到这里,安装就完成了。

应用

看官方推荐的标准例子:

// start profiling
xhprof_enable();
 
// run program
//这里就是你要检测的代码段,拿kohana为例,应该是:
require SYSPATH.'core/Bootstrap'.EXT;
// stop profiler
$xhprof_data = xhprof_disable();
 
//
// Saving the XHProf run
// using the default implementation of iXHProfRuns.
//
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php";
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php";
 
$xhprof_runs = new XHProfRuns_Default();
 
// Save the run under a namespace "xhprof_foo".
//
// **NOTE**:
// By default save_run() will automatically generate a unique
// run id for you. [You can override that behavior by passing
// a run id (optional arg) to the save_run() method instead.]
//
$run_id = $xhprof_runs->save_run($xhprof_data, "kohana");
 
echo "---------------\n".
     "Assuming you have set up the http based UI for \n".
     "XHProf at some address, you can view run at \n".
     "http://<xhprof-ui-address >/index.php?run=$run_id&source=kohana\n".
     "---------------\n";

这样每次访问这个脚本,都会在底部打印出类似这样的:————— Assuming you have set up the http based UI for XHProf at some address, you can view run at http:///index.php?run=4c7cd4869704f&source=kohana ————— 。这个是告诉你可以通过他的提供的工具来查看这次请求的分析结果,看第一步下载的xhprof-0.9.2解压后,里面有个文件夹xhprof_html,这里就是提供给我们看的工具。

查看结果
这里提供一个简单的方法,赋值xhprof_html和xhprof_lib到你的web目录,然后访问:http://your.domian/xhprof_html/index.php?run=4c7cd4869704f&source=kohana
是不是看到了和上面截图类似的界面,到这里就完成了。

查看资料:http://www.162cm.com/p/xhprofdoc.html

分类: php, 性能优化 标签: ,

yum install PHP 5.2

2010年8月1日 effect 没有评论
安装相应的GPG key# rpm –import http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka

新建一个repo

# /etc/yum.repos.d/utterramblings.repo

把以下内容添加进去,保存退出就OK了

[utterramblings]
name=Jason’s Utter Ramblings Repo
baseurl=http://www.jasonlitka.com/media/EL$releasever/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka

yum install php

分类: php, 服务器 标签: ,

PHP版本inet_aton

2010年8月1日 effect 没有评论
<?php
function inet_aton($ip){
$ips = explode('.',$ip);
$bin='';
foreach($ips as $i){
$i = decbin(intval($i));
$i = str_pad($i,8,'0',STR_PAD_LEFT);
$bin.=($i);
}
return bindec($bin);
}

实测通过
注:和函数ip2long得到相同效果

分类: php 标签:

一致性hash

2010年8月1日 effect 没有评论
function consistent_hash_key($key,$servers){
if(empty($servers)){
return false;
}
$hash_serv = array();
$hash_key = sprintf("%u\n",crc32($key));
foreach ($servers as $server){
$hash_serv[sprintf("%u",crc32($server))] = $server;
}
 
ksort($hash_serv,SORT_REGULAR);
 
if(count($hash_serv) == 1){
return array_pop($hash_serv);
}
$maxHash = pow(2,32);
foreach ($hash_serv as $k =&gt; $v){
if($hash_key &lt; $k){
return $v;
}
}
return array_shift($hash_serv);
}
 
for ($i=0;$i&lt;100;$i++){
echo consistent_hash_key('s:'.$i,array('a','b','c','d','e'))."\t";
echo consistent_hash_key('s:'.$i,array('a','b','c','d','e','f'))."\n";
}
分类: php 标签: