zeromq — процесс CLI PHP зависает навсегда при выходе

У меня есть 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 ...>

3

Решение

Я обнаружил, что проблема была связана с 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();
6

Другие решения

Других решений пока нет …