即使脚本“被打断”也会睡觉?

时间:2017-05-13 10:59:45

标签: php

是否可以在PHP中进行睡眠,同时确保即使脚本被中断也会执行它?

<?php
    //let's delete something
    echo 'Deleting something in 10 seconds';

    sleep(10);

    file_put_contents("newfile", "content here");

基本上我想告诉用户“你的文件在10秒内被删除”然后立即执行file_put_contents()(我知道,但这只是一个例子而不是我真正做的事情)。< / p>

我不希望超时用户或使网站看起来像加载或任何东西。当他们请求页面时,它应该向用户回应一些内容并在10秒之后执行file_put_contents()。那可能吗?现在它不会回应任何东西或做任何事情,因为它会使整个脚本睡眠10秒钟。

2 个答案:

答案 0 :(得分:0)

但是我相信你需要从客户端做这些事情,PHP方式是利用Output Control

if($_GET("delete")) {

    ob_implicit_flush(1); // turn on the implicit flush

    echo 'Deleting something in 10 seconds';

    ob_end_flush(); // perform printing some immediate output 

    sleep(10);

    file_put_contents("newfile", "content here");
}

更新

上述解决方案在apache中运行正常,对于nginx,您需要将此选项添加到您的nginx.conf

fastcgi_keep_conn on;

将此标题添加到您的文件

header('X-Accel-Buffering: no');

答案 1 :(得分:0)

如果脚本被中断,您可以使用pcntl_signal。请注意,它不能使用SIGKILL信号。

<?php

declare(ticks = 1);

//Remembering current time (if script will be interrupted we will compare it to determine how much time must we wait)
$startSleepAt = time();

//Setting handler for SIGINT signal
pcntl_signal(SIGINT,  function($signal) use ($startSleepAt) {
    //Waiting for remaining time
    sleep(time() - $startSleepAt);
    //Do your stuff here
});
sleep(10);