2013-08-06 1 views
5

: 드라이버는 여기PHP Redis timeout, 연결 오류를 읽으시겠습니까?

"PHP 치명적인 오류 메시지가 catch되지 않은 예외 'RedisException' '연결에 읽기 오류'는"~ 일분 후에

$redis->blpop('a', 0); 

이 항상 시간을 phpredis. 내 redis.conf 내가 이렇게하면 내가 -1 필요합니까 왜 타임 아웃 0 $redis->getOption(Redis::OPT_READ_TIMEOUT) 반환 double(0)

그것이

$redis->setOption(Redis::OPT_READ_TIMEOUT, -1); 시간 초과 적이라고? Redis 설명서에서 redis.conf의 timeout 0은 결코 절 밖으로 나와야한다고 말합니다.

"기본적으로 최신 버전의 Redis는 클라이언트가 몇 초 동안 유휴 상태 인 경우 클라이언트와의 연결을 닫지 않습니다. 연결은 영원히 열려 있습니다."

답변

10

제가 알고있는 현재의 해결책은 phpredis에 대한 지속적인 연결을 비활성화하는 것입니다 (reported as buggy since October 2011이기 때문입니다). php-fpm 또는 다른 스레드 모델을 사용하는 경우 라이브러리 specifically disables persistent connections.

이 오류의 빈도를 줄이려면 adjusting the php.ini default_socket_timeout value까지 가능할 수 있습니다.

또한 phpredis의 읽기 시간 초과 구성은 보편적으로 지원되지 않습니다. 해당 기능 (OPT_READ_TIMEOUT 찾기)은 introduced in tag 2.2.3입니다.

1

기사를 많이 연구하고 나 자신의 strace를 redis 및 php로 작성한 후에는이 문제가 쉽게 해결 된 것 같습니다 (solution). 나의 유스 케이스의 주된 문제는 redis 서버가 온 - 디스크 기록을 온 - 디스크 db에 저장하는 과정을 포크 할 수 없다는 것이다.

해킹 된 변경 사항을 제시하지 않고 php.ini와 redis.conf에 모든 시간 초과 값을 남겨두고 위의 해결 방법 만 시도해 보았습니다.이 문제는 '연결시 읽기 오류'를 모두 사용하여 수정할 수 없었습니다. php 및 redis conf 파일에서 시간 초과 값 변경에 대한 제안이 사라졌습니다.

필자는 파일 설명자의 제한을 100000 개로 늘리는 것과 관련하여 몇 가지 제안을 보았습니다. 1024 개의 파일 설명자 제한이있는 클라우드 서버에서 사용 사례를 실행하고 있습니다.

0

코드 ini_set(‘default_socket_timeout’, -1)을 PHP 프로그램에 추가했지만 즉시 작동하지 않습니다.

그러나 나는 다시 PHP 프로그램을 실행하기 시작했을 때 분 3 후, 마지막에 내가 이유를 발견, 레디 스 연결이

가 그럼 난 내 redis.conftimeout=0을 설정 지속되지 않습니다, 문제가 해결!

+0

더 읽기 좋은 형식으로 만들어보세요. –

1
$redis->connect(host, port, timeout1); 

.....

$redis->blpop($key, timeout2); 

하는 tiemout1 이상 timeout2보다 더해야합니다.