stream_socket_client, время ожидания и контроль - PullRequest
0 голосов
/ 22 декабря 2011

У меня есть этот код PHP:

$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);

То, что «60» - это тайм-аут для соединения.Сразу после этой строки у меня есть:

if (!$fp) {...}

Теперь: будет ли эта строка ждать этого времени ожидания перед выполнением кода внутри фигурных скобок?

1 Ответ

2 голосов
/ 23 декабря 2011

Код внутри фигурных скобок будет выполнен после возврата к вызову stream_socket_client().Он вернется одним из трех способов:

  • Соединение установлено успешно (возвращает сокет)
  • Соединение явно сбой - IE соединение отклонено или сброшено сервером
  • Соединение неявно прерывается - то есть время ожидания истекает

Первые два варианта могут произойти в течение максимум нескольких секунд - можно разумно предположить, что если вы еще не установилисоединение в течение 10 секунд, оно не будет работать должным образом.С вашим текущим кодом третий вариант не будет выполняться в течение 60 секунд, что означает, что вы можете в конечном итоге ждать 60 секунд, прежде чем этот код будет выполнен.

Как правило, это верно почти для каждой функции в PHP - выпридется ждать завершения одной функции, прежде чем вы сможете выполнить следующую.Есть некоторые исключения из этого правила - и многие из этих исключений находятся в области программирования сокетов, они называются «неблокирующими» операциями - , но вы не можете установить сокет как неблокирующий, пока он не подключен 1 .Это означает, что ваш вызов connect всегда будет «блокироваться» до тех пор, пока он не подключится или не завершится неудачно - код внутри фигурных скобок никогда не будет выполнен до тех пор, пока сокету не удалось подключиться, а это может занять до 60 секунд.

Я предлагаю вам уменьшить это время ожидания - 60 секунд неоправданно долго.

Редактировать

1 Фактически вы можете выполнять операции подключения внеблокирующим способом, с помощью флага STREAM_CLIENT_ASYNC_CONNECT для stream_socket_client().При использовании этого флага необходимо использовать stream_select(), чтобы определить, подключен ли сокет.

...