【问题标题】:Execute multiple PHP Scripts in the Background在后台执行多个 PHP 脚本
【发布时间】:2013-10-16 21:32:44
【问题描述】:

我正在编写一个需要在后台执行 PHP 脚本的 Web 应用程序。队列的问题在于它一次只能处理一个。我的问题是,如何让 Beanstalk 同时处理更多作业,或者如何在后台执行我的脚本,直到用户手动停止它。我正在使用 Laravel 4,所以我可以使用所有这些方法。

提前致谢。

顺便说一句,API 也帮不了我。

<?php

class Workers {

    public function fire($job, $data) {
        $login = Login::find($data['id']);
        if ($login->active == 0) {
            $job->delete();
        }

        $job->release();
    }
}

这是我的脚本目前的样子。注意release() 而不是delete()。这就是它继续执行的原因。

我再次进行了一些研究,发现背景工作者可能适合我。任何人都可以将我链接到有关如何在 Linux 上进行设置的教程以及关于后台工作软件的选项。 Beanstalk 似乎不提供该选项。

我刚刚发现http://gearman.org/ 可能是一种可能性,但我不确定,因为我不太了解工人。我还发现了这个http://kvz.io/blog/2009/01/09/create-daemons-in-php/,它看起来可以完成这项工作。

是否可以在每次需要运行脚本时都有一个唯一的工作人员?一个完整的新实例?如果是这样,如何以及使用哪个程序/平台?

我要亲自感谢帮助我摆脱噩梦的人。当应用程序最终完成时,有无数人向我大喊大叫。非常感谢!

【问题讨论】:

  • 你需要对我说得更具体一些,告诉我们你想要做什么,显示一些代码,以便我们为你提供帮助。
  • 它可以去任何地方,见PSR-0 autoloading。可能你想create your own application library 来容纳你的应用程序逻辑。
  • 我编辑了问题以使其更加清晰和准确。 put on hold as too broad
  • 希望大家都清楚吗?

标签: php background laravel gearman worker


【解决方案1】:

大约 2.5 年前,我为 PHP 守护程序实现了一个解决方案。我的应用程序在一个封闭的环境中运行,并且只有几个用户。因此,可伸缩性、性能和安全性并不是真正需要的。

我基本上是在 CLI 模式下将我的守护进程作为单个 PHP 应用程序启动的。

function startDeamon($daemonPath, $args = ""){
    $phppath = "/../../php/php"; // points to php executable
    $executionstring = $phppath." -f ".$daemonPath." ".$args;
    execInBackground($executionstring);
}

function execInBackground($cmd){
    if (substr(php_uname(), 0, 7) == "Windows"){
        pclose(popen("start /B". $cmd, "r")); // Windows
    } else {
        exec($cmd . " > /dev/null &"); // Operating systems like unix
    }
}

通过调用startDaemon 并使用您的守护程序脚本的路径和您要为其提供的参数,您的网络服务器上会启动一个单独的进程。守护程序脚本一终止,进程就结束。

可以通过访问$argv 数组在您的守护进程中读取参数,如下所示:

 $myJobIs = $argv[1];

请记住,此解决方案非常占用内存,因为每个启动的进程都可能占用 5MB 或更多的 RAM。 (但这取决于你的 PHP 安装、你的系统和你的脚本)

您还需要允许 PHP 打开新进程/运行 exec 函数,这可能不是您想要做的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    相关资源
    最近更新 更多