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

PHP CLI进程在退出时永远挂起,php,zeromq,command-line-interface,strace,Php,Zeromq,Command Line Interface,Strace,我有一个在命令行上运行的PHP脚本,当脚本应该退出时,它会永远挂起。它发生在Windows和Linux上,因此与操作系统无关 我尝试过用XDebug调试代码,进入最后的exit语句(也尝试过die,但没有成功)。在一些对象上运行了一些析构函数之后,就没有什么需要执行的了,整个过程只会永远等待。它不做任何事情,不消耗任何资源。让进程退出的唯一方法是终止它,例如Ctrl+C 这并不是发生在我所有的脚本中,但我有一个案例可以重现。我不确定它是在我的代码、库代码(主要是Symfony、Doctrince

我有一个在命令行上运行的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 ...>
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(空,1314,保护读取,映射共享,12,0)=0x7fb8b969c000
munmap(0x7fb8b969c0001314)=0
关闭(12)=0
乌马斯克(022)=022
关闭(3)=0
关闭(4)=0
写入(11,“\1\0\0\1”,5)=5
停堆(11,停堆)=0
关闭(11)=0
写入(6,“\1\0\0\0\0\0”,8)=8
关闭(2)=0
关闭(1)=0
munmap(0x7FB8B969A00004096)=0
关闭(0)=0
munmap(0x7fb8b969b000,4096)=0
munmap(0x7FB8B3191000790528)=0
munmap(0x7FB8B32000266240)=0
munmap(0x7fb8b331400266240)=0
munmap(0x7FB8B335500266240)=0
munmap(0x7FB8B339600266240)=0
munmap(0x7fb8b33d7000,266240)=0
munmap(0x7FB8B3418000266240)=0
munmap(0x7fb8b3459000,266240)=0
munmap(0x7FB8B349A0000266240)=0
munmap(0x7fb8b34db000,266240)=0
munmap(0x7fb8b351c000266240)=0
munmap(0x7fb8b94ba000,266240)=0
写入(10,“\1\0\0\0\0\0”,8)=8
轮询([{fd=5,events=POLLIN}],14294967295进程1358已分离

我发现问题与
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();