2009-08-10 3 views
1

PHP 스크립트를 통해 beanstalkd 서버에 연결하고 기존 대기열에서 작업을 예약하려고합니다. 내가 작업이 가능하지 않은 경우, 중지 스크립트를 기대는 데몬의 응답을 얻을 수는 fgets() 함수를 사용하고, 여기에 샘플 코드입니다 :PHP fgets() (또는 fread())가 차단되지 않습니다.

set_time_limit(0); 
$connection = fsockopen('localhost', 11300); 
fwrite($connection, "reserve\r\n"); 
stream_set_blocking($connection, TRUE); 
fgets($connection); 

당신은 내가 강제로 시도하고 볼 수 있듯이 fgets() 함수가 블로킹되어 있고 max_execution_time을 0으로 설정하고있다. (아무런 의미가 없다.) 그러나 잠시 후 (2mins) 스크립트는 에러없이 리턴한다. telnet을 통해 예약 명령을 실행하려했으나 exepcted로 중단됩니다. fread()도 사용하려고했지만 같은 행동을합니다.

해결 방법에 대한 제안이 있으십니까?

답변

1

stream_set_timeout()도 사용해보세요.

+0

그래, 해결책이 될 것이지만, 스크립트를 죽지 않고 올바른 시간을 기다릴 필요없이 완전한 비 차단 방법이 있는지 알고 싶습니다. 이것이 일종의 버그인지 궁금합니다. –

0

php.ini에서 값을 설정 했습니까? phpinfo()를 통해 올바른 값을 확인 했습니까? 프로그래밍 방식으로 설정하면 작동하지 않습니다 (cf). http://us.php.net/manual/en/function.set-time-limit.php :

이 기능은 PHP가 안전 모드에서 실행될 때 아무런 영향을주지 않습니다. php.ini에서 안전 모드를 끄거나 제한 시간을 변경하는 것 이외의 다른 해결 방법은 없습니다.

+0

고맙습니다 만, 저는 max \ _execution \ _time이 실제 문제라고 생각하지 않습니다. (나는 그것에 관한 어떤 에러도 없었습니다.) 어쨌든 php.ini에서 설정했습니다. 스크립트는 계속 돌아갑니다. 이상한 점은 fgets() 함수의 결과를 출력하려고하면 빈 문자열이 생기는 것입니다. –

0

데몬은 2 분 후에 줄 끝 문자를 출력 할 수 있습니다. 빈 문자열을 확인하고 다시 루프를 시도 했습니까?

관련 문제