fread timeout с помощью 'mod_fcgid: чтение таймаута из канала'
У меня проблема с URL-адресом, к которому мое приложение пытается получить доступ по тайм-ауту. Я пытаюсь поймать этот тайм-аут и решить эту проблему с помощью этого кода:
$timeout = 120;
if(false == $handle = @fsockopen($host, $port, $errno, $errstr, $timeout))
{
throw new Exception("Could not connect to url: ".$errstr);
}
$getRequest = "GET {$url} HTTP/1.0\r\n";
$getRequest .= "Host: {$urlParts['host']}\r\n";
$getRequest .= "Connection: close\r\n\r\n";
fwrite($handle, $getRequest);
$maxExecutionTime = ini_get('max_execution_time');
set_time_limit($timeout+10);
stream_set_timeout($handle, $timeout);
$head = fread($handle, 1024); // Read the first 1024 bytes
if($maxExecutionTime == 0) {
$maxExecutionTime = 30;
}
set_time_limit($maxExecutionTime);
$stream_metadata = stream_get_meta_data($handle);
if($stream_metadata['timed_out'] === true) {
throw new Exception("Connection timed out");
}
Мой URL, который я использую для тайм-аута, находится за брандмауэром, поэтому я не могу поделиться им, но он спит () в течение 5 минут. Когда я пытаюсь запустить этот код, выполнение останавливается на $head = fread($handle, 1024); и через 90 секунд я получаю ошибку 500 с сервера "Преждевременный конец сценария". Когда я исследую на уровне отладки в журналах apache, я вижу:
[Fri Aug 26 11:10:45 2011] [warn] [client 192.168.10.202] mod_fcgid: read timeout from pipe
[Fri Aug 26 11:10:45 2011] [error] [client 192.168.10.202] Premature end of script headers: validateUrl.php
с 'validateUrl.php', являющимся URL, через который я получаю доступ к этому скрипту. Я не уверен, что увеличение FcgidIOTimeout до более высокого значения безопасно, так как это применимо ко всем моим страницам. Есть идеи / комментарии?
Сведения о системе: PHP версии 5.2.13, работающий в Windows NT EPG-WEB 5.2 build 3790 Apache: Apache/2.2.19 (Win32) mod_fcgid/2.3.6
1 ответ
Попробуйте некоторые из этих директив в вашем httpd.conf:
<IfModule fcgid_module>
FcgidIOTimeout 1200
FcgidConnectTimeout 1200
FcgidBusyScanInterval 1200
FcgidBusyTimeout 1200
FcgidErrorScanInterval 1200
FcgidIdleScanInterval 1200
FcgidIdleTimeout 1200
FcgidProcessLifeTime 3600
FcgidZombieScanInterval 1200
</IfModule>
источник: http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html