PHP CLI进程在退出时永远挂起

Joh*_*han 3 php command-line-interface zeromq strace

我有一个PHP脚本,我在命令行上运行,当脚本应该退出时,它只是永远挂起.它发生在Windows和Linux上,因此它与操作系统无关.

我已经尝试用XDebug调试代码,踩到最后的exit声明(尝试过die没有运气).在对某些对象运行几个析构函数之后,没有什么可以逐步完成的,并且该过程只是永远等待.它没有做任何事情,没有消耗任何资源.让进程退出的唯一方法是杀死它,例如Ctrl+C

它并没有发生在我的所有脚本中,但我有一个案例,我可以重现.我不确定它是否在我的代码,库代码(主要是Symfony,Doctrince等)或PHP本身.

我已经使用了脚本strace,输出的结尾附在下面.我不知道如何调试此输出,但似乎PHP正在查询最后一个语句中的内容.

我该如何进一步调试?任何帮助,将不胜感激.

strace输出:

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 ...>
Run Code Online (Sandbox Code Playgroud)

Joh*_*han 7

我发现问题与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();
Run Code Online (Sandbox Code Playgroud)