ryunosuke/hellowo

简单的工作进程

v1.0.1 2023-12-07 05:07 UTC

This package is auto-updated.

Last update: 2024-09-07 06:38:00 UTC


README

描述

此包是一个简单的工作进程。

安装

{
    "require": {
        "ryunosuke/hellowo": "dev-master"
    }
}

这需要 pcntl 扩展。另外,Windows 仅能基本运行。

特性

驱动程序

驱动程序特性

  • *1 推送几乎是实时,但拉取由于轮询有延迟
  • *2 例如,NFS
  • *3 除了文件系统,可以一定程度上启用 TCP keepalive
  • *4 例如,rabbitmq-delayed-message-exchange,Deadletter 交换
  • *5 例如,复制,Fabric,NDB

工作进程

推荐的过程管理器是 systemd。基本操作是串行的。如果你想要并行运行多个工作,你需要启动多个进程。

使用 SIGALRM 实现超时,因此用户不能使用它。当接收到 SIGTERM 或 SIGINT 时,它等待当前运行的工作完成然后停止。因此,在某些情况下,停止可能需要很长时间(参见 systemd 的 TimeoutStopSec)。

默认日志记录,操作日志写入 STDOUT。php 错误日志写入 STDERR。操作日志可以通过覆盖 logger 选项来更改。php 错误日志使用系统默认设置。这可以通过 php.ini 或 ini_set 来更改。

客户端

客户端是一个简单的类,从中提取了驱动程序的请求部分。你可以使用任何客户端发送工作,而不需要使用此类。

  • 例如,文件系统:touch /path/to/job.txt
  • 例如,mysql:INSERT INTO jobs(message) VALUES("foo")

演示

  • 驱动程序:mysql
  • 并行:4
  • 日志:/var/log/hellowo

需要 root 权限。

准备就绪

sudo su -
RUNSCRIPT=/path/to/example.php

准备就绪工作进程

cat << 'EOS' > $RUNSCRIPT
<?php
require_once __DIR__ . '/vendor/autoload.php';
$worker = new ryunosuke\hellowo\Worker([
    'work'   => function (ryunosuke\hellowo\Message $message) {
        file_put_contents('/var/log/hellowo/receive.log', "$message\n", FILE_APPEND | LOCK_EX);
    },
    'driver' => new ryunosuke\hellowo\Driver\MySqlDriver([
        'waittime'  => 30.0,
        'waitmode' => 'sql',
        'mysql'      => [
            'host'     => '127.0.0.1',
            'user'     => 'root',
            'password' => 'password',
            'database' => 'test',
        ],
        // job table name
        'table'    => 't_job',
    ]),
]);
$worker->start();
EOS

准备就绪 systemd

cat << EOS > /etc/systemd/system/example@.service
[Unit]
After=network.target
PartOf=example.target

[Service]
Type=simple
ExecStartPre=/bin/mkdir -p /var/log/hellowo
ExecStart=/bin/sh -c 'exec /usr/bin/php $RUNSCRIPT 1>/var/log/hellowo/stdout-%i.log 2>/var/log/hellowo/stderr-%i.log'
TimeoutStopSec=90s
Restart=always

[Install]
EOS

cat << EOS > /etc/systemd/system/example.target
[Unit]
Wants=example@1.service
Wants=example@2.service
Wants=example@3.service
Wants=example@4.service

[Install]
WantedBy=multi-user.target
EOS

systemctl daemon-reload
systemctl restart example.target
systemctl status example@*

发送数据

cat << EOS | mysql -h 127.0.0.1 -u root test
INSERT INTO t_job (message)
WITH RECURSIVE seq (n) AS
(
  SELECT 1
  UNION ALL
  SELECT n + 1 FROM seq WHERE n < 100
)
SELECT CONCAT("data-", n) FROM seq;
EOS

输出日志

cat /var/log/hellowo/stdout-*.log
[Y-m-dTH:i:s.v][1045984] ...
[Y-m-dTH:i:s.v][1045984] ...
[Y-m-dTH:i:s.v][1045984] ...

cat -n /var/log/hellowo/receive.log
data-8
data-17
data-15
...
data-98
data-96
data-99

许可证

MIT

发布

版本控制是浪漫版本控制(没有语义版本控制)。

  • 主要:大的 BC 断裂。例如,更改架构、包、类等
  • 次要:小的 BC 断裂。例如,更改参数、返回类型等
  • 补丁:没有 BC 断裂。例如,修复错误、添加可选参数、代码格式等

1.0.1

  • [特性] 检查可写模式
  • [修复错误] 事务可能没有关闭
  • [修复错误] 修复了 "PROCEDURE -> FUNCTION" 错误

1.0.0

  • [特性] 在 Throwable 时添加了 logger 日志
  • [重构] 将 nullable 改为 notnull

0.2.0

  • [修复错误] 在接收 USR1 时修复了 "命令不同步" 错误
  • [修复错误] 从 mysql 驱动中删除了 IF EXISTS
  • [特性] 添加了监听周期事件

0.1.0

  • [更改] 将 notify 移动到 notifyLocal

0.0.0

  • 发布