php pcntl 多进程学习

1、捕获子进程退出(监听SIGCHLD信号,然后调用 pcntl_wait 函数)

declare(ticks=1);

pcntl_signal(SIGCHLD, "sig_handler");
function sig_handler($signo)
{
    switch ($signo) {
        case SIGCHLD:
            $status = 0;
            $child_id = pcntl_wait($status);
            echo sprintf("child exit id: {$child_id} \n");
            exit(0);
            break;

        default:
            echo ‘uncaugh signal !‘;
    }

}

$pid = pcntl_fork();
if($pid>0)
{
    echo sprintf("fork child id: {$pid} \n");

    while(1){
        sleep(1);
    }

}else{
    echo "child exit \n";
}
时间: 2024-08-26 11:38:03

php pcntl 多进程学习的相关文章

Linux 多进程学习

1Linux进程概述 进程是一个程序执行一次的过程,他和程序有着本质的区别.程序是静态的,他是一些保存在磁盘上的指令有序的集合. 进程是动态的概念,他是运行者的程序,包含进程的动态创建,调度和消亡,是Linux的基本调度单位. 进程控制块(PCB)是进程的静态描述,包括进程的描述信息,进程的控制信息,以及资源信息 时间片:他轮流在每个进程的得到的时间片用完后从进程那里千回控制权 1.1进程标识 os会为每一个进程分配一个唯一的盛行ID,作为进程的标识号(pid),还有父进程ID(ppid) 所有

PHP多进程学习(二)__来初步了解一下PHP多进程及简单demo

php是一门单进程弱类型的语言,PHP处理多并发主要是依赖服务器或PHP-FPM的多进程及它们进程的复用,多进程的作用优点大家可以去网上了解,PHP实现多进程在实际项目中意义也是不容小觑的.比如:日常任务中,有时需要通过php脚本执行一些日志分析,队列处理等任务,当数据量比较大时,可以使用多进程来处理. 要实现PHP的多进程,需要用到函数pcntl_fork,那么就需要开启扩展 pcntl和 posix,在上一篇文章已经有安装方法. 入门须知 孤儿进程:一个父进程退出,而它的一个或多个子进程还在

基于Windows平台的Python多线程及多进程学习小结

python多线程及多进程对于不同平台有不同的工具(platform-specific tools),如os.fork仅在Unix上可用,而windows不可用,该文仅针对windows平台可用的工具进行总结. 1.多线程 单线程中,如果某一任务(代码块)是long-time running的,则必须等待该任务(代码块)结束,才可以对下一个任务进行操作,为解决long-time 任务的block问题,可将创建多个线程,间隔选择多线程进行操作.python 中多线程常用的库为_thread,thr

Linux IPC(Inter-Process Communication,进程间通信)之管道学习

1.标准流管道 管道操作支持文件流模式,用来创建链接还有一个进程的管道,通过函数popen和pclose popen的详细介绍在本blog:Linux 多进程学习中有具体介绍 2.无名管道(PIPE) 特点: 1)仅仅能在亲缘关系进程间通信(父子或兄弟) 2)半双工(固定的读端和固定的写端) 3)是特殊文件,能够用read,write等,在内存中 管道函数原型: #include<unistd.h> int pipe(int fds[2]); 管道在程序中用一对文件描写叙述符表示,一个是可读属

[LAMP]【转载】——PHP7.0的安装

***原文链接:http://my.oschina.net/sallency/blog/541287 安装 libmcrypt mhash mcrypt CentOS 7 默认不包含这三个模块,所以得手动安装,注意mcrypt依赖前两者 libmcrypt-2.5.8.tar.gz http://sourceforge.net/projects/mcrypt/files/Libmcrypt/2.5.8/libmcrypt-2.5.8.tar.gz mhash-0.9.9.tar.gz http:

php多进程pcntl学习(补漏)

上个月写的文章,php多进程pcntl学习(一)现在发现并不完整,因为虽然提到了关闭子进程,但是并没有回收子进程,简单的说就是当子进程比父进程先退出,而父进程没对其做任何处理的时候,子进程将会变成僵尸进程. 1 <?php 2 $ppid = getmygid(); 3 $pid = pcntl_fork(); 4 if ($pid == -1){ 5 die('fork failed'); 6 }else if($pid == 0){ 7 $mypid = getmygid(); 8 echo

php多进程pcntl学习-僵尸进程

上个月写的文章,php多进程pcntl学习(一)现在发现并不完整,因为虽然提到了关闭子进程,但是并没有回收子进程,简单的说就是当子进程比父进程先退出,而父进程没对其做任何处理的时候,子进程将会变成僵尸进程. <?php$ppid = getmygid();$pid = pcntl_fork();if ($pid == -1){ die('fork failed');}else if($pid == 0){ $mypid = getmygid(); echo 'I am child process

php多进程pcntl学习

pcntl在windows下无法使用,linux编译php时加上参数--enable-pcntl 即可.第一次使用pcntl模块,遇到了一些坑也慢慢填上了,这里简单记录下. 1. 子进程之间变量无法共享. 2. 子进程完成,记得加上exit(),子进程退出,否则会有坑. 1 <?php 2 $pid_dir = __DIR__.'/pid_files/'; 3 4 for ($i=0;$i<3;$i++){ 5 $pid = pcntl_fork(); 6 if ($pid == -1){ 7

php多进程pcntl学习(二)

多进程中数据独立,变量无法共享,所以可以使用shmop共享内存实现(cli模式不支持APC扩展),或者存储到redis这种nosql中. 下面实例,开10个进程结合redis集合,做一些简单的任务处理. 1 <?php 2 for ($i=0;$i<10;$i++){//开10个进程 3 $ret = pcntl_fork(); //生成进程 4 5 if ($ret == 0){ 6 7 $redis = new Redis(); 8 $redis->connect('127.0.0.