linux
脚本后台化方式
- php task.php &
- nohup php task.php &
- 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
会让当前进程断子绝孙- 多进程执行时,程序正文档是大家的,什么时候执行哪一段,不确定,由系统调度说了算