pcntl_fork 与 for循环合用

linux脚本后台化方式

  1. php task.php &
  2. nohup php task.php &
  3. fork 和 setsid *nix解决方案

php多线程与进程

1.使用线程安全版本ZTS
2. 安装pecl的 【pthread扩展】

php多进程需要在安装PHP的时候开启pcntl, 不要在apache或者fpm环境下使用php多进程

php多进程pcntl_fork()来创建多进程

1.子进程与父进程共享程序正文段
2.子进程拥有父进程的数据空间和堆,栈的副本(COW写时复制)
3.父进程和子进程将继续执行fork之后的程序代码((包含pcntl_fork函数)
4.fork之后,父进程与子进程的执行顺序无法确认,取决于系统调度

pcntl_fork函数

在父进程中返回子进程的进程ID,在子进程内部返回数字0

代码

  • pcntl_fork()配合for循环来做些东西 会显示几次"sun"代码?
<?php
        for( $i = 1; $i <= 3 ; $i++ ){
        $pid = pcntl_fork();
        if( $pid > 0 ){
            // do nothing ...
        } else if( 0 == $pid ){
        echo "sun".PHP_EOL;
        }
    }
  • 产生7次而不是3次,但下面会是三次
<?php
        for( $i = 1; $i <= 3 ; $i++ ){
        $pid = pcntl_fork();
        if( $pid > 0 ){
            // do nothing ...
        } else if( 0 == $pid ){
        echo "sun".PHP_EOL;
        exit();
        }
    }

分析

  • i=1的时候父进程的pid不为0 这时候fork了一个pid=0的子进程a, 子进程数量1
  • i=2的时候父进程fork了一个子进程b, 子进程a又fork了一个子进程c, 子进程数量1+2
  • i=3的时候父进程fork了一个子进程d, a子进程fork了e, b子进程fork了f, c子进程fork了g子进程数量1+2+4=7
  • 至于在fork子进程退出的时候 i=1 =2 =3的时候都只有一个父进程fork一个子进程 所以只有三个儿子

父子进程小结

  • 父生子,子又生子,子子孙孙无穷尽也
  • exit 会让当前进程断子绝孙
  • 多进程执行时,程序正文档是大家的,什么时候执行哪一段,不确定,由系统调度说了算
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值