mohamedallou / taskworker
提供进程池以集成到Web应用程序中
Requires
- php: ~8.1.0 || ~8.2.0
- ext-pcntl: *
- ext-shmop: *
- laminas/laminas-diactoros: ^2
- laminas/laminas-httphandlerrunner: ^2.4
- psr/container: ^1.0 || ^2.0
- revolt/event-loop: ^1.0
Requires (Dev)
- phpro/grumphp: ^1.15
- phpstan/phpstan: ^1.9
- squizlabs/php_codesniffer: ^3.7
This package is not auto-updated.
Last update: 2024-09-23 02:16:05 UTC
README
入门
提供进程池以集成到Web应用程序中 此软件包应与fpm或其他进程管理器协同工作,因为调度和响应输出到最终Web服务器的任务委托给了fpm,而不是在软件包内部处理。
此进程池也可以用作消息队列处理器,在后台运行异步任务。
架构
此库的主要目标是使用一个轻量级的脚本启动fpm子进程,该脚本没有启动整个Web应用程序及其配置和依赖项的开销,而是序列化请求并将其转发给包含内存中现有Web应用程序实例的实际长时间运行的工作进程。工作进程在服务器启动时仅启动一次,不需要在每个请求时初始化。此设置可以节省11%到50%的响应时间。
安装
在您的shell中运行
composer require midouxxx/taskworker
用法
为当前Web应用程序依赖项创建引导文件并初始化应用程序和依赖注入容器。引导文件需要在全球范围内初始化一个名为$taskHandler的变量,该变量将由后续工作进程步骤使用。
使用指定的工作者数量和引导文件路径运行start-worker-pool脚本,例如
php start-worker-pool.php --workers 10 --bootstrap="../examples/bootstrap.php"
在examples文件夹中,您可以找到基本的index.php和引导文件示例,它们显示了与现有应用程序的用法。
注意
由于当前实现,工作进程的最大数量限制为255。
提供TaskRunnerInterface的实现。需要包含处理未序列化请求对象的逻辑的handle方法。
Laminas Mezzio
该软件包提供与Laminas Mezzio应用程序(与Symfony应用程序类似)的集成基本示例。Mezzio TaskHandler类可以用作Mezzio应用程序的替代实现。我们提供可序列化的Stream和Response类,因为原始响应类及其流依赖项不适合序列化和通过套接字发送。
Docker
该软件包提供了一个示例init.sh脚本,可用于初始化docker fpm镜像。您必须在dockerfile中的CMD命令中添加对该脚本的调用。(Dockerfile中只能有一个CMD条目)例如
CMD ["/bin/bash", "-c", "set -e && /var/www/init.sh"]
不要忘记在init.sh脚本中再次添加原始CMD镜像中使用的必要CMD命令,以保持您的Docker镜像的原始行为。
路线图
构建一个独立的PHP进程管理器,作为fpm的替代方案。
许可协议
MIT许可协议
项目状态
此项目仍处于早期开发阶段。
工作流程
连接到工作进程 => 发送命令 => 获取套接字 => 等待响应 / 或忽略它
没有主进程,没有管理器:所有进程都是相似的
待办事项
- 检查和修复信号处理
- 创建一个Docker配置,以暴露多个端口,代表工作进程
- 处理换行符并指定响应长度,而不是使用以每个新行为终止的fgets
- 使用将公开外部的主工作进程调度程序
- 使用循环轮询与请求数量,配置请求X次后重启
- 通过TCP从客户端向工作进程添加停止命令
想法
- 从客户端ping工作进程以查看是否快速响应,如果没有,则表示忙碌/此外,使用共享内存
- 优化共享内存读取以获取空闲工作进程
- 工作进程池服务器将记录空闲工作进程,并在有工作进程可用时立即通知等待空闲工作进程的过程,并告知其端口号。
- 工作进程脚本在完成处理请求后立即将其状态与工作进程池服务器共享。
- 工作进程池服务器将依次分配空闲工作进程的端口号给工作进程池客户端,以确保没有客户端会请求已分配的工作进程。
- 添加在一段时间后重启进程的可能性,以避免内存泄漏
其他想法
- 创建Cron管理器
- 创建异步作业工作进程和队列管理器
暴露多个端口
在Docker文件中
EXPOSE 5000 5001 5002 5003以及在docker-compose文件中
varnish: ports: - 5000 - 5001 - 5002 - 5003