Linux 6.1。 PHP 8.2.7。 KDE 等离子 5.x。 X11.
长期以来,我的 PHP CLI 脚本一直存在一个非常烦人的问题,该问题不断出现并导致问题。我现在终于做了一个最小的测试用例,希望能一劳永逸地解决这个问题。
如果你做了这三件事:
SIGHUP
信号注册一个处理函数(留空/不执行任何操作)...fgets(STDIN);
)...xterm -e php test.php
(由于与此问题无关的复杂原因,我必须这样称呼它)......那么生成的 XTerm 终端仿真器窗口将无法通过单击右上角的“X”来关闭!如果你点击它,什么也不会发生。
一旦您注释或删除注册信号处理程序的行,它就会让您在像上面一样运行时关闭窗口。
xterm -e php 1.php
= “X”不能 单击以关闭 XTerm 窗口。xterm -e php 2.php
= 单击“X”CAN 可关闭 XTerm 窗口。1.php
:
<?php
function dummy_handler() { /* deliberately left empty */ }
pcntl_signal(SIGHUP, 'dummy_handler');
$input = fgets(STDIN);
2.php
:
<?php
function dummy_handler() { /* deliberately left empty */ }
$input = fgets(STDIN);
我可以做什么来绕过这个?为了说清楚,我需要注册处理函数,我需要用
xterm
调用 -e
,并且我需要“等待输入”。我还应该指出,我已经尝试过那些经典的 setsid
和 nohup
Linux 技巧,但没有任何运气。我不明白到底是什么原因造成的。
请不要告诉我“只要记住使用 Ctrl + C”之类的;我需要能够通过单击“X”在某些 PHP CLI 脚本的自然寿命结束之前关闭它们,并且我需要能够在其关闭之前调用一些清理例程。 (在这个最小的示例中,处理函数是空的,只是为了证明在我不做任何奇怪/复杂的事情的情况下它仍然会发生。)
无论桌面环境和终端模拟器如何,它都可能发生,但我在 Linux 上使用 KDE Plasma 和 XTerm,这就是我需要它来工作的原因。
更新:在处理函数中使用
exit(1);
没有什么区别。
您可以通过将命令包装在 shell 命令中来解决此问题:
xterm -e sh -c php 1.php