php小知识

我们都知道php是单进程执行的,php处理多并发主要是依赖服务器或者php-frm的多进程以及他们进程的复用,但是php实现多进程的意义重大,尤其是在后台cli模式下处理大量数据或运行后台demon守护进程时,多进程的优势更大。
php的多线程也曾别人提及,但进程内多线程资源共享和分配时间问题难以解决,php也有多线程相关的扩展,但是据说不太稳定,且要求环境为线程安全,所用不多。
后台php想进阶必然避不开多进程,结合着资料手册,总算理解了多进程。
fork出来新进程成为子进程,原进程成为父进程,子进程成为父进程的副本,这里注意;
子进程与父进程共享程序正文段。
子进程拥有父进程的数据空间和堆,栈的副本,注意是副本,不是共享。
父进程与子进程将继续执行fork之后的程序代码。
fork之后是父进程先执行还是子进程先执行的方法要看进程的调度。
这里说的子进程和拥有父进程数据空间以及堆,栈的副本,实际上,在大多数实现中也并不是真正的完全副本,更多是采用了cow  及写时复制的技术来节约存储空间,简单来说,如果父进程和子进程都不修改那些数据,堆和栈的话,那么父进程和子进程则是暂时共享同一份数据,堆和栈,只有当父进程和子进程试图堆数据,堆和栈进行修改的时候,才会产生复制的操作,这就叫做写时复制。
在调用完函数的之后,该函数便会返回两个值。在父进程中返回子进程的进程ID,在子进程内部本身返回数字0,由于多进程在apache或者fpm环境下无法正常运行,所以大家一定要在php cli环境下执行代码。
创建子进程
创建子进程 是多线程的开始,我们需要相对应的函数
fork函数详解
pcntl——fork()在当前的位置产生分支(子进程),由此函数创建了一个新的子进程后,子进程便会继承父进程当前的上下文,和父进程一样能从pcntl——fork()函数处继续向下执行,只是获取搭配的pcntl——fork()的返回值不同,我们便能从哪判断返回值来区分子进程和父进程,分配父进程和子进程做不同的数据逻辑处理。
pcntl——fork()函数成功执行时会在父进程返回子进程的进程id,因为系统的初始进程init进程的pid为1,后来产生进程的pid都会大于此进程,所以我们可以通过判断pcntl——fork()的返回值大于1来确当当前进程是父进程,而在子进程中,此函数的返回值会是固定值0,我们也可以通过判断pcntl——fork()的返回值0来确定组进程,而pcntl——fork()函数在执行失败的时候,会在父进程返回值-1,当然也不会有子进程的产生。
    文章来源于公众号自学php
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值