
PHP
HopingWhite
这个作者很懒,什么都没留下…
展开
-
php的file_set_contents导致的一个系统主线问题
周六的时候线上服务器有些脚本执行出现问题,后来调查了半天终于在mail里发现了crontab执行时报一个bus error造成问题的原因,初步分析是因为多个php脚本同时写入一个文件,数据大概在2.6M左右,于是就导致了buss errorfile_put_contents第三个参数可以指定是否需要写锁,照这个情况来看,一般情况下还是需要写锁的原创 2013-01-28 14:37:16 · 3260 阅读 · 0 评论 -
php过载后无法恢复的原因分析
最近php机器频繁出现过载后再也无法提供服务的现象,只要一有请求发过去,负责处理该请求的php进程就是cpu占用100%。本来的负载均衡策略是一旦某机器的php请求出现连接超时就将该机器的权重降低,发向该机器的请求概率就会降低,虽然有一定滞后效应,但是最终应该能够降压并且最后恢复服务,但是这个策略在最近突然失效了。出现这个情况之后无法发送什么请求到php-fpm都会cpu100%,即使请求的是一个原创 2013-01-11 12:01:36 · 2045 阅读 · 0 评论 -
php中重载数组操作符
在php中提供了许多接口用于实现一些很特定的功能,比如你想把一个对象当作array使用时,只需要实现ArrayAccess接口,当你想要foreach中能够使用一个对象时,只需要实现Iterator接口,下面给一个例子出来class BtstoreRoot{ /** * 根结点 * @var BtstoreElement */ static $root;}cl原创 2013-01-06 11:45:13 · 2523 阅读 · 0 评论 -
php的又一深坑
请大家看如下代码,并猜想结果会是什么样的? $arrData = array ( 'va_info' => array (array ('position' => 290, 'item' => 70009 ), array ('position' => 290, 'item' => 7000原创 2012-01-18 18:03:56 · 1316 阅读 · 0 评论 -
php中一个诡异bug
$data = array('server' => false);echo $data['server']["test"]; 请问这一句怎么样?有人可能会说NULL并且NOTICE undefined index "test"一开始我也这样以为,但是实际上并不是这样,NULL是会输出,但是NOTICE并没有产生,这实在是一个坑爹的实现呀原创 2011-12-21 15:03:34 · 841 阅读 · 0 评论 -
解决php加载慢的一个办法
这几天在测试我们目前的php框架时发现,框架层加载php文件的时间很长,最终发现是因为各种require_once导致整个加载时间变长,如果不使用eaccelerator的情况下,在虚拟机上测试可能会到50-60ms,使用了ea之后,可以降到10-20ms,但是这个消耗还是比较大的,有什么办法可以解决吗?正好这两天看到hiphop的文章,所以决定使用它来试一下,最终发现代价太大了,修改一个文件原创 2011-12-17 13:47:54 · 7818 阅读 · 1 评论 -
专用于php存储大数据量配置的扩展
以前有写过一篇如何实现一个处理php中需要加载大数据量配置文件的一个文章,最近开始玩git,于是整理了一下把它发到github上去了,有需要的同学可以去看看https://github.com/lazytiger/btstore另外之前的写的关于这个扩展实现的文章地址如下:http://blog.youkuaiyun.com/hopingwhite/article/details/6310原创 2011-12-06 16:56:12 · 2006 阅读 · 0 评论 -
又发现amfext的几处内存泄漏的bug
amfext的bug已经不知道发现第几次了,这次的bug主要是在使用脚本进行压力测试时发现程序内存会一直增长,最终定位到amfext,如果是以php-cgi方式运行的话,一次请求不会有多次amf_encode和amf_decode调用,因此问题不是很大,因为amfext遵守了php扩展的开发方法,使用了emalloc来分配 内存,因此在RSHUTDOWN时会自动清理,但是如果是用脚本的话,程序很快原创 2011-12-01 13:50:39 · 2921 阅读 · 1 评论 -
又一个amfext的bug
今天又发现一个amfext的bug,请看如下数据结构array ( 'va_player_login' => array ( 0 => '=', 1 => array (原创 2011-10-26 17:00:47 · 1164 阅读 · 0 评论 -
将socks代理转换成http代理
今天遇到一个很蛋疼的需求,我有一个在国外的服务器,通过ssh -D可以在本地生成一个socks5代理,但是我要访问一个国外的bt网站,它的tracker连接都只能用代理,而且它只能使用http代理,因此我需要用socks代理来生成一个http代理,怎么搞呢?在网上找了一圈,查看squid等是否有相应的功能,结果发现都不是很靠谱。最后想来想去觉得我只要有php有curl有nginx就完全能自己搞定这原创 2011-10-25 19:37:51 · 7278 阅读 · 2 评论 -
利用php中的buffer control来控制输出
php-cgi中如果直接echo,那么会当作页面内容输出,而有时候我们需要对这些输出内容进行处理,那怎么办呢,可以利用Output Control函数来处理也就是以ob_开头的所有函数,比如我们在某个点之前不希望它输出可以先调用ob_start,然后在那个点调用ob_end_原创 2011-10-12 11:19:54 · 949 阅读 · 0 评论 -
amfext的一个bug
昨天遇到一个amfext会core的问题,一开始以为是自己的php代码写的有问题,后来仔细看了一下core的地点,结果发现似乎是amfext的一个bug,它在MAKE_STD_ZVAL之后没有对zval的type进行初始化,而接下来的操作中立即使用了这个type,如果type=5则调用HASH_OF,一般情况下这句是不会有错的,因为它实际上是从某个数组中取数据出来,并且这个结果也不会修原创 2011-09-01 09:39:04 · 2017 阅读 · 3 评论 -
php中持久化存储模块开发总结
在项目中发现经常有这种需求,需要加载一些大的固定的格式化数据,比如对战中的一些技能数据,物品等。这些数据都是只读数据,并且可能会比较大,目前来看大约有上万条复杂数据,如果serialize的话,纯文本有20M左右。尝试过直接放一个array在php文件里,结果发现require这个文件很耗时,可能会花费几十ms的时间,并且这个时候io很重,因为需要加载几十m数据到内存;另外去调研了一下sqlite,这个东西还算比较靠谱,但问题在于,比如写操作函数,使用起来很不爽;于是就产生了自己写一个扩展的想法。于是折腾之原创 2011-04-08 18:08:00 · 2725 阅读 · 0 评论 -
sqlite与array
<br />今天大概测试了一个使用sqlite和array来存储大数组情况下的性能,100000条大约20m的php文件的array数据,再做一个随机取其中1000个记录,sqlite是18ms,而array的时间大概在几s,由于时间太长了,我没有具体做完。当条数降到10000条的时候,array会降到6ms,这个基本上是加载array的时间了,而sqlite在14ms左右。50000条两个的响应时间基本一致了。<br /> <br />因此看来在存储较大数据的时候,sqlite会是一个比较好的选择。但是还原创 2011-04-06 23:17:00 · 3392 阅读 · 0 评论 -
php的foreach修改
在php里的foreach($data as $key => $value)这种,在开始foreach之前,$data其实被分离了,所以这个循环会完全结束,不管中间对这个数组做了什么修改原创 2010-10-13 16:17:00 · 2155 阅读 · 0 评论 -
apache的FastCGIExternalServer配置
看apache的官方文档上FastCGIServer配置如下FastCGIServer filenmae host:port其中filename不一定是在本地,当请求的url被判断与filename相匹配时(完全一样)时,请求会被通过端口发给指定的机器的filename.其实cgi方式和mod_php方式的不同在于,mod_php是将访问的php文件当作可执行文件来运行,所以它直接运行任何文件,也即可以有多个入口,而fastcgi则不同,它只地将请求发给一个入口php文件,由这个文件进行转发。原创 2010-09-07 23:03:00 · 4047 阅读 · 0 评论 -
单独编译一个Php扩展
<br />利用Phpize在那个扩展下执行,然后就会生成一个configure,接下来的工作就跟普通编译没啥区别了。原创 2010-08-24 11:36:00 · 989 阅读 · 0 评论 -
php中的error_handler
一般我们为了捕获php的错误,需要自己设置error_handler,但是,如果error_handler里出错了,可能会形成递归调用。事实上这个问题根本不存在,因为php在出错以后调用了zend_error函数,然后这个函数里会判断EG(user_error_handler)是否存在,如果存在则用call_user_function_ex来调用用户方法,而在此之前,它会先将EG(user_error_handler)设置为null,这样一来如果出错的话,则不会递归进入call_user_function_原创 2010-08-12 21:03:00 · 1335 阅读 · 0 评论 -
又一个php的error_handler引起的诡异问题
今天又发现一个很诡异的php问题,明明有个类在代码里写了被加载,总是报错说没有找到,错误日志也没有其他的信息。想来想去觉得很可能还是error_handler被重置导致的,因为代码是在phpunit里执行的,因此要确认很简单,在test方法之前执行一句reset_error_handler,然后再执行,看报错信息。果然报错信息不一样了,这回说的是LIB_ROOT这个常量没有定义。回头再来看这个过程是什么样的呢?很显然,require那个文件之后,由于LIB_ROOT不存在,因此报错了,报错到error_ha原创 2010-08-05 10:45:00 · 1074 阅读 · 0 评论 -
利用php中的eval来模拟java中的动态代理
使用java中的动态代理可以完成很多事情,比如将业务实例进行托管,实现AOP等,但是Php中没有实现这样的东西,昨天突然想到其实可以通过eval来模拟一个动态代理机制。php比java不同的是,php是不需要编译的,因此只要我们能够动态生成一段代码,然后用eval来执行就可以达到效果。代码如下:/** * 代理实现类 */interface IInvocationHandler原创 2010-04-28 10:44:00 · 1440 阅读 · 0 评论