我运行一个大约需要20分钟才能完成的过程,我只是想知道PHP是否可以保持连接处于活动状态直到进程完成。
要明确的是,这个页面会有一个按钮,按下它时会调用一个php页面来运行一个sql查询,在主页面我只是等待Http请求完成发送成功消息。 / p>
答案 0 :(得分:3)
对于设置占用一段时间的查询,您应该将一些自动化请求移动到混合中,如果您有权访问Linux服务器,最好是cronjobs。
使用cronjobs,您可以在数据库中创建链接到用户的特定值的enteries。如果挂起的查询已经完成,那么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
^你的preferrededdeditor意味着你的文本编辑器,无论是纳米还是其他。
和你的cronjob行:
* * * * * root /usr/bin/php /var/www/cron.php
^这取自我每天每分钟不断运行的当前cronjob
Cronjob将为用户提供离开页面的能力,因为正如我上面提到的,用户导航的第二个远离脚本..所有正在进行的进程停止。 cronjob将继续运行,无需用户交互(除了他们提出初始请求)
答案 1 :(得分:1)
如果设置超时限制并忽略用户中止,你可以在普通的PHP脚本中执行此操作,但这是一个坏主意,因为如果脚本有效,您的用户将没有反馈。
在我工作的公司,我们遇到了同样的问题 我们做了什么:
顺便提一下所有聪明人都会问为什么需要这么长时间的例子:
使用transitive hull可以加速您的应用程序,如果您必须处理具有数百万个节点的树,但构建它可能需要数小时。
答案 2 :(得分:0)
答案 3 :(得分:0)
在PHP ini中,您可以为脚本设置最长执行时间,但是您永远不要让用户长时间坐在页面加载屏幕上。
我可以建议的一件事是将你的最大执行时间增加到大约30分钟左右,然后在页面已经渲染后在javascript中调用它,这样用户就不会在黑暗中不知道是什么脚本正在做。