byjg/beansqueueworker

Beansqueue worker 消费来自 beanstalk 队列的负载

1.0.1 2017-09-03 14:17 UTC

This package is auto-updated.

Last update: 2024-09-10 14:43:04 UTC


README

BeansqueueWorker 系统允许创建一个队列和一个将消费该队列的 Worker。

为此需要以下元素

  • 队列(使用 Beanstalk 实现)
  • 入队(由 BeansqueueWorker 实现)
  • 消费(Worker,由 BeansqueueWorker 和 php-daemonize 实现)

工作原理

队列的基本工作原理如下

  • 一个生产者
  • 队列
  • 消费者

Queue

BeansqueueWorker Worker 允许中介生产、访问队列和消费消息。因此,我们有以下元素

  • 一个生产者 --> 使用 CURL 发布消息(见下文)
  • 队列 --> Beanstalkd
  • 消费者 --> 在 composer 中添加 BeansqueueWorker 依赖并创建一个继承自 "BaseWorker" 的项目

Componentes

请在 DOCS 文件夹中查看一些教程。

安装 Beanstalkd(队列管理器)

队列使用 Beanstalk 实现。基本安装如下

sudo apt-get install beanstalkd

并在 /etc/default/beanstalkd 中进行配置

BEANSTALKD_LISTEN_ADDR=127.0.0.1
BEANSTALKD_LISTEN_PORT=11300
BEANSTALKD_EXTRA="-b /var/lib/beanstalkd"

将 BEANSTALKD_LISTEN_ADDR 更改为机器的 IP 地址

创建消费者(Worker)

入队需要您传递一个包含 Worker 名称和应作为参数传递的负载内容的 JSON。

将以下内容添加到您的项目中

composer require byjg/beansqueueworker

创建一个实现 \BeansqueueWorker\Worker\BaseWorker 的类

<?php
namespace Caminho\Da\Classe;

class MinhaClasse extends \BeansqueueWorker\Worker\BaseWorker
{

    /**
     * Toda a implementação do Job. O Payload está em DATA. Normalmente é um String.
     */
    public function execute()
    {
        // Get Payload
        $data = $this->getPayload();
        
        // Execute
        // ...
        
        // Very important retry true
        return true;
    }
}

请注意,类的完整命名空间将用于入队。例如 `Caminho.Da.Classe.MinhaClasse`。

同样重要的是,您的类也应该包含在 composer 中,并且有 vendor/autoload。

在服务器上安装 WORKER 服务

需要 PHP-Daemonize。

要安装 PHP Daemonize,请按照以下步骤操作(作为 root 运行!- sudo su -

composer global require "byjg/php-daemonize=1.3.*"
sudo ln -s /home/ubuntu/.composer/vendor/bin/daemonize /usr/local/bin

为了使其对其他用户也可用,请执行以下命令

chmod a+x /root

完成此操作后,我们应该为每个 WORKER 安装一个服务。例如,假设 Worker 名称是 Mailer。

要安装,请使用以下命令(作为 root)

cd /Diretorio/Projeto
daemonize install name-of-my-job \
    --template=initd \
    "\\BeansqueueWorker\Process\Daemon::execute" \
    "vendor/autoload.php" \
    "./" \
    "" \
    'queueName=Caminho.Da.Classe.MinhaClasse' \
    'queueConfig={"serverIp":"beanstalkd", "maxThreads": "1", "autoloadPath":"vendor/autoload.php", "workingPath":"./"}' 

配置完成后,要启动,只需运行

service name-of-my-job start

测试您的 Worker

作为独立进程运行 Worker 并传递负载

使用此选项测试您的 Worker

daemonize run "\\BeansqueueWorker\\Process\\CronTab::execute" \
    "vendor/autoload.php" \
    "./" \
    'queueName=BeansqueueWorker.Sample.TryMe' \
    'payload={"a": "10"}'

作为守护进程运行,消费 beansktalk 服务器的负载

daemonize run "\\BeansqueueWorker\\Process\\Daemon::execute" \
    "vendor/autoload.php" \
    "./" \
    'queueName=BeansqueueWorker.Sample.TryMe' \
    'queueConfig={"serverIp":"beanstalkd", "maxThreads": "1"}' 

以单元测试运行 Worker

实现接口所需的 execute 类包含运行您的应用程序所需的所有代码。

因此,只需实例化它并应用必要的单元测试即可。