Запрет тайм-аута в PHP - PullRequest
       37

Запрет тайм-аута в PHP

4 голосов
/ 13 января 2010

Я работаю над сценарием PHP, который выполняет вызов API для внешнего сайта. Однако если этот сайт недоступен или время ожидания истекло, я бы хотел, чтобы моя функция возвращала значение false.

Я нашел следующее, но я не уверен, как реализовать его в моем скрипте, так как я использую "file_get_contents" для получения содержимого внешнего вызова файла.

Ограничить время выполнения функции или команды 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)

Как бы вы решили эту проблему? Спасибо!

Ответы [ 4 ]

1 голос
/ 13 января 2010

Я бы рекомендовал использовать семейство PHP-функций cURL . Затем вы можете установить время ожидания, используя curl_setopt():

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

Это приведет к тому, что функция curl_exec() вернет FALSE после истечения времени ожидания.

В общем, использование cURL лучше, чем любая из функций чтения файлов; он более надежен, имеет больше возможностей и не рассматривается как угроза безопасности. Многие системные администраторы отключают удаленное чтение файлов, поэтому использование cURL сделает ваш код более переносимым и безопасным.

0 голосов
/ 13 января 2010
<?php
$fp = fsockopen("www.example.com", 80, $errno, $errstr, 4);
if ($fp) {
    stream_set_timeout($fp, 2);
}
0 голосов
/ 13 января 2010
<?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
}
?>
0 голосов
/ 13 января 2010

Из руководства по PHP для File_Get_Contents (комментарии):

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