【问题标题】:Prevent timeout in PHP防止PHP超时
【发布时间】:2011-01-04 15:17:11
【问题描述】:

我正在编写一个对外部站点进行 API 调用的 PHP 脚本。但是,如果此站点不可用或请求超时,我希望我的函数返回 false。

我找到了以下内容,但我不确定如何在我的脚本上实现它,因为我使用“file_get_contents”来检索外部文件调用的内容。

Limit execution time of an function or command PHP

   $fp = fsockopen("www.example.com", 80);
if (!$fp) {
    echo "Unable to open\n";
} else {

    fwrite($fp, "GET / HTTP/1.0\r\n\r\n");
    stream_set_timeout($fp, 2);
    $res = fread($fp, 2000);

    $info = stream_get_meta_data($fp);
    fclose($fp);

    if ($info['timed_out']) {
        echo 'Connection timed out!';
    } else {
        echo $res;
    }

}

(来自:http://php.net/manual/en/function.stream-set-timeout.php

你会如何解决这样的问题?谢谢!

【问题讨论】:

    标签: php api limit execution


    【解决方案1】:

    我建议使用cURL 系列的 PHP 函数。然后您可以使用curl_setopt() 设置超时:

    curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,2); // two second timeout
    

    这将导致curl_exec() 函数在超时后返回 FALSE。

    总的来说,使用 cURL 比任何文件读取功能都好;它更可靠,有更多选择,不被视为安全威胁。许多系统管理员禁用远程文件读取,因此使用 cURL 将使您的代码更加便携和安全。

    【讨论】:

    • 呸,服务器不允许 cURL。不过我会试试看能不能让它运行起来。
    • PHP 可能只是没有用它编译。对不起!如果您打算使用它,我相信您可以说服您的系统管理员安装它并以安全为由禁止远程文件访问。老实说,我很惊讶他还没有(如果您是系统管理员,请道歉 ;-)
    • 嗨卢卡斯。谢谢你的帮助。不,我现在正试图联系系统管理员,看看当 cURL 可用时我能不能解决它!
    【解决方案2】:
    <?php
    $fp = fsockopen("www.example.com", 80);
    
    if (!$fp) {
        echo "Unable to open\n";
    } else {
        stream_set_timeout($fp, 2); // STREAM RESOURCE, NUMBER OF SECONDS TILL TIMEOUT
        // GET YOUR FILE CONTENTS
    }
    ?>
    

    【讨论】:

    • 不知道为什么它不能识别换行符
    • 嗨!超时在这里不起作用。如果站点不可用,我只能在 60 秒后达到 PHP.ini 设置的总 max_execution 时间...
    【解决方案3】:

    来自File_Get_Contents (cmets) 的 PHP 手册:

    <?php 
    $ctx = stream_context_create(array( 
        'http' => array( 
            'timeout' => 1 
            ) 
        ) 
    ); 
    file_get_contents("http://example.com/", 0, $ctx); 
    ?>
    

    【讨论】:

    • 这没有考虑超时,但不知道为什么。
    • 我好像也没有,抱歉。
    【解决方案4】:
    <?php
    $fp = fsockopen("www.example.com", 80, $errno, $errstr, 4);
    if ($fp) {
        stream_set_timeout($fp, 2);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-06
      • 1970-01-01
      • 2017-09-08
      相关资源
      最近更新 更多