您好,欢迎访问一九零五行业门户网

记录php5.4与php-redis冲突的解决

最近由于update了ubuntu的源,导致原来新源与本地系统库一些lib冲突,导致系统桌面显示异常,后来只有重装,新安装了php5.4.9,还安装了redis,php-redis扩展,php-redis扩展2,10。但把原来的项目一放上去,就报nginx 502错误(nginx 502错误真是个很头疼的问题)。打开nginx日志查看
[error] 29229#0: *1403 recv() failed (104: connection reset by peer) while reading response header from upstream, client: 127.0.0.1, server:
不知道所云。后来打开php-fpm错误日志,得到的log日志
[08-oct-2013 21:22:23] warning: [pool www] child 12026 exited on signal 11 (sigsegv - core dumped) after 5.997917 seconds from start
[08-oct-2013 21:22:23] notice: [pool www] child 12034 started
可以确定的一点,是php-fpm在一个时间点后重启了一个进程。还是毫无头绪。在网上搜了一大遍,有个有用的跟踪方法。
1、设置php-fpm,只起一个work进程
2、重启php-fpm, 执行ps aux grep php-fpm 得到work进程号pid
3、strace -p  pid
下面是我得到的信息
getcwd(/home/www/wms2.xxxx.com, 4096) = 26
lstat(/home/www/wms2.xiaomi.com/./rwebuser.php, 0x7ffff4e30a10) = -1 enoent (no such file or directory)
lstat(/home/www/wms2.xiaomi.com/protected/vendor/wms/api/rwebuser.php, 0x7ffff4e30a10) = -1 enoent (no such file or directory)
lstat(/home/www/wms2.xiaomi.com/protected/vendor/wms/rwebuser.php, 0x7ffff4e30a10) = -1 enoent (no such file or directory)
lstat(/home/www/wms2.xiaomi.com/protected/extensions/log/rwebuser.php, 0x7ffff4e30a10) = -1 enoent (no such file or directory)
lstat(/home/www/wms2.xiaomi.com/protected/modules/rights/components/rwebuser.php, {st_mode=s_ifreg0777, st_size=2945, ...}) = 0
lstat(/home/www/wms2.xiaomi.com/protected/modules/rights/components, {st_mode=s_ifdir0777, st_size=4096, ...}) = 0
lstat(/home/www/wms2.xiaomi.com/protected/modules/rights, {st_mode=s_ifdir0777, st_size=4096, ...}) = 0
lstat(/home/www/wms2.xiaomi.com/protected/modules, {st_mode=s_ifdir0777, st_size=4096, ...}) = 0
open(/home/www/wms2.xiaomi.com/protected/modules/rights/components/rwebuser.php, o_rdonly) = 5
fstat(5, {st_mode=s_ifreg0777, st_size=2945, ...}) = 0
fstat(5, {st_mode=s_ifreg0777, st_size=2945, ...}) = 0
fstat(5, {st_mode=s_ifreg0777, st_size=2945, ...}) = 0
fstat(5, {st_mode=s_ifreg0777, st_size=2945, ...}) = 0
mmap(null, 2945, prot_read, map_shared, 5, 0) = 0x7fd9b4804000
mmap(null, 266240, prot_readprot_write, map_privatemap_anonymous, -1, 0) = 0x7fd9b442f000
munmap(0x7fd9b4804000, 2945)            = 0
close(5)                                = 0
getcwd(/home/www/wms2.xxx.com, 4096) = 26
lstat(/home/www/wms2.xxx.com/./xmccachehttpsession.php, 0x7ffff4e31060) = -1 enoent (no such file or directory)
lstat(/home/www/wms2.xxx.com/protected/vendor/wms/api/xmccachehttpsession.php, 0x7ffff4e31060) = -1 enoent (no such file or directory)
lstat(/home/www/wms2.xxx.com/protected/vendor/wms/xmccachehttpsession.php, 0x7ffff4e31060) = -1 enoent (no such file or directory)
lstat(/home/www/wms2.xxx.com/protected/extensions/log/xmccachehttpsession.php, 0x7ffff4e31060) = -1 enoent (no such file or directory)
lstat(/home/www/wms2.xxx.com/protected/modules/rights/components/xmccachehttpsession.php, 0x7ffff4e31060) = -1 enoent (no such file or directory)
lstat(/home/www/wms2.xxx.com/protected/modules/rights/xmccachehttpsession.php, 0x7ffff4e31060) = -1 enoent (no such file or directory)
lstat(/home/www/wms2.xxx.com/protected/components/xmccachehttpsession.php, {st_mode=s_ifreg0777, st_size=2612, ...}) = 0
open(/home/www/wms2.xxx.com/protected/components/xmccachehttpsession.php, o_rdonly) = 5
fstat(5, {st_mode=s_ifreg0777, st_size=2612, ...}) = 0
fstat(5, {st_mode=s_ifreg0777, st_size=2612, ...}) = 0
fstat(5, {st_mode=s_ifreg0777, st_size=2612, ...}) = 0
fstat(5, {st_mode=s_ifreg0777, st_size=2612, ...}) = 0
mmap(null, 2612, prot_read, map_shared, 5, 0) = 0x7fd9b4804000
munmap(0x7fd9b4804000, 2612)            = 0
close(5)                                = 0
sendto(4, get 6cacd9674ad21aa083b5032b1a29..., 39, msg_dontwaitmsg_nosignal, null, 0) = 39
recvfrom(4, 0x2806d88, 8196, 64, 0, 0)  = -1 eagain (resource temporarily unavailable)
poll([{fd=4, events=pollin}], 1, 5000)  = 1 ([{fd=4, revents=pollin}])
recvfrom(4, value 6cacd9674ad21aa083b5032b1a..., 8196, msg_dontwait, null, null) = 128
lstat(/home/www/wms2.xxx.com/yii/web/chttpcookie.php, {st_mode=s_ifreg0777, st_size=2772, ...}) = 0
lstat(/home/www/wms2.xxx.com/yii/web, {st_mode=s_ifdir0777, st_size=4096, ...}) = 0
open(/home/www/wms2.xxx.com/yii/web/chttpcookie.php, o_rdonly) = 5
fstat(5, {st_mode=s_ifreg0777, st_size=2772, ...}) = 0
fstat(5, {st_mode=s_ifreg0777, st_size=2772, ...}) = 0
fstat(5, {st_mode=s_ifreg0777, st_size=2772, ...}) = 0
fstat(5, {st_mode=s_ifreg0777, st_size=2772, ...}) = 0
mmap(null, 2772, prot_read, map_shared, 5, 0) = 0x7fd9b4804000
munmap(0x7fd9b4804000, 2772)            = 0
close(5)                                = 0
stat(/home/www/wms2.xxx.com/protected/extensions/redis/xmredis.php, {st_mode=s_ifreg0777, st_size=2672, ...}) = 0
lstat(/home/www/wms2.xxx.com/protected/extensions/redis/xmredis.php, {st_mode=s_ifreg0777, st_size=2672, ...}) = 0
lstat(/home/www/wms2.xxx.com/protected/extensions/redis, {st_mode=s_ifdir0777, st_size=4096, ...}) = 0
lstat(/home/www/wms2.xxx.com/protected/extensions, {st_mode=s_ifdir0777, st_size=4096, ...}) = 0
open(/home/www/wms2.xxx.com/protected/extensions/redis/xmredis.php, o_rdonly) = 5
fstat(5, {st_mode=s_ifreg0777, st_size=2672, ...}) = 0
fstat(5, {st_mode=s_ifreg0777, st_size=2672, ...}) = 0
fstat(5, {st_mode=s_ifreg0777, st_size=2672, ...}) = 0
fstat(5, {st_mode=s_ifreg0777, st_size=2672, ...}) = 0
mmap(null, 2672, prot_read, map_shared, 5, 0) = 0x7fd9b4804000
munmap(0x7fd9b4804000, 2672)            = 0
close(5)                                = 0
socket(pf_inet6, sock_dgram, ipproto_ip) = 5
close(5)                                = 0
socket(pf_inet, sock_stream, ipproto_ip) = 5
fcntl(5, f_getfl)                       = 0x2 (flags o_rdwr)
fcntl(5, f_setfl, o_rdwro_nonblock)    = 0
connect(5, {sa_family=af_inet, sin_port=htons(22122), sin_addr=inet_addr(10.237.36.231)}, 16) = -1 einprogress (operation now in progress)
poll([{fd=5, events=pollinpolloutpollerrpollhup}], 1, 3000) = 1 ([{fd=5, revents=pollout}])
getsockopt(5, sol_socket, so_error, [0], [4]) = 0
fcntl(5, f_setfl, o_rdwr)               = 0
setsockopt(5, sol_tcp, tcp_nodelay, [1], 4) = 0
poll([{fd=5, events=pollinpollpripollerrpollhup}], 1, 0) = 0 (timeout)
sendto(5, *2\r\n$4\r\nauth\r\n$9\r\nxm_wms_rs\r\n, 29, msg_dontwait, null, 0) = 29
poll([{fd=5, events=pollinpollpripollerrpollhup}], 1, 0) = 0 (timeout)
poll([{fd=5, events=pollinpollerrpollhup}], 1, 3000) = 1 ([{fd=5, revents=pollin}])
recvfrom(5, +ok\r\n, 8192, msg_dontwait, null, null) = 5
--- sigsegv (segmentation fault) @ 0 (0) ---
process 6011 detached
可以看得出,在执行xmredis后进程6011 就死掉了。基本可以定位是php-redis出了问题。
继续追查最终发现了有段代码问题
public function conn() {
try {
$this->_redis->pconnect($this->host, $this->port, $this->timeout);
// set client option. must after connected
//var_dump(redis::opt_serializer,redis::serializer_php);exit();
$this->_redis->setoption(redis::opt_serializer,redis::serializer_php);
//$this->_redis->setoption(0, 0);
$this->_redis->auth(xm_wms_rs);
$this->connected = true;
} catch (redisexception $e) {
throw new chttpexception(500, redis occurs an error: . $e->getmessage());
}
}
用红色的代码那段,就会报502错误,而用绿色代码这段就没问题。
setoption 这个是个神马东西呢?查了下php-redis api
$redis->setoption(redis::opt_serializer, redis::serializer_none);   // don't serialize data  不序列化数据
$redis->setoption(redis::opt_serializer, redis::serializer_php);    // use built-in serialize/unserialize  用php内置的序列化
$redis->setoption(redis::opt_serializer, redis::serializer_igbinary);   // use igbinary serialize/unserialize 用扩展igbinary序列化
$redis->setoption(redis::opt_prefix, 'myappname:'); // use custom prefix on all keys redis key前缀
$redis->setoption(redis::opt_serializer, redis::serializer_php);  用此就报502
为什么用php内置的序列化就会出错呢?到底发生了什么?
后来又安装了igbinary 扩展,还是不行。最后把php-redis安装了最新的版本2.24,再运行,就完全没问题了。
其它类似信息

推荐信息