PHP连接\u中止()和/或寄存器\u关闭\u函数间歇性工作

PHP连接\u中止()和/或寄存器\u关闭\u函数间歇性工作,php,Php,我有一个PHP脚本,它向用户输出一个文件(作为下载),该文件还用于记录用户正在下载的内容 基本结构如下: set_time_limit(0); ignore_user_abort(true); register_shutdown_function('shutdown_fn'); //as a fail safe (i think) //some other code here //do some mysql queries while(!feof($fh) && !conne

我有一个PHP脚本,它向用户输出一个文件(作为下载),该文件还用于记录用户正在下载的内容

基本结构如下:

set_time_limit(0);
ignore_user_abort(true);
register_shutdown_function('shutdown_fn'); //as a fail safe (i think)
//some other code here

//do some mysql queries

while(!feof($fh) && !connection_aborted()) {
    echo fread(....);
    ob_flush;
    ob_end_flush;
    sleep(1);
}
fclose($fh);

//do some more mysql queries here and set a boolean to track if it was done successfully

function shutdown_fn () {
    //check boolean to see if queries failed, if so, do them here
}
上面的代码似乎99%的时间都能正常工作。但是,在某些情况下,第二组查询根本不执行(其他1%)。我不知道为什么。发送给用户的文件从非常小到非常大(在这两种情况下,它们都工作得很好,所以我看不出一个大文件(或小文件)是如何破坏代码的)


有什么想法吗?我希望我已经对自己做了充分的解释

我需要看到更多的代码,比如打开/读取文件,以进一步帮助您,但是如果您真的想确定并且不依赖于one shutdown\u fn()函数,那么为什么不在脚本末尾自己调用它呢?重置shutdown_fn()中的布尔值,以便在触发实际关机时,sql查询不会运行两次。

是否检查了错误日志?也许它只是在30秒后被杀死/?设置时间限制(0);已在实际代码中设置。但我会看一下错误日志,看看是否有问题up@XonTaylor嗨,克逊。你知道答案了吗?我也有同样的问题,但解决方案已经花费了我很多时间,但显然我没有取得多大进展。关闭前的查询与函数本身中的查询完全相同。其想法是,如果脚本过早失败,第二组查询无法执行,那么shutdown\u fn将执行这些查询。至于打开/读取文件,我分别在while循环之前和之后使用标准的fopen/close。我希望我正确地理解了你。