当前位置: 首页 > 面试题库 >

用户离开页面后,php执行会停止吗?

戚俊健
2023-03-14
问题内容

我想基于某种形式的输入运行相对耗时的脚本,但我宁愿不求助于cron,所以我想知道通过ajax请求的php页面是否将继续执行直到完成,或者如果该脚本页面停止,用户离开页面。

它直到文件末尾的json_encode才真正输出到浏览器,那么在此之前的所有内容仍然可以执行吗?


问题答案:

这取决于。

从http://us3.php.net/manual/zh/features.connection-
handling.php

当PHP脚本正常运行时,NORMAL状态处于活动状态。如果远程客户端断开连接,则ABORTED状态标志将打开。远程客户端断开连接通常是由用户按下STOP按钮引起的。

您可以决定是否希望客户端断开连接以导致脚本中止。有时,即使没有远程浏览器接收到输出,始终将脚本运行至完整状态也很方便。但是,默认行为是当远程客户端断开连接时脚本将中止。可以通过ignore_user_abortphp.ini指令以及相应的
php_value ignore_user_abortApache httpd.conf指令或通过
ignore_user_abort()函数来设置此行为 。

这似乎表示您问题的答案是“是的,如果用户离开页面,脚本将终止”。

但是请意识到,根据所使用的后端SAPI(例如mod_php),php无法检测到客户端已中止连接,直到尝试向客户端发送信息为止。如果长时间运行的脚本没有发出flush(),即使用户已关闭连接,该脚本也可能继续运行。

事情复杂是,即使你 做的
到的问题定期调用flush(),其输出缓冲,将导致捕获这些电话,并直到脚本完成反正不会送他们到客户端!

进一步
复杂化的事情是,如果你已经安装了Apache处理程序缓存的响应(例如mod_gzip),然后再次PHP将无法检测到连接被关闭,该脚本将继续卡车。

ew



 类似资料:
  • 我正在使用最新的JMeter 3.3运行最新的Selenium WebDriver测试,一切似乎都很好, 我只有1个线程配置了1秒的爬升和1个循环计数,但是在webdriver执行完成后,JMeter并没有停止整个测试执行,而是无限期地继续执行测试,我不确定为什么会发生这种情况,我正在使用chromedriver,我所做的所有配置都是按照JMeter文档进行的,我还添加了命令位于脚本末尾。请参考附

  • 问题内容: 在ajax调用后,我无法停止刷新页面。我已经尝试通过放置e.preventDefault(); 并返回false;同样,但我的页面再次刷新。 我不知道代码或某些问题是什么。请帮助我在ajax调用后停止刷新页面。解决这个问题将对我有很大的帮助。提前致谢。 这是我的代码: 问题答案: ID是否指向表单?如果是,则需要侦听Submit事件而不是单击click。如果您确实需要监听click事件

  • 问题内容: 我希望我的ReactJS应用在离开特定页面时通知用户。特别是一条弹出消息,提醒他/她进行以下操作: “更改已保存,但尚未发布。现在执行吗?” 我应该在全局范围内触发此操作,还是可以在react页面/组件内完成此操作? 我还没有发现任何关于后者的信息,我宁愿避免使用第一个。除非当然是其规范,否则这使我想知道如何执行这样的事情而不必向用户可以访问的所有其他可能的页面添加代码。 欢迎有任何见

  • 有没有办法阻止用户留下一个片段(点击后退按钮,从导航中导航到其他片段,等等)? 情况是,当用户点击将文件备份到USB设备时,备份过程开始(线程),如果他留下这个片段,备份过程会发生一些尴尬的事情,应用程序会崩溃。 我在想我是否可以使用一些生命周期回调,比如: 或 有没有其他方法来处理这种情况并提供最好的用户体验(可能是一些对话片段)?

  • 问题内容: 我正在写一个如下的shell脚本: 现在,我想要实现的是列出$ ACTIONS_DIR中的每个文件以执行该文件。$ ACTIONS_DIR下的每个文件都是另一个Shell脚本。 现在,这里的问题在于,使用exec之后,脚本将停止并且不会转到下一个文件。任何想法为什么会这样? 问题答案: 替换shell进程。如果只想将该命令作为子进程调用,则将其删除。

  • 问题内容: 我已经编写了一个包含循环的“ Hangman”游戏,不断询问用户字母,直到他们解决单词或耗尽生命。奇怪的是,在满足条件时循环不会停止。 这是包含循环的游戏逻辑的实现: 可变结果是从方法中获取返回值。这是实现。 难道是我返回导致循环不断循环的值的方式吗?我这样声明了这些值: 问题答案: 逻辑上,根据德摩根定律, 是相同的 这永远是一个真实的表达。 条件可能应该是 当应用与上述相同的法律时