как заставить PHP прервать попытку связаться с сервером - PullRequest
0 голосов
/ 14 января 2019

Я думаю, что я неправильно понял время ожидания сокета PHP. Я использую get_headers(), чтобы проверить, отвечает ли сервер быстро. Я хочу дать серверу 15 секунд для ответа, поэтому я использую ini_set('default_socket_timeout', 15). Чтобы проверить это, я могу заставить сервер медленно реагировать, используя sleep(). То есть я говорю

$headers_array = get_headers('example.com/index.php?sleep=25')

с example.com/index.php, содержащим (только) код php

sleep(@$_GET['sleep']);
echo 'After a delay I am now responding';

Я обнаружил, что PHP всегда , кажется, ждет, пока соединение не будет закрыто, прежде чем продолжить. Когда дело доходит до этой точки, если задержка была больше чем default_socket_timeout PHP сообщает

не удалось открыть поток: сбой HTTP-запроса!

и устанавливает $headers_array в false. Но существенным моментом является то, что он, кажется, ждет, пока соединение не будет закрыто, прежде чем сделать это. Кроме того, время ожидания закрытия соединения, похоже, зависит от времени выполнения PHP.

Наивно, я бы ожидал, что PHP будет ожидать самое большее default_socket_timeout , прежде чем продолжить, и в течение этого времени не выйдет из бюджета времени выполнения PHP, как установлено с помощью set_time_limit(). Очевидно, мое понимание неверно.

Суть в том, что у меня есть сервер, который время от времени перегружается и очень медленно отвечает на HTTP-запросы. Я хочу проверить его время отклика с другого сервера. Есть ли простой способ сказать PHP " связаться с этим сервером, но не ждите ответа более 10 секунд "

1 Ответ

0 голосов
/ 14 января 2019

Если вы используете php 7.1 или новее, вы можете попробовать создать контекст с явным тайм-аутом, что-то вроде этого:

$context = stream_context_create(array('http'=> array(
    'timeout' => 15.0,
    'ignore_errors' => true,
)));
$headers_array = get_headers('example.com/index.php?sleep=25', 0, $context);

Это явно устанавливает таймаут для вашей get_headers операции, не полагаясь на значения по умолчанию.

В целом, по моему опыту, время ожидания сокетов в PHP, к сожалению, довольно ненадежное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...