2012-12-11 3 views
2

저는 현재 구축중인 PHP 응용 프로그램에 매우 이상한 문제가 있습니다.PHP CURL이 시간 초과되었지만 CLI CURL이 작동합니다.

내 개발 서버 (Windows 7 64 비트)에 2 개의 가상 호스트 sometestsite.comendpoint.sometestsite.com이 있습니다.

hosts 파일에 sometestsite.comendpoint.sometestsite.com127.0.0.1을 가리 키도록 구성했습니다.

서버가 아파치 2.4.2와 PHP 5.4.9를 fcgi 모듈로 실행할 때 모든 것이 작동합니다.

그런 다음 Apache를 제거하고 nginx-1.2.5 (Windows 빌드)를 설치했습니다. php-cgi.exe가 서비스로 실행 중이고 모든 것이 잘 작동하는 것 같습니다.

문제는 이전에 작업 한 sometestsite.com에서 endpoint.sometestsite.com까지의 CURL 호출이 시간 초과된다는 것입니다.

PHP Fatal error: Maximum execution time of 30 seconds exceeded in D:\www\test5.php on line 22 
PHP Stack trace: 
PHP 1. {main}() D:\www\test5.php:0 

그러나, 나는 실행하는 경우 :

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, 'http://endpoint.sometestsite.com/test'); 
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, array('provider' => urlencode('provider'), 
'key' => urlencode('asdf'))); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

//Execute and get the data back 
$result = curl_exec($ch); 

var_dump($result); 

이 내가 PHP 로그에받을 것입니다 :

나는 다음 테스트를 위해 작은 PHP 파일 자체 코드의 조각을 이동 (힘내 배쉬를 통해) CLI CURL을 사용하여 동일한 요청, 그것을 잘 작동합니다 :

$ curl -X POST 'http://endpoint.sometestsite.com/test' -d'provider=provider&key=asdf' 
{"test": "OK"} 

이 매우 이상한 인 PHP 전자 그대로 xactly 같은 버전이고 아파치가 사용될 때와 같은 설정을 가진다.

웹 서버 구성 문제이거나 아직 PHP의 CURL에 문제가 있는지 확실하지 않습니다.

왜 이런 일이 일어나는 지에 대한 통찰력/과거 경험을 제공 할 수 있습니까?

+0

D : \ www \ test5.php의 22 행에 무엇이 있는지 보여 줄 수 있습니까? – Sherif

+0

@GoogleGuy : 22 행은 실제로'실행하고 데이터를 다시 얻습니다 .' (CURL 요청 전에 다른 코드가 있지만 일부 문자열 만 출력합니다). 그래서'curl_exec()'가 시간 초과되었습니다. – F21

+0

맞아요, 그건 당신 문제의 중요한 부분입니다. 오류의 원인이기 때문에 코드에 포함시키는 것이 도움이되었을 것입니다. – Sherif

답변

1

Nginx는 php-cgi.exe 프로세스를 생성하지 않습니다. 나 같은 아파치에서 mod_fcgid를 사용했다면 시스템에 많은 php-cgi.exe 프로세스가 있다는 것을 알 수 있습니다.

Nginx가 PHP 프로세스를 생성하지 않기 때문에 프로세스를 직접 시작해야합니다. 내 경우에는 php-cgi.exe -b 127.0.0.1:9000이 자동으로 서비스로 실행됩니다. Nginx는 PHP에 대한 모든 요청을 PHP 처리기로 보내고 응답을받습니다.

문제점 : PHP-FPM does not work on windows (5.4.9 기준). FPM은 배경에 앉아 있고 요청을 처리 할 때 PHP 프로세스의 생성 및 종료를 관리하는 깔끔하고 작은 프로세스 관리자입니다.

Windows에서는 가능하지 않으므로 problem experienced here과 비슷한 한 번에 하나의 요청 만 제공 할 수 있습니다.

필자의 경우 다음과 같은 일이 발생합니다. 응용 프로그램의 sometestsite.com 페이지에서 php-cgi.exe을 호출하여 127.0.0.1:9000을 호출하십시오. 내부에서 CURL 요청은 endpoint.sometestsite.com에있는 페이지를 호출합니다. 그러나이 두 번째 요청을 처리하기 위해 새로운 PHP 프로세스를 생성 할 수 없습니다. 원래 php-cgi.exe는 CURL 요청을 실행하는 요청을 처리하여 차단됩니다. 그래서 우린 교착 상태에 빠졌고 모든 것이 끝나 버렸어.

내가 사용한 솔루션 (거의 해킹)은이 python script을 사용하여 10 개의 PHP 프로세스를 생성하는 것입니다.

그런 다음 nginx에서 업스트림 블록을 사용하여 (스크립트의 문서에 따라) nginx에 10 개의 프로세스가 있음을 알립니다.

다음은 완벽하게 작동했습니다.

그런 말로하면, 프로덕션 환경에서는 이것을 사용하지 마십시오. 어쨌든 Linux에서 nginx 및 php-fpm을 실행하는 것이 좋습니다. 바쁜 사이트가 있으면 10 개의 프로세스로 충분하지 않을 수 있습니다. 그러나 필요한 프로세스 수를 아는 것은 어려울 수 있습니다.

그러나 Windows에서 PHP를 사용하여 nginx를 실행하는 경우 Cygwin에서 PHP-FPM을 this tutorial으로 실행하십시오.

0

실행중인 cgi 프로세스와 동일한 사용자의 콘솔에서 스크립트를 실행해야합니다. 동일하지 않으면 다른 권한을 가질 수 있습니다. 나에게 문제는 cgi 프로세스의 소유자에 대한 외부 연결을 허용하지 않는 방화벽 규칙에 있었다.

관련 문제