Php 即使脚本是“睡眠”;被打断了;?

Php 即使脚本是“睡眠”;被打断了;?,php,Php,在PHP中是否可以使某些东西休眠,同时确保即使脚本被中断也能执行它 <?php //let's delete something echo 'Deleting something in 10 seconds'; sleep(10); file_put_contents("newfile", "content here"); 然而,我认为您需要从客户端完成这些工作,PHP的方法是利用 更新 上述解决方案在apache中运行良好,对于nginx,您需要将

在PHP中是否可以使某些东西休眠,同时确保即使脚本被中断也能执行它

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

    sleep(10);

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

然而,我认为您需要从客户端完成这些工作,
PHP
的方法是利用


更新 上述解决方案在apache中运行良好,对于nginx,您需要将此选项添加到nginx.conf中

fastcgi_keep_conn on;
将此标题添加到文件中

header('X-Accel-Buffering: no');
如果脚本被中断,使用该命令可以捕获。注意,它不会与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);

对于interrupted,您的意思是在10秒结束之前断开与客户端的连接?如果是这样的话,那么你可以使用php函数ignore_user_abort()read@RaymondNijland我的意思是如果我去
website.com/delete.php
或者其他什么,它应该
echo“在10秒内删除文件”然后在10秒后“执行另一个命令”。它不应该关心用户是否关闭窗口、刷新页面或诸如此类的事情。如果你明白我的意思的话,我基本上想要一个PHP中的“cronjob”。好的,当用户关闭浏览器或点击刷新按钮时,你可以使用ignore\u user\u abort()保持脚本运行。@Mortenmolder也许你在找
ignore\u user\u abort()
调用未定义的函数ob\u flush\u end()
我收到了这个错误,不再有错误,但它不会立即响应。它等待10秒,然后回声,然后删除。我需要它立即回显。
ob\u implicit\u flush(1);回声“你好”;ob_end_flush();睡眠(5);呼应“世界”请考虑此示例,在浏览器中执行它,检查不工作的Outlook。由于PHP被编译等等,它不会在5秒钟后回显,而是等待5秒钟,然后在同一时间回显Hello和World。你试过了吗?请确保已打开隐式刷新
ini\u集(“隐式刷新”,1)
和大多数flush可能在apachegzip模块下不起作用,请确保您也禁用了它,
ini\u集('zlib.output\u compression',0)
很遗憾,我没有启用pcntl\u信号编译PHP。另外,这是否允许我在页面加载时立即回显页面,然后在10秒钟后执行其他操作?就像一个
error\u log()
只是为了简单起见。所以我可以:
echo'Hello',然后在10秒后触发
错误日志()?这就是我所需要的,到目前为止,它似乎不可能与PHP。因此,在信号处理程序中,需要放置echo();睡眠(10);错误_log();。但是你确定你仍然有中断信号,特别是在网络脚本中?因为我怀疑你有任何中断。不,我认为整个“中断”部分应该被忽略。本质上,没有任何东西可以中断已加载但未挂起请求的页面。将中断从等式中去掉,并将注意力集中在“回波然后误差记录”上。
<?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);