PHP函数pcntl_fork的理解与应用
程序员文章站
2022-05-19 19:18:28
...
PHP进程分支函数
php社区对pcntl_fork的解释如下
pcntl_fork — 在当前进程当前位置产生分支(子进程)。译注:fork是创建了一个子进程,父进程和子进程 都从fork的位置开始向下继续执行,不同的是父进程执行过程中,得到的fork返回值为子进程 号,而子进程得到的是0。
-------
pcntl_fork()函数创建一个子进程,这个子进程仅PID(进程号) 和PPID(父进程号)与其父进程不同。fork怎样在您的系统工作的详细信息请查阅您的系统 的fork(2)手册。
------
成功时,在父进程执行线程内返回产生的子进程的PID,在子进程执行线程内返回0。失败时,在 父进程上下文返回-1,不会创建子进程,并且会引发一个PHP错误。
第一次看到这里,是非常容易迷惑的,写的示例也看不明白.
其实这里有一个很简单的方法可以立即理解这个函数
php内部究竟是怎么处理pcntl_fork的,并不重要,只要理解了这里pid的值即可.
基于以上,本人写了一段workman的进程创建代码,以供参考
workman的pcntl_fork部分代码(精简)
<?php
$work = new work();
work::forkWorks();
print_r(work::$_works);
print_r(work::$pidMap);
class work {
public static $_works = array();
public static $pidMap = array();
public $workId = 0;
public $count = 4;
// public $masterPid = 0;
public function __construct() {
$this->workId = spl_object_hash($this);//生成对象的唯一ID
self::$_works[$this->workId] = $this;
self::$pidMap[$this->workId] = array();
// $this->masterPid = posix_getpid();
}
public static function forkWorks() {
foreach (self::$_works as $work) {
while (count(self::$pidMap[$work->workId]) < $work->count) {
self::forkOne($work);
}
}
}
public static function forkOne($work) {
$pid = pcntl_fork(); //从这句话执行完,就分成两个进程,主进程(pid>0)和子进程(pid=0),两个进程获取到的pid不同
if ($pid > 0) {
self::$pidMap[$work->workId][$pid] = $pid;
} elseif ($pid == 0) {
self::$_works[$work->workId] = $work;
self::$pidMap = array();
while (TRUE){//这里写了死循环
sleep(1);
ECHO 1;
}
exit;
} else {
}
}
}
上一篇: 进制转换的一些小方法
下一篇: 数据结构与算法---二叉树的常见遍历方法
推荐阅读
-
php中isset与empty函数的困惑与用法分析
-
PHP与已存在的Java应用程序集成
-
解析php中const与define的应用区别
-
分享下PHP register_globals 值为on与off的理解
-
php中eval函数的危害与正确禁用方法
-
PHP 删除文件与文件夹操作 unlink()与rmdir()这两个函数的使用
-
PHP5.2中date()函数显示时间与北京时间相差8小时的解决办法
-
PHP explode()函数的几个应用和implode()函数有什么区别
-
深入理解JavaScript 中的匿名函数((function() {})();)与变量的作用域
-
php入门学习知识点七 PHP函数的基本应用