如果我通过 jquery ajax 调用一个 php 文件,它包含一个脚本来做一些需要一段时间的事情——例如上传一个大视频——然后我关闭页面:php脚本是否继续加载视频?
关闭页面后脚本会继续运行吗?
见这里:http : //php.net/manual/en/function.ignore-user-abort.php
int ignore_user_abort ([ bool $value ] )
设置客户端断开连接是否应导致脚本中止。
当 PHP 作为命令行脚本运行时,如果脚本的 tty 消失而脚本没有终止,那么脚本将在下次尝试写入任何内容时死亡,除非将值设置为 TRUE
还有一个同名的 PHP 配置选项:http : //php.net/manual/en/misc.configuration.php
默认情况下,如果你什么都不做,根据 PHP 手册,默认是中止脚本。 http://php.net/manual/en/features.connection-handling.php
必要的更新
看来我(在不知不觉中)欺骗了我的“声誉点”,因为我没有提供(正确的)答案,但现在要感谢测试并继续从“ mellamokb ”中轻推:
引用:“好的,我查看了 PHP 源代码,如果我没有遗漏任何内容,我现在有了答案。仅当 PHP 收到尝试向用户输出某些内容的错误时才会检查“ignore_user_abort”标志. 所以,在我的理解中,没有办法中断不产生任何输出的代码。”
好吧,我并没有完全离开,但重要的是要知道这一切都取决于您的脚本是否产生了任何输出!
如果您阅读本文,也请查看下面的评论。
通过 Web 服务器运行的 PHP 脚本不会停止,直到:
- 有人杀死服务器
- 服务器杀死 php 脚本
当用户中止脚本时,PHP 将继续运行,直到它尝试将某些内容发送回浏览器。
例如,即使用户中止,仍然脚本将永远继续:
while(true){
echo 'go'.PHP_EOL;
}
它将永远持续下去,因为“回声”将写入缓冲区,并且在脚本完成之前缓冲区不会发送到浏览器,这永远不会发生。
一旦用户中止,以下脚本将停止:
while(true){
echo 'go'.PHP_EOL;
flush();
ob_flush();
}
该脚本将停止,因为 flush() 和 ob_flush() 将强制 PHP 将其缓冲区发送到浏览器,如果用户已中止,这将停止 PHP 脚本。在这种情况下,函数 ignore-user-abort() 将强制 PHP 忽略中止。
此外,如果您使用的是 PHP 会话,则它们是另一种棘手的情况。例如,如果您正在执行 AJAX,并且您实际上向 PHP 脚本发送了两个 AJAX 请求,并且该 PHP 脚本需要使用 session_start() 进行会话。第一个 AJAX 查询将正常工作,但是第二个将必须等到第一次调用完成,因为第一个脚本已锁定会话。第一个脚本最终可能会使用 session_write_close() 过早地释放会话;
默认没有。请参阅连接处理文档,尤其是:
您可以决定是否希望客户端断开连接导致脚本中止。有时,即使没有远程浏览器接收输出,始终让脚本运行完成也很方便。但是,默认行为是在远程客户端断开连接时中止您的脚本。
脚本将运行由 max_execution_time 设置的时间(默认为 30s)
警告当 PHP 在安全模式下运行时,此功能无效。除了关闭安全模式或更改 php.ini 中的时间限制外,没有其他解决方法。 注意: set_time_limit() 函数和配置指令 max_execution_time 只影响脚本本身的执行时间。在确定脚本运行的最长时间时,不包括在脚本执行之外发生的活动(例如使用 system() 的系统调用、流操作、数据库查询等)上花费的任何时间。在测量时间是真实的 Windows 上,情况并非如此。 引自http://php.net/manual/en/function.set-time-limit.php
你可以通过运行来测试这个
<?php
unlink('cocorico.txt');
while(true){
file_put_contents('cocorico.txt', microtime(true).PHP_EOL, FILE_APPEND);
}
它会在 30 秒后停止(无论您是否关闭浏览器),您可以获得默认的执行时间,echo ini_get('max_execution_time');
并且可以设置set_time_limit(3);
为 标记为已接受的答案仅是正确的,ignore_user_abort
但不要惊慌您的“失败”脚本会如果您未将最大执行时间设置为 0,则永远运行 - 无限制;
从我对这些东西的工作原理的一点了解来看。从 HTTP 协议的角度来看,我会说是的,脚本会继续运行,因为浏览器只是向服务器发送请求页面的请求,然后服务器开始执行脚本并且不发送或接收来自浏览器,直到脚本完成加载和生成 html 输出,然后服务器将结果输出发送到浏览器并完成工作。
看,浏览器无法通过 HTTP 协议“告诉”服务器用户不再查看页面。但是,HTTP 协议通过流套接字运行在 TCP 连接之上,TCP 连接一直保持活动状态,直到其中一端选择中止连接(或达到某个超时),现在我真的不知道如何浏览器处理这个。浏览器可以只打开一个连接,发送请求并关闭连接,然后服务器等待脚本并在另一个连接上发送响应。或者浏览器可以打开一个连接,保持这个连接处于活动状态,直到服务器响应同一个连接。如果事情以这种方式工作,那么服务器真的有办法知道用户是否不再查看页面,只需检查连接是否仍然有效或已被客户端关闭。所以那将是一个不。
不知道是怎么回事。