繁体   English   中英

即使在关闭页面后,脚本是否会继续运行?

[英]Will a script continue to run even after closing a page?

如果我通过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;
}

它将永远继续下去,因为“echo”将写入缓冲区,并且缓冲区将不会被发送到浏览器,直到脚本完成,这将永远不会发生。

用户中止后,以下脚本将立即停止:

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设置的时间(默认为30秒)

警告当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');得到你的默认执行时间echo ini_get('max_execution_time'); 并且可以设置为set_time_limit(3); 标记为已接受的答案仅对ignore_user_abort是正确的,但如果未将max exec时间设置为0 - 无限制,请不要惊慌您的“失败”脚本将永远运行;

从我对这些东西的运作方式的了解很少。 从HTTP协议的角度来看,我会说是,脚本将继续运行,因为浏览器只是向服务器发送请求页面的请求,然后服务器开始执行脚本而不发送或接收来自浏览器直到脚本完成加载并生成html输出,然后服务器将结果输出发送到浏览器并完成了工作。

请注意,浏览器无法通过HTTP协议“告诉”服务器用户不再查看该页面。 但是,HTTP协议通过流套接字在TCP连接之上运行,TCP连接保持活动状态,直到其中一端选择中止连接(或达到某个超时),现在我真的不知道如何浏览器处理这个。 浏览器只能打开连接,发送请求并关闭连接,然后服务器等待脚本并在另一个连接上发送响应。 或者浏览器可以打开连接,保持此连接活动,直到服务器响应相同的连接。 如果事情以这种方式工作,那么服务器真的可以通过检查连接是否仍然存在或者是否已被客户端关闭来知道用户是否不再查看页面。 所以这将是一个不。

Dunno很多关于那个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM