【问题标题】:PHP CLI process hangs forever on exitPHP CLI 进程在退出时永远挂起
【发布时间】:2015-01-09 03:33:55
【问题描述】:

我有一个在命令行上运行的 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 ...>

【问题讨论】:

    标签: php zeromq command-line-interface strace


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-22
      • 2012-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多