没注意运算符优先级(漏掉括号)导致的一个 BUG

昨天新上线的一个项目,换了 $_SESSION 的处理方式。代码中有这样一条 SQL

$expiration = 1440 // <---- 这个在别的地方定义的
$sql = 'DELETE FROM session WHERE last_activity < ' . time() - $expiration;

线上代码运行过程不停的 warning ,说 SQL 语句执行出错,出错语句为 “-1440”,找了很长时间都没找到这个 BUG,后来终于找到那个 SQL  语句:

// 运行这一行语句,你会得到 -1400,而不是我们想要的 SQL 语句
echo 'DELETE FROM session WHERE last_activity < ' . time() - 1440;

为什么会是这样呢,因为字符串链接符 . 的优先级比运算符 – 要高,前面那一串先和 time() 返回的数字连成一个字符串,然后再与 1440 做减法运算,前面的一串字符串强制转换为数字 0,然后减 1440,就得到了 -1400,然后错误就出现啦。找到问题就好解决了,加上括号便 OK。

$expiration = 1440 // <---- 这个在别的地方定义的
$sql = 'DELETE FROM session WHERE last_activity < ' . (time() - $expiration);

话说这类错误很不好发现啊,项目里面那么多地方运行 SQL 查询,哪知道是哪里出错的呢。

看来有必要在 Log 里面里面记录函数调用栈,这样才能知道是哪里出错,能快速定位 BUG。

PHP CLI 模式输出彩色字符串

最近在写公司后台脚本程序代码。想到可以将不同的提示信息标注为不同的颜色,比如错误信息为红色,这样在监控输出地时候就可以将注意力集中在红色文字上。参考了别人的代码,做了一点小改动。如果有需要,请自取:(请注意,理论上该代码只能在 *nix 终端内能呈现彩色,Windows 不能用。)

ColorEcho: https://github.com/upliu/ColorEcho

MAC 上编译 PHP intl 扩展出现 Unable to detect ICU prefix or no failed 错误解决方法

进入扩展源码目录:

cd php-5.5.8/ext/intl

依次运行:

phpize
./configure

configure 这步会出错:

configure: error: Unable to detect ICU prefix or no failed. Please verify ICU install prefix and make sure icu-config works.

解决方法如下:

首先安装 icu4c:

brew install icu4c

然后:

./configure --with-icu-dir=/usr/local/opt/icu4c

接下来:

make && make install

大功告成!