我运行了一个大约需要 20 分钟才能完成的过程,我只是想知道 PHP 是否可以在该过程完成之前保持连接处于活动状态。
需要明确的是,这个页面会有一个按钮,当你按下它时,它会调用一个 php 页面来运行一个 sql 查询,在主页面中我只是等待 Http 请求完成以发送成功消息。
我运行了一个大约需要 20 分钟才能完成的过程,我只是想知道 PHP 是否可以在该过程完成之前保持连接处于活动状态。
需要明确的是,这个页面会有一个按钮,当你按下它时,它会调用一个 php 页面来运行一个 sql 查询,在主页面中我只是等待 Http 请求完成以发送成功消息。
对于设置为占用一些时间的查询,您应该将一些自动化请求移动到组合中,如果您可以访问 linux 服务器,最好是 cronjobs。
使用 cronjobs,您可以在数据库中为特定值创建条目,链接到用户。如果挂起的查询已完成,cronjob 将启动,每 5 分钟执行一次查询。这将最大限度地减少用户需要坐在页面上直到完成的事实。因为您应该知道,用户离开活动页面的那一秒;所有活动连接、查询等都将停止。
脚本完成后,在最后制作一条自定义消息发送给用户,让他们知道他们的过程已经完成。
您还应该知道,PHP 从第 1 行到最后执行脚本;因此,例如,如果您的挂起在第 40 行;该脚本将位于该行,直到查询完成然后继续处理。
编辑:这仅是为了向您指出我要达到的方向,而不应该像您看到的那样使用它。这只是一个标记示例
<?php
if (isset($_POST['ButtonToExecute']))
{
// Query to update a table in your database which an external PHP script will work with
// Example Table Structure:
/*
Username
State
*/
if ($state == 0)
{
// Then update state to 1 with username to the username for the query to take place on
}
else
{
// Warn user that their process will take longer to complete as their already is an active query in process
// but add them to a secondry pipeline which will be picked up on the next cronjob interval
}
}
?>
在您的 cronjob 中,可能有:
<?php
if ($state=='1')
{
// Execute your script
// After query execution update state to 2
// if state == 2 then insert custom message/email to send
}
?>
编辑您的 crontab:
yourpreferrededitor /etc/crontab
^ yourpreferrededitor 表示您的文本编辑器,无论是 nano 还是其他。
和你的 cronjob 行:
* * * * * root /usr/bin/php /var/www/cron.php
^ 这取自我每天每一分钟都在不断运行的当前 cronjob
Cronjob 将使用户能够离开页面,因为正如我上面提到的,用户离开脚本的第二秒......所有正在进行的进程都会停止。cronjob 将继续运行,无需用户交互(除了他们发出初始请求)
如果您设置超时限制并忽略用户中止,您可以在普通的 php 脚本中执行此操作,但这是一个坏主意,因为如果脚本有效,您的用户将没有任何反馈。
在我工作的公司,我们遇到了同样的问题我们做了什么:
顺便说一句,所有智者的例子都在问为什么需要这么长时间:
如果您必须处理具有数百万个节点的树但构建它可能需要几个小时,那么使用传递外壳可以大大加快您的应用程序。
在您的 PHP ini 中,您可以设置脚本的最大执行时间,但是您永远不希望用户在页面加载屏幕上坐那么久。
我可以建议的一件事是将您的最大执行时间增加到大约 30 分钟,然后在页面已经呈现后在 javascript 中调用它,这样用户就不会被留在黑暗中不知道脚本是什么正在做。