php redis session 过期,PHP redis session 阻塞问题

现象

php 进程: THREAD_PHP_RD_\Service\Process\Deploy 不干活了,进程堆栈如下:

# pstack 157380

#0 0x00007f4396a440d8 in poll () from /lib64/libc.so.6

#1 0x0000000000745639 in php_sockop_read ()

#2 0x00007f438c90c601 in php_openssl_sockop_io () from /data1/php/lib/php/extensions/no-debug-non-zts-20121212/openssl.so

#3 0x000000000073aed4 in _php_stream_fill_read_buffer ()

#4 0x000000000073b073 in _php_stream_get_line ()

#5 0x00007f438c4d938f in redis_sock_read () from /data1/php/lib/php/extensions/no-debug-non-zts-20121212/redis.so

#6 0x00007f438c4db9dc in ps_write_redis () from /data1/php/lib/php/extensions/no-debug-non-zts-20121212/redis.so

#7 0x0000000000613090 in php_session_save_current_state ()

#8 0x00000000006143d6 in zm_deactivate_session ()

#9 0x0000000000787914 in zend_deactivate_modules ()

#10 0x0000000000722f45 in php_request_shutdown ()

#11 0x000000000083200f in do_cli ()

#12 0x0000000000833478 in main ()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

# pstack 157380

#0 0x00007f4396a440d8 in poll () from /lib64/libc.so.6

#1 0x0000000000745639 in php_sockop_read ()

#2 0x00007f438c90c601 in php_openssl_sockop_io () from /data1/php/lib/php/extensions/no-debug-non-zts-20121212/openssl.so

#3 0x000000000073aed4 in _php_stream_fill_read_buffer ()

#4 0x000000000073b073 in _php_stream_get_line ()

#5 0x00007f438c4d938f in redis_sock_read () from /data1/php/lib/php/extensions/no-debug-non-zts-20121212/redis.so

#6 0x00007f438c4db9dc in ps_write_redis () from /data1/php/lib/php/extensions/no-debug-non-zts-20121212/redis.so

#7 0x0000000000613090 in php_session_save_current_state ()

#8 0x00000000006143d6 in zm_deactivate_session ()

#9 0x0000000000787914 in zend_deactivate_modules ()

#10 0x0000000000722f45 in php_request_shutdown ()

#11 0x000000000083200f in do_cli ()

#12 0x0000000000833478 in main ()

4个cli进程都阻塞在了这里;

大概意思为,PHP要回写session,先要一些其它交互,期望能读一行,但是,怎么也读不够一行,于是就死等

问题1:

如果没有什么意外的话,不应该让死等

问题2:

debug发现,这个stream的数据结构中,设置的超时时间为86400秒:

5f5d09fb1e441c10f75750df0fee87b6.png

cbb81a9cb59e0e6f80d9e1e13a6291ac.png

e653480dd01b7f8f52d7ce41b7a5e75d.png

难怪一直阻塞住不干活。

解决办法:

添加超时时间的配置:

session.save_path = "tcp://127.0.0.1:6379?weight=1&timeout=3

1

session.save_path="tcp://127.0.0.1:6379?weight=1&timeout=3

问题:

你问我gdb的时候是如何知道stream中如何获取超时时间的?如何知道stream->abstract 的真实数据类型的?

翻代码看到的:

0cf27cac9a36ca99546c405aa5935fde.png

注: 还以为此事为偶发,进程刚刚工作几个小时就全部进入到了这个场景了,还好我解决了; 其实,这并没有找到问题的根源,不找到原因的话,后续会有更加莫名其妙的的事情发生的

Redis 版本号

acbafc658d9ad9f85f084fbe54385c78.png

(然而现在该扩展已经开发到了4.x.y 了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值