Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.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 - Fatal编程技术网

即使用户关闭了浏览器,PHP脚本能否继续运行?

即使用户关闭了浏览器,PHP脚本能否继续运行?,php,Php,例如,有一个非常简单的PHP脚本更新数据库中的一些表,但这个过程需要很长时间(可能10分钟)。因此,即使用户关闭了浏览器,我也希望此脚本继续处理,因为有时用户不等待,而是关闭浏览器或转到其他网页 无论客户端在做什么,服务器端脚本都将继续它正在做的事情 编辑:顺便问一下,您确定要打开10分钟的页面吗?我建议您使用一个任务队列(其项目由cron及时执行),并将用户重定向到“确定,我在上面”页面。如果脚本完全基于服务器(没有对用户的反馈),则即使客户端关闭,也会这样做 PHP的一般架构是,客户端向脚本

例如,有一个非常简单的PHP脚本更新数据库中的一些表,但这个过程需要很长时间(可能10分钟)。因此,即使用户关闭了浏览器,我也希望此脚本继续处理,因为有时用户不等待,而是关闭浏览器或转到其他网页

无论客户端在做什么,服务器端脚本都将继续它正在做的事情


编辑:顺便问一下,您确定要打开10分钟的页面吗?我建议您使用一个任务队列(其项目由cron及时执行),并将用户重定向到“确定,我在上面”页面。

如果脚本完全基于服务器(没有对用户的反馈),则即使客户端关闭,也会这样做


PHP的一般架构是,客户端向脚本发送请求,脚本向用户提供回复。如果没有向用户返回任何内容,即使用户不再在另一端,脚本仍将执行。更简单的是:服务器和客户端之间没有固定的常规脚本连接。

您可以使用crontab文件使PHP脚本每20分钟运行一次,该文件包含时间和要运行的命令,在这种情况下,它将是PHP脚本。

要直接回答您的问题,请参阅

更广泛地说,这里可能存在架构问题


如果有许多用户可以启动这些功能,那么您将希望web应用程序将作业添加到某种队列中,并拥有一定数量的后台进程来完成所有工作。

是的。服务器不知道用户是否关闭了浏览器。至少它没有立即注意到这一点


否:服务器可能(取决于配置方式)不允许php脚本运行10分钟。在廉价的共享主机上,我不会依赖运行超过合理响应时间的脚本。

如果任务需要10分钟,请不要使用浏览器直接执行。您还有很多其他选择:

  • 使用cronjob执行任务 定期
  • 有浏览器吗 请求将新行插入到 数据库表,以便 cronjob可以处理新行和 使用 恰当的论据
  • 拥有 浏览器请求将消息写入 队列系统,它有一个订阅服务器 倾听这样的事件(然后 执行脚本)
虽然其中一些建议对于您的情况来说可能有些过分,但关键的组合功能是将浏览器请求与作业的执行分离,以便异步完成


如果需要随进度更新浏览器窗口,则需要使用定期执行的AJAX请求来检索作业状态。

在客户端终止连接后,PHP脚本将继续运行(不这样做会有安全风险),但最多只能运行
最长执行时间
(在php.ini中设置或通过php脚本设置,默认情况下通常为30秒)

例如:

<?php
    $fh = fopen("bluh.txt", 'w');
    for($i=0; $i<20; $i++) {
        echo $i."<br/>";
        fwrite($fh,$i."\n");
        sleep(1);
    }
    fclose($fh);
?>

在浏览器中开始运行,并在完成之前关闭浏览器。20秒后,您会发现该文件包含
$i
的所有值


将for循环的上限改为100而不是20,您会发现它只在0到29之间运行。由于PHP的
max\u execution\u time
脚本超时并死亡。

…不完全正确:通常情况下,存在“kill”保护长时间运行的php脚本:这些脚本采用crontab条目的形式。@jldupont:我不是php专家,但这些脚本与客户端有关系吗?@shanyu-不确定jldupont在说什么。php的配置变量可以杀死长时间运行的脚本,但它们与cron完全无关。这不是真的,无论客户端如何,服务器端脚本都不会一直运行……因此,如果我想将浏览器请求与作业的执行分离,如何请求另一个php脚本,而用户的当前请求将正常继续。因此,当用户请求任何url时,此请求将启动另一个脚本(独立于用户浏览器和其他请求)。用户将继续正常浏览网站。如果我想将浏览器请求与作业执行分离,我如何请求另一个php脚本,而用户当前的请求将正常继续。因此,当用户请求任何url时,此请求将启动另一个脚本(独立于用户浏览器和其他请求)。用户将继续正常地在网站上冲浪。我如何才能做到这一点?看到那些要点了吗?这些都是实现这一点的方法。在大多数情况下,设置一个小数据库表来保存后台进程的输入效果很好。然后,您可以启动一些PHP脚本来执行作业,可以通过cron,也可以通过其他方法数据库中队列上的作业记录。该记录可以包含用户提供给您的任何数据。cron作业查看队列,获取下一个作业,读取用户提供的参数,然后使用这些输入来完成其工作。仔细阅读David的第二个要点。这正是您想要做的。如何执行php URL(而不是脚本)它被记录到数据库中的新行,因为我使用框架。所以常规的cron作业可以处理漂亮的答案。但是,如果脚本尝试刷新输出到浏览器,而不是写入文件,该怎么办?例如,使用
echo“…;flush();ob_flush()
?我认为脚本将终止,因为输出流将不再可用。@ban geoengineering我最初认为您是正确的,但我测试了您的建议(上面的代码已经每秒使用“echo”),但在我的系统上,关闭选项卡时脚本没有中止。奇怪。