zoco

php 7.2.1 + redis 3.1.6 超时问题

2018-05-23


在升级php 7.2.1之后发现某集群的超时时间骤增,从平均80ms变成了120ms。

同时在报错日志中发现了较多的如下错误:

NuU1L8.png

本来设置的超时都没生效,可能导致性能下降。

然后strace看一下进程执行记录:

NuUreU.png

发现poll的时候的timeout都是60000,而php 7.0.13 + redis 3.0.0的机器的timeout都是pconnect对应的时间,由此可以看出pconnect传的参数在这个版本搭配下并未生效。

看一下源码:

pconnect->redis_sock_create->redis_sock_server_open->redis_sock_connect。

    tv.tv_sec  = (time_t)redis_sock->timeout;
    tv.tv_usec = (int)((redis_sock->timeout - tv.tv_sec) * 1000000);
    if(tv.tv_sec != 0 || tv.tv_usec != 0) {
        tv_ptr = &tv;
    }
    redis_sock->stream = php_stream_xport_create(host, host_len,
        0, STREAM_XPORT_CLIENT | STREAM_XPORT_CONNECT,
        persistent_id, tv_ptr, NULL, NULL, &err);

在php源码里看一下php_stream_xport_create

PHPAPI php_stream *_php_stream_xport_create(const char *name, size_t namelen, int options,
		int flags, const char *persistent_id,
		struct timeval *timeout,
		php_stream_context *context,
		zend_string **error_string,
		int *error_code
		STREAMS_DC)
{
	struct timeval default_timeout = { 0, 0 };

	default_timeout.tv_sec = FG(default_socket_timeout);

	if (timeout == NULL) {
		timeout = &default_timeout;
	}

发现在timeout是NULL的情况下会把timeout设置成默认的timeout,而默认的timeout在php.ini中时60s,问题可能暂时定位,需要debug查一下为什么出现这个问题。