php多进程应用场景主要是非web端,fpm下是不支持多进程的,非类linux操作系统都不支持,请在cli模式使用.可以使用多进程做任务分发,批量计算,批量文件处理,批量爬虫,网络运维等等。下面看一份简单的入门demo
//创建子进程
$pid=pcntl_fork();
//返回-1,创建失败,不会创建子进程,并引发PHP错误
if($pid==-1)
{
exit('创建子进程失败!');
}
else if($pid)
{
//父进程得到子进程号,这里是父进程执行的逻辑
//为什么父进程得到?因为是父进程创建的子进程
}
else
{
//子进程得到进程号为0,这里是子进程的逻辑
//为什么子进程得到0,因为是父进程创建的它
}解析:
pcntl_fork会创建一个子进程,当创建了子进程后,后面的执行的代码是并行的.父进程和子进程 都从fork的位置开始向下继续执行,不同的是父进程执行过程中,得到的fork返回值为子进程号,而子进程得到的是0。为什么?我在注释中已经注释了。
下面创建10个进程来执行网络请求任务
//创建10个进程去访问某个文章url
for ($i=0; $i <10 ; $i++) {
//创建子进程
$pid=pcntl_fork();
//返回-1,创建失败,不会创建子进程,并引发PHP错误
if($pid==-1)
{
echo ('创建子进程失败!');
}
else if($pid)
{
//我是父亲进程逻辑模块
//pcntl_wait($status);//如果开启阻塞,那么父进程只能等子进程执行完成,再执行,可设置子进程的sleep进行测试
$id = getmypid();
echo '我是主进程id:'.$id.',我是子进程id:'.$pid."\r\n";
}
else
{
//我是子进程逻辑模块
$url='https://blog.20230611.cn/?id=158';
sleep(1);
file_get_contents($url);
//我执行完成我就退出,如果不退出将会造成继续fork
exit();
}
}解析:
以上代码创建10个进程对我的url分别请求一次,然后退出进程。其中父进程中pcntl_wait()是为了等待子进程中断,防止子进程成为僵尸进程,如果你开启了它,那么父进程将会等待并行的子进程完成并退出才执行。需要注意的是子进程使用完成及时exit,否则继续fork系统开销很大。为了保证系统稳定最好使用pcntl_signal()处理进程管理
开发com组件可以用c++,vc++,net,我比较熟悉net,演示用dnet(1).创建项目:启动vs2017,新建项目,选择Visual C# ->Windows桌面->类库通用windows(2). 修改Com项目:点击 项目->项目属性,再点击应用程序->程序集信息,...
(1).config.php 配置文件<?php /** * RabbitMQ_Config */ $config = [ 'host' => ...
主要原理是通过PHP创建多个子进程,在子进程中发送进程闹钟信号,然后再监听闹钟信号中继续发送闹钟信号。同时通过父进程设置非阻塞运行。代码如下:<?php /** * 订单任务 */ class Order { &n...
最近在项目中处理一个关于商品数据重复需要删除多余的商品记录,但是删除一条商品必然要把关联的其他表商品的id和其他商品信息更换为正确的,删除一个商品记录,同时要去修改100多张表的关联商品数据,在项目中引用了tp orm 1.2版本,由于项目是php5.6版本,没法使用最新orm,在代码中每处理1个商...
php生成器的方法getReturn获取生成器迭代完成后的返回值,当生成器迭代完成会将生成器的返回值返回,因此如果迭代器未进行迭代是获取不到值的,如果你没有return值则返回null,参考代码:<?php function G1() { &nbs...
【一】.基本用法首先看看官方对send方法的解释:Sets the return value of the yield expression and resumes the generato...