请问PHP从执行到结束,根据什么来决定的

运行环境:

  • CentOS 7、nginx 1.10、PHP 7.10 (fpm-php FastCGI)

代码如下:

$file = __DIR__.'/timeout.txt';
for ($i = 0; $i < 20; $i++) 
{
    $fopen = fopen($file, 'a+');
    fwrite($fopen, $i.': '.time().PHP_EOL);
    sleep(1);
}

fclose($fopen);

测试:

  1. 打开浏览器,访问PHP对应的URL

  2. 在文件没有全部写完的情况下,快速关闭浏览器

结果:

  • 关闭浏览器后,PHP仍旧在后台执行,直到文件写完

疑问:

  1. 如果说关闭不关闭浏览器PHP都会执行,那么自带的函数ignore_user_abort存在的区别是什么?

  2. 是不是只要调用PHP文件后,都会执行到最后才结束

阅读 1.6k
1 个回答

这是因为php只有在给客户端发送内容的时候才会检测是否客户端断开了连接,否则会一直执行。ignore_user_abort函数的作用是设置检测到客户端断开后也继续执行。

所以,并不是只要调用就会直到结束。可以执行下下面的代码看看,浏览器断开后确实就终止了

<?php 
$file = __DIR__.'/timeout.txt';
for ($i = 0; $i < 20; $i++)
{
    // 输出内容给客户端,可以检测到客户端是否已经断开
    echo ".";
    ob_flush();
    flush();

    $fopen = fopen($file, 'a+');
    fwrite($fopen, $i.': '.time().PHP_EOL);
    sleep(1);
}

fclose($fopen);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题