在CLI上执行脚本中止后执行代码

时间:2015-06-19 07:47:59

标签: php command-line-interface

我的脚本在PHP中止后,我尝试执行一些最终代码。所以,让我们说我有这个PHP脚本:

while(true) {
    echo 'loop';
    sleep(1);
}

如果我用$ php script.php执行脚本,它会运行直到给定的执行时间。

现在我喜欢在脚本中止后执行一些最终代码。所以,如果我

  • 点击Ctrl+C
  • 执行时间结束

在这些情况下是否有可能进行一些清理?

我用pcntl_signal尝试过,但没有运气。还有register_shutdown_function,但只有在脚本成功结束时才会调用此方法。

更新

我发现(对于rch的链接)我能以某种方式"赶上"事件:

pcntl_signal(SIGTERM, $restartMyself); // kill
pcntl_signal(SIGHUP,  $restartMyself); // kill -s HUP or kill -1
pcntl_signal(SIGINT,  $restartMyself); // Ctrl-C

但是如果我用

扩展我的代码
$cleanUp = function() {
    echo 'clean up';
    exit;
};

pcntl_signal(SIGINT, $cleanUp);

如果我点击$cleanUp,脚本会继续执行,但不会尊重Ctrl+C闭包中的代码。

3 个答案:

答案 0 :(得分:5)

函数pcntl_signal()是使用Ctrl-C(以及其他信号)中断脚本时的情况的答案。你必须注意文档。它说:

  

您必须使用declare()语句指定程序中允许回调以使信号处理程序正常运行的位置。

declare()语句除其他外,还安装了一个回调函数,通过调用函数pcntl_signal_dispatch()来处理自上次调用以来收到的信号的调度,函数pcntl_signal_dispatch()又调用您安装的信号处理程序

或者,如果您认为该功能适用​​于您的代码流程(并且根本不使用declare(ticks=1)),您可以自行调用该功能{{3}}。

这是一个使用declare(ticks=1)的示例程序:

declare(ticks=1);

// Install the signal handlers
pcntl_signal(SIGHUP,  'handleSigHup');
pcntl_signal(SIGINT,  'handleSigInt');
pcntl_signal(SIGTERM, 'handleSigTerm');


while(true) {
    echo 'loop';
    sleep(1);
}

// Reset the signal handlers
pcntl_signal(SIGHUP,  SIG_DFL);
pcntl_signal(SIGINT,  SIG_DFL);
pcntl_signal(SIGTERM, SIG_DFL);



/**
 * SIGHUP: the controlling pseudo or virtual terminal has been closed
 */
function handleSigHup()
{
    echo("Caught SIGHUP, terminating.\n");
    exit(1);
}

/**
 * SIGINT: the user wishes to interrupt the process; this is typically initiated by pressing Control-C
 *
 * It should be noted that SIGINT is nearly identical to SIGTERM.
 */
function handleSigInt()
{
    echo("Caught SIGINT, terminating.\n");
    exit(1);
}

/**
 * SIGTERM: request process termination
 *
 * The SIGTERM signal is a generic signal used to cause program termination.
 * It is the normal way to politely ask a program to terminate.
 * The shell command kill generates SIGTERM by default.
 */
function handleSigTerm()
{
    echo("Caught SIGTERM, terminating.\n");
    exit(1);
}

答案 1 :(得分:0)

这可能有一些非常有用的信息,看起来他们正在尝试使用您尝试的相同的东西,但看起来似乎有积极的结果?也许这里有一些你没想过或可能错过的东西。

Automatically Restart PHP Script on Exit

答案 2 :(得分:0)

检查:connection_aborted()

http://php.net/manual/en/function.connection-aborted.php

以下是如何使用它来实现您想要的效果的示例:

http://php.net/manual/en/function.connection-aborted.php#111167