Я работаю над скриптом клиента php socket. Я хочу, чтобы скрипт мог обрабатывать время простоя сервера.PHP: повторное подключение клиентского сокета
я начала соединение следующим образом
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
function connect()
{
global $socket;
global $ip;
global $port;
$connected = FALSE;
while($connected === FALSE)
{
sleep(5);
$connected = socket_connect($socket, $ip, $port);
}
}
connect();
, которая пытается соединения, пока сервер не доступен.
Далее я обнаружил, что сервер больше не отвечает, отключает сокет и пытается подключиться к серверу.
$ret = socket_write($socket, $str, strlen($str));
if ($ret === false)
{
socket_shutdown($socket, 2);
socket_close($socket);
connect();
}
однако, я получаю следующее сообщение об ошибке от socket_connect:
A connect request was made on an already connected socket.
На данный момент, даже если сервер возвращается в Интернете, единственный путь мой сценарий, чтобы восстановить это убить его и начать это снова. Есть ли еще способ закрыть соединение с клиентским сокетом? Большая часть того, что я смог найти по этой теме, касается сокетов, которые прослушивают входящее соединение.
Я попытался воссоздать $ socket снова, используя «unset», за которым следует «socket_create», но это тоже не помогло.
EDIT: Что я имею в виду, если я изменю, что последний кусок кода на следующий
$ret = socket_write($socket, $str, strlen($str));
if ($ret === false)
{
socket_shutdown($socket, 2);
socket_close($socket);
unset($socket);
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
connect();
}
тогда я все еще получаю ту же ошибку.
Любая помощь была бы принята с благодарностью.
SOLVED: Оказывается, это действительно проблема с глобальной переменной. Этот кусок кода с socket_write был в отдельной функции. Я добавил «global $ socket» в начале функции, но, оказывается, мне также необходимо добавить его после сбоя. Кроме того, чтобы отключить глобальный, я должен использовать unset ($ GLOBALS ['socket']); Благодаря EJP, заставив меня пересмотреть это.
Где вы положили "unset"? – PleaseStand
После socket_close. Затем я вызвал socket_create перед connect(). –