php pcntl fork 详解,php中pcntl_fork详解

pcntl_fork()函数是php-pcntl模块中用于创建进程的函数。(不支持windows)

至于php_pcntl扩展如何安装开启这里就不介绍了,只分析pcntl_fork()这个函数本身。

Fn6cFzNuIUl8xbiHEJfj5cAzKqR9

1.$one = 123;

2.$one++;

3.$two = time();

4.$pid = [];

5.$pid = pcntl_fork();

6.$three = time();

Fn6cFzNuIUl8xbiHEJfj5cAzKqR9

当:pcntl_fork()函数执行的时候,会创建一个子进程。子进程会复制当前进程,也就是父进程的所有:数据,代码,还有状态。

1.当pcntl_fork()创建子进程成功后,在父进程内,返回0,在子进程内返回自身的进程号,失败则返回-1

2.子进程会复制父进程的代码,数据。那么就说明:子,父进程拥有的代码和数据会一模一样。

3.重点:子进程会复制父进程的状态,那么就有上面的示例代码:在第五行执行了pcntl_fork,那么创建出的子进程,代码也是从第五行开始执行的。又子进程复制了数据,代码。所以,在子进程内同理存在:$one,$two等变量

for ($i = 0; $i < 3; $i++) {

$pid = pcntl_fork();

}

sleep(30);

那么:上面的for循环,实际会产生多少个子进程?答案是7个,在linux下,用ps命令将可以看到8个进程(1个父进程,7个子进程)

原因:父进程在$i=0时,创建出一个子进程0,此时的子进程,还会继续执行循环。创建出属于自己的子进程。同理:$i=1时也会这样……

PHP创建多进程的Demo示例:

Fn6cFzNuIUl8xbiHEJfj5cAzKqR9

/**

* PHP多进程和多线程的处理

*/

//创建socket监听

$socketserv = stream_socket_server('tcp://0.0.0.0:8000', $errno, $errstr);

//创建5个子进程

for ($i = 0; $i < 5; $i++) {

//使用pcntl_fork()创建进程,会返回pid,如果pid==0,则表示主进程

if (pcntl_fork() == 0) {

//循环监听

while (true) {

$conn = stream_socket_accept($socketserv);

//如果监听失败,则重新去监听

if(!$conn){

continue;

}

//读取流信息,读取的大小 是9000

$request = fread($conn, 9000);

//写入响应

$response = 'hello';

fwrite($conn, $response);

//关闭流

fclose($conn);

}

//创建完所有的子进程,然后退出

exit(0);

}

}

Fn6cFzNuIUl8xbiHEJfj5cAzKqR9

运行 php stream_socket.php,使用ps -ef 查看进程,会看到多出了如下的5个进程:

FhJnvQ_c552CfwTfTSbnFot1H0aZ

扩展:PHP的异步非阻塞模型 Reactor:

FiU2fkfKa2EakLnN8J65CC8L6unT

Reactor有4个核心的操作:

add添加socket监听到reactor

set修改事件监听,可以设置监听的类型,如可读、可写

del从reactor中移除,不再监听事件

callback就是事件发生后对应的处理逻辑,一般在add/set时制定。

(C语言用函数指针实现,JS可以用匿名函数,PHP可以用匿名函数、对象方法数组、字符串函数名)

Reactor只是一个事件发生器,实际对socket句柄的操作,如connect/accept、send/recv、close是在callback中完成的。

具体编码可参考下面的代码(需要先安装Reactor扩展):

FhXCwFWe6x0FCKc1MVOf-7uf1-R0

Reactor模型还可以与多进程、多线程结合起来用,既实现异步非阻塞IO,又利用到多核。

目前流行的异步服务器程序都是这样的方式:如

Nginx:多进程Reactor

Nginx+Lua:多进程Reactor+协程

Golang:单线程Reactor+多线程协程

Swoole:多线程Reactor+多进程Worker

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值