Вопрос

Я работаю над 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)

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

Это было полезно?

Решение

<?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
}
?>

Другие советы

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

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

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

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

Из руководства по PHP для Файл_Гет_Контенты (комментарии):

<?php 
$ctx = stream_context_create(array( 
    'http' => array( 
        'timeout' => 1 
        ) 
    ) 
); 
file_get_contents("http://example.com/", 0, $ctx); 
?>
<?php
$fp = fsockopen("www.example.com", 80, $errno, $errstr, 4);
if ($fp) {
    stream_set_timeout($fp, 2);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top