【问题标题】:Running background processes after a web request在 Web 请求后运行后台进程
【发布时间】:2010-12-24 15:23:33
【问题描述】:

我有兴趣在网络请求后启动进程,或者可能在初始线程完成后分叉一个新进程。

我不想使用 cron,因为我将运行的作业的性质以及它们需要运行的频率,等待一分钟刷新不是一个选项。

我正在考虑几种方法:

1) 在 javascript 中调用一个页面,该页面启动进程并立即返回,然后运行任务,例如 ajax('/run_jobs.php?job=123').... 你明白了

2) 在一个线程完成后分叉一个新线程;即 output_page();新线程();运行作业(123);退出();

任何人对此主题有任何想法或对此有经验。

【问题讨论】:

    标签: php ajax multithreading cron jobs


    【解决方案1】:

    这取决于您要运行的作业。一种更复杂但更具可扩展性和可控性的方法是使用 Gearman 来启动和控制作业。好消息是您可以将作业分配到其他盒子,这样您的网络服务器就不会得到全部负载。

    简单的方法是使用 exec 和 nohup 类似

    <?php
    exec("nohup /usr/bin/php script.php >/dev/null 2>/dev/null &");
    ?>
    

    重要的部分是将输出通道从 PHP 进程中分离出来。为了读取进程的结果,您可以将其存储在数据库中。

    【讨论】:

    • 我选择了这个作为答案,因为它涵盖了这两种情况。有时你只需要在一个较小的站点上做一个非常简单的事情,no hangup execution 就可以解决这个问题。
    【解决方案2】:

    如今处理这类事情的标准方法是消息队列系统。在您的请求结束时,您将一条消息发送到队列中。然后,有某种外部进程正在运行(例如,多个 cron),它不断地从队列中读取消息并运行需要运行的作业

    Zend Queue 是 PHP 的流行选择。

    至于您提出的解决方案,您无法确定 Ajax 请求是否会完成(HTTP 不保证请求的成功或失败),所以如果您依赖 在作业上运行。我已经看到它的工作,但它不是最好的选择。在请求结束时分叉一个进程将是一场性能噩梦。

    【讨论】:

      【解决方案3】:

      我没有对此进行测试,但这是一个想法。

      使用 curl,异步向 newprocess.php(或您的新流程脚本所在的任何位置)发送请求。您可以查看函数 curl_post_async at How do I make an asynchronous GET request in PHP?,了解如何发出此类请求。

      您可能想要进行一些身份验证以确保只有您可以启动 newprocess.php ...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-04-06
        • 2023-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多