Код внутри фигурных скобок будет выполнен после возврата к вызову stream_socket_client()
.Он вернется одним из трех способов:
- Соединение установлено успешно (возвращает сокет)
- Соединение явно сбой - IE соединение отклонено или сброшено сервером
- Соединение неявно прерывается - то есть время ожидания истекает
Первые два варианта могут произойти в течение максимум нескольких секунд - можно разумно предположить, что если вы еще не установилисоединение в течение 10 секунд, оно не будет работать должным образом.С вашим текущим кодом третий вариант не будет выполняться в течение 60 секунд, что означает, что вы можете в конечном итоге ждать 60 секунд, прежде чем этот код будет выполнен.
Как правило, это верно почти для каждой функции в PHP - выпридется ждать завершения одной функции, прежде чем вы сможете выполнить следующую.Есть некоторые исключения из этого правила - и многие из этих исключений находятся в области программирования сокетов, они называются «неблокирующими» операциями - , но вы не можете установить сокет как неблокирующий, пока он не подключен 1 .Это означает, что ваш вызов connect всегда будет «блокироваться» до тех пор, пока он не подключится или не завершится неудачно - код внутри фигурных скобок никогда не будет выполнен до тех пор, пока сокету не удалось подключиться, а это может занять до 60 секунд.
Я предлагаю вам уменьшить это время ожидания - 60 секунд неоправданно долго.
Редактировать
1 Фактически вы можете выполнять операции подключения внеблокирующим способом, с помощью флага STREAM_CLIENT_ASYNC_CONNECT
для stream_socket_client()
.При использовании этого флага необходимо использовать stream_select()
, чтобы определить, подключен ли сокет.