libriciel/cakephp-beanstalk

允许使用 beanstalk 启动后台进程。

安装次数: 1,564

依赖者: 1

建议者: 0

安全: 0

类型:cakephp-plugin

4.1.1 2023-10-05 14:21 UTC

README

License build status coverage report

Cakephp 4 插件。

beanstalkd 服务、您的应用程序和您的工人之间的接口。

先决条件

Beanstalkd 服务器是必需的。

sudo apt-get install beanstalkd

如果您想在服务重新启动后保留工作,您需要修改配置。

sudo nano /etc/default/beanstalkd

取消注释最后一行: BEANSTALKD_EXTRA="-b /var/lib/beanstalkd"

另一种方法:使用 -d 选项启动 beanstalkd

安装

composer config repositories.libriciel/cakephp-beanstalk git https://gitlab.libriciel.fr/CakePHP/cakephp-beanstalk.git
composer require libriciel/cakephp-beanstalk ^2.0

将插件添加到您的 Application.php 中

$this->addPlugin('Beanstalk');

数据库

您可以选择,使用在 config/schema/beanstalk.sql 中提供的 SQL(postgres),或者使用插件迁移。

bin/cake migrations migrate --plugin Beanstalk

使用

现在您已经有了您的 Beanstalkd 服务器,您将需要根据需要创建一个或多个工人。

示例:vendor/libriciel/cakephp-beanstalk/exemple/DefaultWorker.php 将此文件复制到 src/Shell/Worker 并添加到您的配置中

Configure::write([
    'Beanstalk' => [
        /**
         * Connection au serveur Beanstalkd
         */
        'host' => '127.0.0.1',
        'port' => 11300,
        'timeout' => null,
        'persistant' => false,

        /**
         * Chemin des classes de workers
         */
        'workerPaths' => [
            APP . 'Shell' . DS . 'Worker'
        ],

        /**
         * Configurations liées aux tests des workers
         *
         * - timeout: durée maximum en secondes entre l'émission du test et la
         *            consultation du résultat
         */
        'tests' => [
            'timeout' => 10,
        ],
        
        /**
         * Configuration optionnelle
         */
         'table_jobs' => 'Beanstalk.BeanstalkJobs',
         'table_workers' => 'Beanstalk.BeanstalkWorkers',
         'classname', \Beanstalk\Utility\Beanstalk::class,
         'PheanstalkClassname' => \Pheanstalk\Pheanstalk::class
    ]
]);

启动工人

选项

  • --dir 工人类别所在的目录
  • --one-job 只执行一个作业 - 对于在 Docker 下运行的工人很有用
  • --suffix 允许指定工人目录(默认:Worker)
  • --table-workers 允许指定用于存储启动的工人信息的表(默认:Beanstalk.BeanstalkWorkers)
  • --tube 管道名称(默认:worker 名称
  • --unique 只有在它是其管道上的唯一工人时才启动工人

参数

  • worker 工人名称(可选)

启动您的 shell

bin/cake worker default_worker

可以同时启动多个工人。请注意,一个工人可以占用一个线程 100% 直到作业队列的结束。如果工人的数量超过核心的数量,负载将均匀分配。如果工人在与网页相同的服务器上,用户体验可能会受到影响。

Beanstalk 工具

允许在操作应用程序数据库的同时与 Beanstalkd 服务进行通信,以保留某些信息。

__construct() 方法

接受一个参数,即工人将要工作的管道。最好为每个工人有一个管道。其他参数用于连接到 beanstalkd 服务器。

emit()

在管道中添加一个作业,使用参数传递数据。

getNext()

用于循环,它负责保留下一个作业并将其分配给 Worker->job。如果没有作业要做,它将安静地等待新的作业到达,而不占用服务器负载。

getData()

请注意,如果数据的签名未经过验证,则可能会返回错误。这种特性的目的是避免如果另一个应用程序使用相同的管道时发生冲突。

否则,通过 json 转换,返回的数据可以是任何类型。

done()

删除作业,因为作业已经完成

示例

$Beanstalk = new \Beanstalk\Utility\Beanstalk('mon-tube');

$Beanstalk->emit('foo'); // Envoi un message dans le tube

while ($Beanstalk->getNext()) {
    $data = $Beanstalk->getData();
    $Beanstalk->done();
    if ($data === 'foo') {
        break;
    }
}

创建一个工人

创建一个实现 WorkerInterface 的类 (默认后缀为 Worker)。您可以选择扩展具有基础工人机制(您只需定义主要方法:work())的 AbstractWorker 类。

示例

<?php
namespace App\Shell\Worker;
use Beanstalk\Command\AbstractWorker;
use Beanstalk\Command\WorkerInterface;

class ExempleWorker extends AbstractWorker implements WorkerInterface
{
    public function work($data)
    {
        echo $data;
    }
}