memcache是一套分布式的高速缓存系统,很多网站都在使用memcache,以提高网站的访问速度。最近,遇到了一个比较头痛的问题。
首先,分离出关键的代码:
$mc=new Memcached();
$mc->addServer("www.xxx.com",11711); //www.xxx.com为未解析的host
$mc->get("fffffff");
执行该PHP脚本,发现报了Segmentation fault错误,为啥?
使用gdb跟踪程序,找到了报错的代码:
libmemcached-0.44/libmemcached/connect.c:line400
if ((ptr->fd= socket(use->ai_family,
use->ai_socktype,
use->ai_protocol)) < 0)
{
ptr->cached_errno= get_socket_errno();
WATCHPOINT_ERRNO(get_socket_errno());
return MEMCACHED_CONNECTION_SOCKET_CREATE_FAILURE;
}
Segmentation 说明错误是非法存取内存区域,可以判断use的某个元素为NULL(PS:由于编译优化,gdb无法打印详细的值,这块等以后有空在检查了)
翻查了一下php关于memcahed的介绍,也找到了问题所在(http://php.net/manual/zh/memcached.requirements.php)
说说我PHP的环境配置吧,也最终确认了问题所在。PHP官网上已经说明了,memcached扩展,必须使用libmemcached大于1.0的版本。(PS:这里插一句,如果使用的是memcache扩展,不会出现改问题,原因是memcache扩展使用的是libmemcache系统库)
PHP版本 | libmemcached版本 | 是否出现问题 |
5.2.14 | libmemcached-0.44 | 是 |
5.4.41 | libmemcached-1.0.18 | 否 |
总结:环境配置,按照官方说明配置,并编写文档规范。