0

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

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

4

4 回答 4

3

对于设置为占用一些时间的查询,您应该将一些自动化请求移动到组合中,如果您可以访问 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 将继续运行,无需用户交互(除了他们发出初始请求)

于 2012-12-22T00:47:34.967 回答
1

如果您设置超时限制并忽略用户中止,您可以在普通的 php 脚本中执行此操作,但这是一个坏主意,因为如果脚本有效,您的用户将没有任何反馈。

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

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

顺便说一句,所有智者的例子都在问为什么需要这么长时间:

如果您必须处理具有数百万个节点的树但构建它可能需要几个小时,那么使用传递外壳可以大大加快您的应用程序。

于 2012-12-22T00:43:59.950 回答
0

在您的 PHP ini 中,您可以设置脚本的最大执行时间,但是您永远不希望用户在页面加载屏幕上坐那么久。

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

于 2012-12-22T00:08:43.963 回答
0

你可以试试:

set_time_limit(0);

您可能想看看设置时间限制

于 2012-12-21T23:58:21.403 回答