記要php5.4與php-redis衝突的解決

來源:互聯網
上載者:User
記錄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_IFREG|0777, st_size=2945, ...}) = 0

lstat("/home/www/wms2.xiaomi.com/protected/modules/rights/components", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0

lstat("/home/www/wms2.xiaomi.com/protected/modules/rights", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0

lstat("/home/www/wms2.xiaomi.com/protected/modules", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0

open("/home/www/wms2.xiaomi.com/protected/modules/rights/components/RWebUser.php", O_RDONLY) = 5

fstat(5, {st_mode=S_IFREG|0777, st_size=2945, ...}) = 0

fstat(5, {st_mode=S_IFREG|0777, st_size=2945, ...}) = 0

fstat(5, {st_mode=S_IFREG|0777, st_size=2945, ...}) = 0

fstat(5, {st_mode=S_IFREG|0777, st_size=2945, ...}) = 0

mmap(NULL, 2945, PROT_READ, MAP_SHARED, 5, 0) = 0x7fd9b4804000

mmap(NULL, 266240, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_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_IFREG|0777, st_size=2612, ...}) = 0

open("/home/www/wms2.xxx.com/protected/components/XMCCacheHttpSession.php", O_RDONLY) = 5

fstat(5, {st_mode=S_IFREG|0777, st_size=2612, ...}) = 0

fstat(5, {st_mode=S_IFREG|0777, st_size=2612, ...}) = 0

fstat(5, {st_mode=S_IFREG|0777, st_size=2612, ...}) = 0

fstat(5, {st_mode=S_IFREG|0777, 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_DONTWAIT|MSG_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_IFREG|0777, st_size=2772, ...}) = 0

lstat("/home/www/wms2.xxx.com/yii/web", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0

open("/home/www/wms2.xxx.com/yii/web/CHttpCookie.php", O_RDONLY) = 5

fstat(5, {st_mode=S_IFREG|0777, st_size=2772, ...}) = 0

fstat(5, {st_mode=S_IFREG|0777, st_size=2772, ...}) = 0

fstat(5, {st_mode=S_IFREG|0777, st_size=2772, ...}) = 0

fstat(5, {st_mode=S_IFREG|0777, 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_IFREG|0777, st_size=2672, ...}) = 0

lstat("/home/www/wms2.xxx.com/protected/extensions/redis/XMRedis.php", {st_mode=S_IFREG|0777, st_size=2672, ...}) = 0

lstat("/home/www/wms2.xxx.com/protected/extensions/redis", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0

lstat("/home/www/wms2.xxx.com/protected/extensions", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0

open("/home/www/wms2.xxx.com/protected/extensions/redis/XMRedis.php", O_RDONLY) = 5

fstat(5, {st_mode=S_IFREG|0777, st_size=2672, ...}) = 0

fstat(5, {st_mode=S_IFREG|0777, st_size=2672, ...}) = 0

fstat(5, {st_mode=S_IFREG|0777, st_size=2672, ...}) = 0

fstat(5, {st_mode=S_IFREG|0777, 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_RDWR|O_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=POLLIN|POLLOUT|POLLERR|POLLHUP}], 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=POLLIN|POLLPRI|POLLERR|POLLHUP}], 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=POLLIN|POLLPRI|POLLERR|POLLHUP}], 1, 0) = 0 (Timeout)

poll([{fd=5, events=POLLIN|POLLERR|POLLHUP}], 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,再運行,就完全沒問題了。


2.24版本php-redis源碼地址https://github.com/nicolasff/phpredis

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.