У меня есть PHP-скрипт, который я запускаю в командной строке, и когда предполагается, что скрипт завершится, он просто зависнет навсегда. Это происходит как в Windows, так и в Linux, поэтому не связано с ОС.
Я попытался отладить код с XDebug, выходя в финал exit
заявление (пробовал die
так же без удачи). После прохождения нескольких деструкторов на некоторых объектах больше нечего делать, и процесс просто ждет вечно. Он ничего не делает, не потребляет никаких ресурсов. Единственный способ завершить процесс — это убить его, например, Ctrl+C
Это не происходит во всех моих сценариях, но у меня есть случай, который я могу воспроизвести. Я не уверен, находится ли он в моем коде, коде библиотеки (в основном Symfony, Doctrince и т. Д.) Или в самом PHP.
Я запустил скрипт используя strace
и конец вывода прилагается ниже. Я не знаю, как отладить этот вывод, но кажется, что PHP запрашивает что-то в последнем утверждении.
Как я могу отладить это дальше? Любая помощь будет оценена.
прямой выход:
fstat(12, {st_mode=S_IFREG|0777, st_size=1314, ...}) = 0
fstat(12, {st_mode=S_IFREG|0777, st_size=1314, ...}) = 0
fstat(12, {st_mode=S_IFREG|0777, st_size=1314, ...}) = 0
fstat(12, {st_mode=S_IFREG|0777, st_size=1314, ...}) = 0
mmap(NULL, 1314, PROT_READ, MAP_SHARED, 12, 0) = 0x7fb8b969c000
munmap(0x7fb8b969c000, 1314) = 0
close(12) = 0
umask(022) = 022
close(3) = 0
close(4) = 0
write(11, "\1\0\0\0\1", 5) = 5
shutdown(11, SHUT_RDWR) = 0
close(11) = 0
write(6, "\1\0\0\0\0\0\0\0", 8) = 8
close(2) = 0
close(1) = 0
munmap(0x7fb8b969a000, 4096) = 0
close(0) = 0
munmap(0x7fb8b969b000, 4096) = 0
munmap(0x7fb8b3191000, 790528) = 0
munmap(0x7fb8b32d3000, 266240) = 0
munmap(0x7fb8b3314000, 266240) = 0
munmap(0x7fb8b3355000, 266240) = 0
munmap(0x7fb8b3396000, 266240) = 0
munmap(0x7fb8b33d7000, 266240) = 0
munmap(0x7fb8b3418000, 266240) = 0
munmap(0x7fb8b3459000, 266240) = 0
munmap(0x7fb8b349a000, 266240) = 0
munmap(0x7fb8b34db000, 266240) = 0
munmap(0x7fb8b351c000, 266240) = 0
munmap(0x7fb8b94ba000, 266240) = 0
write(10, "\1\0\0\0\0\0\0\0", 8) = 8
poll([{fd=5, events=POLLIN}], 1, 4294967295Process 1358 detached
<detached ...>
Я обнаружил, что проблема была связана с ZMQ
расширение. Мой сценарий пытался отправить сообщение на несуществующий хост, и даже при отключении сокета в конце моего сценария сокет ждал, пытаясь отправить данные.
Для тех, у кого такая же проблема, ее можно решить, установив \ZMQ::SOCKOPT_LINGER
опция на сокете с низким значением, например
<?php
$context = new \ZMQContext(1);
$socket = new \ZMQSocket($context, \ZMQ::SOCKET_PUSH);
$dsn = 'tcp://127.0.0.1:1337';
$socket->connect($dsn);
$socket->send('hi');
echo 'Message sent' . PHP_EOL;
// Without this line, the script will wait forever after the exit statement
$socket->setSockOpt(\ZMQ::SOCKOPT_LINGER, 1000);
$socket->disconnect($dsn);
echo 'Socket disconnected' . PHP_EOL;
exit();
Других решений пока нет …