在 Linux 下通过 strace 与 lsof 命令排查 PHP 异常进程

在有些时候,会遇到PHP进程异常卡死的情况。面对这种情况,首先考虑到的就是分析代码进行优化改进,或者重启进程。但是,这种方式来排查不一定能找到根本原因。因为有些时候异常PHP进程卡死的原因可能是非常奇葩的问题,比如外部资源异常如DB、Redis与第三方API等。上一次关于超级话题签到提醒定时任务PHP进程异常的处理,问题竟然出现在外部的DB的链接上。由于网络原因导致读取DB没有响应卡死。这一次情况比较严重,超级话题积分系统的计算有一部分是通过Trigger(类似队列)接受全站数据进行积分计算与入库。由于用户反馈问题,来到队列机查看进程情况。如下$ ps -ef | grep Trigger | grep Commenwww 10693 1 7 16:06 ? 00:04:09 /usr/local/bin/php /path/cli.php request_uri=/Cli/Trigg... Read More

自从有了她,再也不怕断签了:超级话题签到提醒

前言在解决了上一次关于超级话题积分bug后,又接到超级话题签到提醒的产品需求。这是一篇偏于技术实现的文章,讲述的比较笼统,业务围绕超级话题的签到提醒进行展开。如果,您对超级话题签到提醒的技术背景与实现感兴趣,那么这篇文章希望对你有帮助。当然,如果你是某个超级话题的超级粉丝,比如鹿晗,张艺兴,但是发现断签了。那么我非常替你感到“痛心”,因为目前超级话题没有补签功能。当然,如果你觉得是因为系统问题导致没有连续签到,那么你可以通过超级话题的官方反馈方式进行反馈来解决问题。当然,我劝你这么做之前一定要三思。因为,通过我排查的经验而言,基本山是由于你们(用户)把时间搞错了,而导致没有续签。而且,目前的签到提醒功能会在每天晚上提醒你签到的哦产品最近,在忙活超级话题的签到提醒产品的开发。首先,这是第一次比较热切的关注用户反应的产品。虽然说,对于产品的参与和认知并没有多么深入的理解,但是愈发的觉得这件事... Read More

PHP 的 Traits:到底是祸害还是好得飞起?

在 2012 年 3 月初,PHP 团队宣布了 5.4 版本的发布。程序员们对这次的发布已期待许久,因为这一次的升级带来了很多特性的加入。其中,最受追捧的是 Traits。为了构建这次发布的版本,Shammer C 特意为此撰写了一篇文档:如何使用 PHP 的 Traits,我强烈的建议您在读这篇文章之前拜读一下,因为这篇文章需要读者能够对 Traits 有一定的基础了解。Traits 已经被 PHP 社区广泛的接受,最为关键的是因为它包含了其他 Java、C++ 和 Python 编程语言的特性。除此之外,Traits 也被广大的网友们神化了。那些程序员狂砍这种特性将给他们的项目带来多么大的益处,尤其指出它是能够替代面向对象(OOP)继承的特性。然而,Traits 真的有那么神奇么?难道真的能对 PHP 开发有所促进么?还是败絮其中呢?PHP 的 Traits 是个祸害从表面上来看,由于... Read More

基于 libgit2 C 语言库的 php-git 扩展 fix bug 辛酸史

前言这是一篇极其没有节(nei)操(rong)的文章。除非你真的无聊,请不要阅读,否则后果自负正文最近,在忙活微博话题组的日构建工具。工具主要的功能并不算复杂。写着写着,外面雨过天晴,居然还放起爆竹了,什么鬼。构建工具的主要功能正如介绍中所述的那样,提取产品、测试等基本信息、提取版本库(git)信息、检查(编译)源文件、自动部署项目与发送邮件等。在提取 git 库信息时,相对于之前利用 shell_exec PHP 原生函数提取 svn 信息的方式,打算利用扩展来提取信息。一来更规范、更有效率(微乎其微),二来专业。缺点是相对而言部署环境麻烦,因为需要安装 git 扩展到当前 php 运行环境中来。但是,万万没想到官方推荐的 php-git 扩展库开发版本已有3年没有维护了。索性用吧,又能怎样。安装还算顺利,由于公司开发机没有 cmake,yum 源也不可用,懒得配置,直接 downlo... Read More

关于“如何开发 PHP 扩展”的学习小结

