定制 libriciel/cakephp-beanstalk 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

libriciel/cakephp-beanstalk

Composer 安装命令:

composer require libriciel/cakephp-beanstalk

包简介

Permet d'utiliser beanstalk pour lancer des background processes.

README 文档

README

License build status coverage report

Plugin Cakephp 4.

Interface entre le service beanstalkd, votre application et vos workers.

Prérequis

Un serveur Beanstalkd est indispensable.

sudo apt-get install beanstalkd

Si vous voulez conserver les jobs après le redémarrage du service, il vous faut modifier la conf.

sudo nano /etc/default/beanstalkd

Décommettez la dernière ligne : BEANSTALKD_EXTRA="-b /var/lib/beanstalkd"

Autre méthode : lancez beanstalkd avec l'option -d

Installation

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

Ajoutez le plugin dans votre Application.php

$this->addPlugin('Beanstalk');

Base de données

Vous pouvez au choix, utiliser le SQL (postgres) fourni dans config/schema/beanstalk.sql, ou bien utiliser le plugin migration :

bin/cake migrations migrate --plugin Beanstalk

Utilisation

Maintenant que vous disposez de votre serveur Beanstalkd, il va vous falloir un ou plusieurs workers selon le besoin.

Exemple sur vendor/libriciel/cakephp-beanstalk/exemple/DefaultWorker.php Copiez ce fichier vers src/Shell/Worker Ajoutez à votre configuration :

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
    ]
]);

Lancer un worker

Options:

  • --dir Dossier de la classe du worker
  • --one-job N'effectue qu'un seul job - utile pour un worker sous docker
  • --suffix Permet de spécifier le dossier worker (default: Worker)
  • --table-workers Permet de spécifier la table utilisée pour stocker les informations sur le worker lancé (default: Beanstalk.BeanstalkWorkers)
  • --tube Nom du tube (par défaut: nom du worker)
  • --unique Lance le worker seulement s'il est seul sur son tube

Arguments:

  • worker Nom du worker (optional)

Lancez votre shell :

bin/cake worker default_worker

On peut lancer plusieurs workers en même temps. Attention car un worker peut occuper un thread à 100% jusqu’à la fin de la file de job. Si le nombre de workers dépasse celui du nombre de cœur la charge sera équitablement répartie. Si les workers sont sur le même serveur que la page web, l’expérience utilisateur peut s'en retrouver affectée.

L'utilitaire Beanstalk

Permet de communiquer avec le service Beanstalkd tout en manipulant la base de données de l'application afin de conserver certaines informations.

La methode __construct()

Prends en paramètre le tube sur lequel va travailler le worker. Il est bon d'avoir un tube par worker. Les autres paramètres sont pour la connexion au serveur beanstalkd.

emit()

Ajoute un Job dans le tube, avec le data passé en paramètres.

getNext()

Utile pour boucler dessus, il se charge de réserver le prochain job et l'affecter à Worker->job Si aucun job n'est à faire, il attend tranquillement qu'un nouveau job arrive sans prendre de la charge serveur.

getData()

Attention, peut renvoyer faux si la signature des données n'est pas validée. Cette particularité a pour but d'éviter les conflits si une autre application utilise le même tube.

Sinon, la donnée renvoyée peut être de tous types grâce à une conversion json.

done()

Supprime le job car celui-ci est terminé

exemple:

$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;
    }
}

Faire un worker

Créez une classe Worker (suffixe Worker par défaut) qui implémente WorkerInterface. Vous pouvez étendre la classe AbstractWorker qui possède déjà la mécanique de base d'un worker (il vous faudra juste définir la méthode principale: work()).

exemple:

<?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;
    }
}

libriciel/cakephp-beanstalk 适用场景与选型建议

libriciel/cakephp-beanstalk 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 5.52k 次下载、GitHub Stars 达 0, 最近一次更新时间为 2023 年 04 月 21 日, 在 PHP 生态内属于活跃度较高的组件。

我们在过去多个企业项目中使用过 libriciel/cakephp-beanstalk 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 libriciel/cakephp-beanstalk 我们能提供哪些服务?
定制开发 / 二次开发

基于 libriciel/cakephp-beanstalk 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 5.52k
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 3
  • 依赖项目数: 1
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 0
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2023-04-21