22

Ctrl+を使用Cして CLI で実行されている PHP スクリプトを終了すると、シャットダウン関数も、インスタンス化されたオブジェクトのデストラクタも、出力バッファも処理されません。代わりに、プログラムは死ぬだけです。Ctrl+Cがやるべきことなので、これはおそらく良いことです。しかし、それを変更する方法はありますか?Ctrl+を強制的Cにシャットダウン機能を通過させることは可能ですか?

より具体的には、これはスクリプトの終了時にデータをシリアル化して保存することに関するもので、次回スクリプトを実行するときにデータを再ロードして再開できます。定期的にデータを保存することはできますが、最後の保存以降はすべて失われます。他にどのようなオプションがありますか?

4

3 に答える 3

12

明らかに PCNTL は *nix のみですが... 個々のシグナルすべてのハンドラーを登録して、より堅牢なソリューションを実現できますが、具体的には CTL+C 割り込みが発生したときに何かを行うことができます。

<?php
declare(ticks = 1);

pcntl_signal(SIGINT, function() {
    echo "Caught SIGINT\n";
    die;
});

while (true) {
    // waiting for your CTRL+C
}
于 2012-11-13T22:31:54.860 に答える
2

PCNTL 、特にpcntl_signal()を見てください

于 2012-11-13T22:30:54.213 に答える
1

@rdlowrey の回答とは対照的です。ループがユーザーによって中断された後に処理を行うことができないため、プレーンwhile(true)と関数die/exit内のそれを避けます。pcntl_signal

代わりに、次のより論理的な解決策を提案したいと思います。

declare(ticks = 1);

$running = true;

pcntl_signal(SIGINT, function() {
    global $running;
    $running = false;
});

while($running)
{
    echo('running…'.PHP_EOL);
}

echo(PHP_EOL.'User interrupted the loop. Shutting down cleanly.'.PHP_EOL);
exit();
于 2018-04-10T04:29:51.653 に答える