是否可以在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秒钟。
答案 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);