Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关闭浏览器可以终止服务器上的PHP脚本吗?_Php_Webserver - Fatal编程技术网

关闭浏览器可以终止服务器上的PHP脚本吗?

关闭浏览器可以终止服务器上的PHP脚本吗?,php,webserver,Php,Webserver,假设一个用户单击了一个按钮,导致一个jQueryAjax请求被发送到我的服务器 服务器响应ajax请求开始一个复杂的过程。假设这个过程需要5分钟才能完成 与此同时,用户感到厌烦并关闭浏览器窗口 服务器上的脚本将继续其处理,直到在正常时间完成,还是将停止 如果用户访问一个url,例如example.com/process.php?data=xxx,情况也是如此。这将启动process.php,开始处理数据,并需要5分钟完成处理 此处理是否始终继续,或者如果用户关闭浏览器,它是否会停止 (我问这个问

假设一个用户单击了一个按钮,导致一个jQueryAjax请求被发送到我的服务器

服务器响应ajax请求开始一个复杂的过程。假设这个过程需要5分钟才能完成

与此同时,用户感到厌烦并关闭浏览器窗口

服务器上的脚本将继续其处理,直到在正常时间完成,还是将停止

如果用户访问一个url,例如example.com/process.php?data=xxx,情况也是如此。这将启动process.php,开始处理数据,并需要5分钟完成处理

此处理是否始终继续,或者如果用户关闭浏览器,它是否会停止


(我问这个问题是因为我担心这个过程会半途而废,导致数据损坏)。

除非它是作为后台进程启动的,即在结束时使用(&a)。。。它只会终止


将浏览器关闭得更近一点。。。它最终会停止,但会在web服务器意识到连接已断开之前处理一段时间。

PHP不会注意到浏览器关闭了连接,除非它尝试输出某些内容(例如echo)。如果无法输出某些内容,脚本将终止,除非启用

因此,只有满足以下条件,脚本才会终止:

  • 脚本尝试输出某些内容(因为在此之前脚本不会注意到用户中止了连接)
  • 并且php的设置为off(如果设置为off,则如果输出失败,php将终止脚本)
您可以通过启用来避免脚本终止

您可以随时使用检查浏览器是否中止了请求


脚本可能因其他原因(如最大执行时间、异常等)意外终止;因此,您应该使用事务,以便在脚本异常终止时取消完成一半的更改。

请参阅:。这取决于“忽略用户中止”设置和其他一些条件。

PHP的默认行为是,当远程客户端断开连接时,脚本将中止,这通常是由用户关闭浏览器或点击停止按钮引起的。当某人关闭与在CLI模式下运行的脚本的远程连接时,也可能发生这种情况。脚本中止的一个例外是,如果您已使用
register\u shutdown\u function()
注册了关闭函数。有关详细说明,请参见PHP文档中的页面

脚本实际终止的点取决于调用
flush()
的时间,它实际上试图将当前输出一直推送到浏览器/客户端。此时,如果连接状态为“中止”,则脚本将终止,除非忽略用户中止


需要注意的重要一点是,您可以控制这种行为是否发生,因为您指定有时不希望发生这种情况。使用
ignore\u user\u abort()
函数或在php.ini中设置相关指令

在window.onbeforeunload上中止HttpRequest?92岁的人问得好!!:p您的意思是,如果两种情况都发生,或者其中任何一种情况都发生,
PHP将不会检测到用户已中止连接,直到尝试向客户端发送信息。简单地使用echo语句并不能保证信息被发送,请参见flush()。
,因此您似乎是对的。使用哪台web服务器(即Apache、IIS)重要吗?或者它们在这方面的功能是否相同?可能会有一些细微的差异,我猜,检测到中止的速度有多快,等等;你必须测试一下自己你是说浏览器后台程序?这个答案让人觉得误导和不完整。你能分享更多细节吗?您将如何通过浏览器启动这样一个“后台进程”?关于第二段:“最终停止”的含义有可靠的来源吗?
PHP不会检测到用户中止了连接,直到尝试向客户端发送信息。