ryunosuke / hellowo
简单的工作进程
v1.0.1
2023-12-07 05:07 UTC
Requires
- php: >=7.4
- psr/log: *
Requires (Dev)
- kicken/gearman-php: 1.*
- pda/pheanstalk: 4.*
- php-amqplib/php-amqplib: 3.*
- phpunit/phpunit: 9.*
- ryunosuke/phpunit-extension: 3.*
- symfony/process: 5.*
Suggests
- ext-gearman: Required depending on the driver
- ext-inotify: Required depending on the driver
- ext-mysqli: Required depending on the driver
- ext-pcntl: Required on substantially
- pda/pheanstalk: Required depending on the driver
- php-amqplib/php-amqplib: Required depending on the driver
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
- 发布