Предотвратить тайм-аут в PHP
Вопрос
Я работаю над 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);
}