Php长查询执行

时间:2012-12-21 23:55:22

标签: php

我运行一个大约需要20分钟才能完成的过程,我只是想知道PHP是否可以保持连接处于活动状态直到进程完成。

要明确的是,这个页面会有一个按钮,按下它时会调用一个php页面来运行一个sql查询,在主页面我只是等待Http请求完成发送成功消息。 / p>

4 个答案:

答案 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脚本中执行此操作,但这是一个坏主意,因为如果脚本有效,您的用户将没有反馈。

在我工作的公司,我们遇到了同样的问题 我们做了什么:

  1. 在单独的脚本中运行查询。
  2. 在不等待结果的情况下启动脚本
  3. 将查询拆分为多个部分(使用限制和偏移)
  4. 让查询脚本将消息写入临时文件
  5. 实现状态屏幕,通过ajax
  6. 从日志中获取当前状态

    顺便提一下所有聪明人都会问为什么需要这么长时间的例子:

    使用transitive hull可以加速您的应用程序,如果您必须处理具有数百万个节点的树,但构建它可能需要数小时。

答案 2 :(得分:0)

你可以尝试:

set_time_limit(0);

您可能需要查看Set Time Limit

答案 3 :(得分:0)

在PHP ini中,您可以为脚本设置最长执行时间,但是您永远不要让用户长时间坐在页面加载屏幕上。

我可以建议的一件事是将你的最大执行时间增加到大约30分钟左右,然后在页面已经渲染后在javascript中调用它,这样用户就不会在黑暗中不知道是什么脚本正在做。