近期,工作上的业务并不是很忙。做了大半年的业务逻辑,尽管在 PHP 编码习惯和技巧上有所进步,初步熟悉了在高并发下 Redis 和 Memcache 缓存的使用和注意事项。但,应该借此闲暇时间探索下 PHP 底层的一些原理。这样,才是会有质的提升,写出更好的代码。正如那句话“PHP 取得成功的一个主要原因之一是她拥有大量的可用扩展”,那就从 PHP 扩展入手了解下。在此之前,大家肯定都了解“PHP 是 C 写的”。于是打开了 PHP 的源码,列出跟目录列表如下图PHP(5.6.4)跟目录列表看到了熟悉的以后缀 .c 结尾的源文件。如图,有个名为“Zend”的文件夹很重要,这个就是 PHP 的核心。于是在网上搜到了两个若干 PHP 扩展的教程http://www.laruence.com/2009/04/28/719.htmlhttp://www.walu.cc/phpboo起初,耐心... Read More

PHP 数组函数 array_diff()、array_merge() 与数组操作符 +

array_diff() 函数是以值为判断依据,比如<?use Libs\Helper;include '../vendor/autoload.php';$a = array(0 => '1760', 1 => '1199', 2 => '4188', 3 => '1552', 4 => '6388',);$b = array(1760, 9999, '8999');Helper::p(array_diff($a, $b));Helper::p(array_diff($b, $a));输出Arra[1] => 1[2] => 4[3] => 1[4] => 6Arra[1] => 9[2] => 8同样,array_merge 函数也是以值为判断依据进行合并数组,如下<?use Libs\Helper;include '../ven... Read More

利用 xhprof(PHP)扩展进行 WEB 性能分析

最近工作有些小忙,经常加班,偶尔还会通宵。但最终热门微博“混合流”顺利地全量上线了。可是,从性能角度来说,还是有不少的提升空间的。下面说下利用 xhprof 来进行 WEB 性能的分析。安装 xhprof 扩展官方的文档胜过一切 => http://php.net/xhpro注意:如果想利用 xhprof 绘图,那么需要将系统默认禁用函数打开。;disable_functions = phpinfo,system,exec,shell_exec,passthru,proc_close,show_sourc部署xhprof的运行环境经过上面的配置,在你跑过项目后,xhprof 会输出一份报告文件。不过,这份文件的内容是被序列化的数组。所以,需要搭建一个能够读取该数据文件的 WEB 环境。这里给一份 xhprof 环境的代码:http://pan.baidu.com/s/1bnLvmr之后通过访问 xhprof 的环境,你会看到如下报告界面。... Read More

高并发场景下的缓存使用误区

十一聚会,某谈及人生理想。我要的是“地位,身份和爱情!”,其实就是金钱,面子和美女。O.正文9月份,连续两天(AB 两天)线上出现业务故障,redis 监控曲线瞬间上涨。业务场景:一千万 UV / 日redis监控曲线(修改图片好麻烦,曲线意会下吧~)redis日志业务代码<?(self::$_debug) ? Helper_Log::writeApplog('newFeatureOfMixedFeed', "初始化配比数据.") : null;if (self::$_redisDb == null) self::$_redisDb = new Comm_Redisdb(self::REDIS_SERVER);/** 判断是否有缓存数据 **$total = self::$_redisDb->lSize(Conf_Sailmixfeed::REDIS_CONF_RAT... Read More

微信支付 JSAPI 开发中的问题

前言:这篇文章讲的是利用微信官方提供的 JSAPI 接口,实现微信网页支付。希望在看之前,要确认以下几件事情,否则会在解决问题时很费解。① 接口文档版本号是 V3.3(在官方提供的 PHP DEMO 中的 README.txt 文件中查看。当然,也可以参考压缩包的名字(wxm-payment-biz-api218f8e.zip)来确认版本② 微信支付 PDF 文档的版本为 V3.3.7(如果上述版本对了,这步应该也是一致的,因为这两个文件是在一个包里③ 该文章说的是 JSAPI 的开发简单看了下微信支付的文档和源码(压缩包名:wxm-payment-biz-api218f8e.zip;PDF 文档名:【微信支付】微信公众号支付接口文档V3.3.7.pdf;)。然后,修改了微信的配置文件。有如下几个配置项值得注意1、 MCHI注释是“受理商 ID,身份标识”。可以在邮件中查看,这个邮件... Read More