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

时间:2011-05-13 19:57:07

标签: php javascript

如果我通过jquery ajax调用一个php文件,它包含一个脚本来做一些需要一段时间的东西 - 例如上传一个大视频 - 然后我关闭页面:php脚本是否继续加载视频?

5 个答案:

答案 0 :(得分:19)

见这里: 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 “:

Quote: “好吧,我看了一下PHP源代码,如果我没有错过任何内容,我现在有了答案。只有在PHP收到错误尝试向用户输出内容时才会检查”ignore_user_abort“标志。所以在我的理解中,没有办法打断不产生任何输出的代码。“

好吧,我并没有完全关闭,但重要的是要知道这一切都取决于你的脚本是否产生任何输出!

如果您阅读此内容,请查看以下评论​​。

答案 1 :(得分:15)

通过Web服务器运行的PHP脚本不会停止,直到:

  • 有人杀了服务器
  • 服务器终止php scrip

当用户中止脚本时,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();

过早地释放会话

答案 2 :(得分:4)

默认没有。请参阅Connection Handling文档,尤其是:

  

您可以决定是否需要   客户断开连接导致您的   要中止的脚本。有时它是   总是让你的脚本运行方便   完成即使没有   远程浏览器接收输出。   但是默认行为是   你的脚本要在中止时中止   远程客户端断开连接。

答案 3 :(得分:2)

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

答案 4 :(得分:1)

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

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

Dunno很多关于那个。