net_bazzline/php_component_process_fork_manager

此包已被弃用且不再维护。没有建议的替代包。

自由免费的PHP组件进程分叉管理器,简化进程分叉和线程观察

1.0.11 2016-08-18 08:24 UTC

This package is auto-updated.

Last update: 2021-03-05 12:17:53 UTC


README

我仍然喜欢这个想法,但目前没有用例再继续开发了。

PHP的Fork组件

这个自由组件简化了PHP中的进程分叉和观察。它使用了内存限制管理器时间限制管理器以及事件分发器组件作为强大基础。

当前主分支的构建状态由Travis CI跟踪:Build Status Latest stable

scrutinizer状态如下:code quality | build status

versioneye状态如下:dependencies

下载量:Downloads this Month

它也可以在openhub.net找到。

错误处理

必需的PHP函数 "posix_getpid" 不可用

  • 在您的php.ini中取消注释 "extension=posix.so"

示例

如果您正在运行Unix系统,可以使用 "watch 'ps auxf | grep php'" 来验证线程是否已启动。

安装

手动

mkdir -p vendor/net_bazzline/php_component_process_fork_manager
cd vendor/net_bazzline/php_component_process_fork_manager
git clone https://github.com/bazzline/php_component_process_fork_manager

使用 Packagist

composer require net_bazzline/php_component_process_fork_manager:dev-master

用法

$factory = \Net\Bazzline\Component\ProcessForkManager\ForkManagerFactory();
$manager = $factory->create();

/** @var \Net\Bazzline\Component\ProcessForkManager\TaskInterface $task */
$task = new \My\Task();

$manager->addTask($task);
$manager->execute();

API

感谢 apigen,API 可在 文档 部分或 在线 查找。

术语

ForkManager 本身会附加多个任务。在执行过程中,ForkManager 会跟踪当前线程数(工作任务)和时间或内存限制。根据情况,管理器会自行关闭。这可以通过发送不同的 POSIX 信号(例如 kill)来实现。

  • ForkManager

    • 附加任务
    • 使用子进程执行任务
    • 确保可以分叉
    • 实现 POSIX 信号处理
    • 处理可选的运行时间限制
    • 处理可选的内存限制
    • 处理最大子进程数
    • 提供 "setUpPOSIXSignalHandling" 和 "dispatchPOSIXSignal" 方法以实现 POSIX 信号处理
  • 线程

    • 用于执行定义良好的任务的简单子进程
    • 实现 POSIX 信号处理
  • AbstractTask

    • 实现子进程应执行的独特逻辑
    • 实现
      • getProcessId()
      • getParentProcessId()
      • getRuntime()
      • getMemoryUsage()
    • 提供 "setUpPOSIXSignalHandling" 和 "dispatchPOSIXSignal" 方法以实现 POSIX 信号处理

未来改进

  • 实现 pcntl_wifexited 的使用
  • 评估 proc_open 是否更好
  • 评估 pthreads
  • 添加内部进程调用共享内存
  • 添加基于负载的最大线程数,如 throttleing
  • 扩展信号处理,如 此处
  • TaskInterface 可以实现
    • getGroupId()
    • getUserId()
    • setGroupId($groupId)
    • setUserId($userId)
    • 任务标识符
  • 如何为分叉本身编写单元测试?
  • 存在一个理论上的竞态条件问题,我不知道如何在 PHP 中解决这个问题
    • 父进程(ForkManager)的进程 ID 为 123
    • 一个子进程(任务)的进程 ID 为 124
    • 子进程收到 kill 信号或完成执行后,进程 ID 124 可再次使用
    • 在父进程的 usleep 期间,一个新系统进程被生成,进程 ID 为 124
    • 如何区分进程 ID 为 124 的进程是子进程还是新进程?
  • 实现 PHP 协程 的使用

历史

  • 即将推出
  • 1.1.0 - 发布于 2016 年 2 月 28 日
    • 更新示例部分
      • mv run.php run
      • chmod +x run
    • 迁移到psr-4 自动加载
    • 移除了废弃的API和文档部分
    • 更新了依赖项
  • 1.0.11 - 发布于 2016年08月18日
    • 更新了开发依赖项
  • 1.0.10 - 发布于 2016年03月07日
    • 更新了依赖项
  • 1.0.9 - 发布于 2015年12月18日
    • 更新了依赖项
  • 1.0.8 - 发布于 2015年12月11日
    • 更新了依赖项
  • 1.0.7 - 发布于 2015年11月18日
    • 更新了依赖项
  • 1.0.6 - 发布于 2015年08月28日
    • 更新了依赖项
  • 1.0.5 - 发布于 2015年07月11日
    • 更新了依赖项
  • 1.0.4 - 发布于 2015年07月04日
    • 移除了phpmd
    • 更新了依赖项
  • 1.0.3 - 发布于 2015年06月29日
    • 更新了依赖项
  • 1.0.2 - 发布于 2015年02月08日
    • 移除了对apigen的依赖
  • 1.0.1 - 发布于 2014年08月31日
    • 更新了依赖项
  • 1.0.0 - 发布于 2014年08月05日
    • 初始提交,包含示例、单元测试和API文档

链接

以下链接到项目和页面,以便更容易地了解PHP中的进程分叉(process forking)。感谢所有出色的项目和页面。

结束语

如果你喜欢它,请给它star。如果你需要它,请添加问题。如果你喜欢它,请拉取补丁。如果你使用它,请写一篇博客。如果你爱它,请捐赠一些东西。:-)。