net_bazzline / php_component_process_fork_manager
此包已被弃用且不再维护。没有建议的替代包。
自由免费的PHP组件进程分叉管理器,简化进程分叉和线程观察
1.0.11
2016-08-18 08:24 UTC
Requires
- php: >=5.3.3
- net_bazzline/php_component_memory_limit_manager: 1.1.*
- net_bazzline/php_component_time_limit_manager: 1.0.*
- symfony/event-dispatcher: ~2.7||~3.0
Requires (Dev)
- mockery/mockery: 0.9.5
- phpunit/phpunit: ~4.8||~5.5
README
我仍然喜欢这个想法,但目前没有用例再继续开发了。
PHP的Fork组件
这个自由组件简化了PHP中的进程分叉和观察。它使用了内存限制管理器、时间限制管理器以及事件分发器组件作为强大基础。
它也可以在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)。感谢所有出色的项目和页面。
- 在wikipedia.org上解释了fork
- Linux的fork教程
- PHP进程分叉
- PHP分叉教程
- 用于加速图像缩放的PHP分叉示例
- pcntl_fork手册
- dannymar的php-process-manager
- gwilym的php spork
- mitallast的php fork
- jimbosjsb的workman
- robbmj的PHP-Fork
- mpierzchalski的php-fork
- kriswallsmith的php spork
- pear的PHP_Fork
- pbergman的process-fork
- kakawait的forki
- johan addriaans的php semaphore fork测试
- ducan3dc的fork-helper
- mmarquez的php thread
- baracudanetworks的forkdaemon php
- lordgnu的power spawn
- yutas的phpdaemon
- Ocean Internet的phpdaemon
- PHPDaemonizer
- PHP管道进程通信
结束语
如果你喜欢它,请给它star。如果你需要它,请添加问题。如果你喜欢它,请拉取补丁。如果你使用它,请写一篇博客。如果你爱它,请捐赠一些东西。:-)。