4

我的应用程序尝试访问超时的 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 位于防火墙后面,因此我无法共享它,但它被设计为 sleep() 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 增加到更高的值是否安全,因为它适用于我的所有页面。有什么想法/意见吗?

系统详细信息:在 Windows NT EPG-WEB 5.2 build 3790 上运行的 PHP 版本 5.2.13 Apache:Apache/2.2.19 (Win32) mod_fcgid/2.3.6

4

1 回答 1

14

在 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

于 2012-03-14T09:58:17.120 回答