PHP, сокеты, что я делаю не так? Висит.

humbert
На сайте с 16.03.2006
Offline
540
586

$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);


socket_bind($sock, $socket_server, $socket_port);

socket_listen($sock, 15);


while (1)
{usleep(100000);
$msgsock = socket_accept($sock);
$buf = socket_read($msgsock, 2048, PHP_NORMAL_READ);//судя по всему здесь висит.

if ( $buf == 'shutdown')
{break;}
socket_close($msgsock);
}
socket_close($sock);
Парсинг прайс-листов, наполнение интернет-магазина товаром. (https://humbert.ru) Любая CMS (Битрикс, OpenCart, Prestashop и даже Woo Commerce )
[umka]
На сайте с 25.05.2008
Offline
456
#1

В сокет ничего не пишут с противоположной стороны или пишут что-то отличное от "shutdown".

И цикл выполняется бесконечно.

А может быть, вообще никто не подключается и висит на socket_accept().

На этом телепатический сеанс предлагаю завершить и добавить в код вывод отладочной информации.

Лог в помощь!
humbert
На сайте с 16.03.2006
Offline
540
#2

Цикл и должен быть бесконечным, пишу слушалку сокета.

С сокетами не работал никогда до этого момента.

Дмитрий
На сайте с 23.08.2006
Offline
222
#3

1. Чему равны переменные $socket_server, $socket_port?

2. На какой порт коннектились и что отправляли прежде чем поняли что ваш скрипт "висит"?

3. Попробуйте добавить еще одно условие, иначе у вас socket_read пытается читать из $msgsock, который еще не является готовым (клиент не присоеденился).

while (1) {
$msgsock = socket_accept($sock);
if ($msgsock) {
$buf = socket_read($msgsock, 2048, PHP_NORMAL_READ); //судя по всему здесь висит.
if ($buf == 'shutdown') {
break;
}
socket_close($msgsock);
}
usleep(100000);
}
socket_close($sock);
Разрабатываю и автоматизирую на php http://jonnyb.ru/
humbert
На сайте с 16.03.2006
Offline
540
#4

1. localhost, 10001

2. скриптом запускаю вебсервер через ajax, потом этим же скриптом подаю команду на отключение - кликами по картинке запускаю и останавливаю.

После подачи команды на остановку пытаюсь снова запустить - не получается, только после истечении нескольких минут запускаю. Т.е. какой-то висяк.

3. спасибо, попробую.

[umka]
На сайте с 25.05.2008
Offline
456
#5
JonnyB:
пытается читать из $msgsock, который еще не является готовым (клиент не присоеденился).

Функция socket_accept() в данном случае будет ждать до тех пор, пока клиент не присоединится.

humbert
На сайте с 16.03.2006
Offline
540
#6

Я разобрался - при закрытии сокета TCP еще некоторое время открыт и поэтому не удается работать нормально.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий