php安装pcntl扩展实现多进程

pcntl中php实现多进程必须要安装的扩展,现将扩展安装步骤写在下面。

 

一、两种安装方式

 

1、重新编译PHP的后面configrue提示加上?enable-pcntl。
2、不重新编译php,直接编译安装pcntl扩展。

# cd /usr/local/src/php-5.2.6/ext/pcntl

# /usr/local/php/bin/phpize

# ./configure ?with-php-config=/usr/local/php/bin/php-config

# make && make install

 

然后将,pcntl.so 加到php.ini中就可以了,使用php -m查看模块命令可以查看已安装的模块。

 

二、实例
 

for($x = 1;$x<= 2;$x++){

        $pid[$x] = pcntl_fork();

        if ($pid[$x] == -1) {

                die("could not fork");

        } elseif ($pid[$x]) {

                echo "Parent: create ".$pid[$x]."n";

        } else {

                        echo "fork ".getmypid()." start:n";

                        for($i = 0;$i<10;$i++){

                                echo $x.": ".$i."n";

                                sleep(1);

                        }

                exit;

        }

}

本文实例讲述了PHP的pcntl多进程用法。分享给大家供大家参考。具体分析如下:

PHP使用PCNTL系列的函数也能做到多进程处理一个事务。比如我需要从数据库中获取80w条的数据,再做一系列后续的处理,这个时候,用单进程?你可以等到明年今天了。所以应该使用pcntl函数了。

假设我想要启动20个进程,将1-80w的数据分成20份来做,主进程等待所有子进程都结束了才退出:

$max = 800000;

$workers = 20;

 

$pids = array();

for($i = 0; $i < $workers; $i++){

    $pids[$i] = pcntl_fork();

    switch ($pids[$i]) {

        case -1:

            echo "fork error : {$i} \r\n";

            exit;

        case 0:

            $param = array(

                'lastid' => $max / $workers * $i,

                'maxid' => $max / $workers * ($i+1),

            );

            $this->executeWorker($input, $output, $param);

            exit;

        default:

            break;

    }

}

 

foreach ($pids as $i => $pid) {

    if($pid) {

        pcntl_waitpid($pid, $status);

    }

}

 

这里当pcntl_fork出来以后,会返回一个pid值,这个pid在子进程中看是0,在父进程中看是子进程的pid(>0),如果pid为-1说明fork出错了。

使用一个$pids数组就可以让主进程等候所有进程完结之后再结束了

例子测试

pcntl的扩展的安装就不说了,很简单,这里结合实例说一下pcntl_fork的运行方式

<?php

  echo $pid= pcntl_fork();

  if ($pid == -1) { 

     die('could not fork'); 

  } else if (!$pid) {

   //这里是子进程

  echo '-';

  exit();

  }else{

  //这里是父进程

 echo 'A';

 

 echo 'B';

  }

我用cli运行多次的结果是

$pid为0说明是子进程,因为pcntl_fork()的作用就是当程序运行到这里,就试图去创建一个子进程,如果创建成果,那么返回当前进程的子进程id,0表示当前进程没有子进程,那么其进程本身不就是子进程了,而如果有进程id,表示其有子进程,那么其不就是父进程。就好像是从这个位置其,下面的所有代码被复制到了另一个进程中执行一样,产生了一个子进程。但是从上面多次执行结果看,大部分情况下是先执行子进程的,这和我之前网上查的资料有些出入,而且这个顺序也不是固定的。但是我们发现倒数第三条,是先执行父进程,后执行的子进程,这时候子进程是有一定风险的,虽然子进程不会死,因为他会过继到1进程,但如果要等待子进程执行完可以这样:
 

<?php
  echo $pid= pcntl_fork();
  if ($pid == -1) { 
     die('could not fork'); 
  } else if (!$pid) {
   //这里是子进程
  echo '-';
  exit();
  }else{
  //这里是父进程
 echo 'A';
  pcntl_wait($status);//父进程执行到这里等等子进程执行完再执行
 echo 'B';
  }
 
运行结果:
 
0-31843AB[root@client 60.test.com]# php index.php 
0-31845AB[root@client 60.test.com]# php index.php 
0-31847AB[root@client 60.test.com]# php index.php 
0-31849AB[root@client 60.test.com]# php index.php 
0-31851AB[root@client 60.test.com]# php index.php 
0-31853AB[root@client 60.test.com]# php index.php 
0-31855AB[root@client 60.test.com]# php index.php 
31857A0-B[root@client 60.test.com]# php index.php 
0-31859AB[root@client 60.test.com]# php index.php 
0-31861AB[root@client 60.test.com]# php index.php 
0-31863AB[root@client 60.test.com]# php index.php 
0-31865AB[root@client 60.test.com]# php index.php 
0-31867AB[root@client 60.test.com]# php index.php 
0-31869AB[root@client 60.test.com]# php index.php 
0-31871AB[root@client 60.test.com]# php index.php 
0-31873AB[root@client 60.test.com]# php index.php 
0-31875AB[root@client 60.test.com]# php index.php 
0-31877AB[root@client 60.test.com]# php index.php 
0-31879AB[root@client 60.test.com]# php index.php 
0-31881AB[root@client 60.test.com]# php index.php 
0-31883AB[root@client 60.test.com]# php index.php

就是我们想要的结果了,其他都没有问题,因为都是先执行的子进程,而这条是先执行了父进程,走到输出A就等子进程执行完才执行的下面的。所以这就是

ntl_wait($status)

的作用。

好了,基本就是这些了。至于进程间或线程间的通信,可以利用类似共享内存变量等的来做。具体情况具体对待吧。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索编译
, 数据
, 实例
, 函数
, 模块
进程
php pcntl fork多进程、php pcntl扩展、php 安装pcntl扩展、php pcntl扩展下载、php pcntl fork 扩展,以便于您获取更多的相关知识。

时间: 2024-09-20 08:14:24

php安装pcntl扩展实现多进程的相关文章

PHP CLI模式下PCNTL扩展实现多进程服务的例子

PHP可通过PCNTL扩展实现进程控制,如进程创建,信号处理,进程中断判断等.但只能在CLI模式下操作. PCNTL的信号机制是基于 ticks 机制实现的.因此在使用信号相关函数时需要在前面添加declare(ticks = n) 语法结构. pcntl_alarm ( int $seconds )指定秒数后向进程发送一个 SIGALRM 信号 pcntl_signal ( int $signo , callback $handler [, bool $restart_syscalls ])给

Linux系统中为php添加pcntl扩展_php技巧

pcntl扩展可以支持php的多线程操作(仅限linux) 原本需要重新编译PHP的后面configrue提示加上--enable-pcntl 由于我的php是采用yum安装的,所以不能采用上面的方式 下面介绍一个php动态添加扩展的方式 phpize 1.首先看下 phpize命令 所在的目录  (ps:我的目录/usr/bin/phpize) 如果没有找到的话 执行安装 yum install php53_devel (ps:请注意自己的版本) 安装完毕后.会生成phpize命令   2.去

mac系统下为 php 添加 pcntl 扩展_php技巧

前言: pcntl 介绍 pcntl扩展可以支持 PHP 的多线程操作.(非Unix类系统不支持此模块) phpize 介绍 phpize 可以用来给 PHP 动态的添加扩展.比如编译 PHP 时忘记添加某扩展,后来想添加该扩展,即可以使用 phpize 动态的添加该扩展. 本文将介绍如何使用 phpize 给 Mac下的集成环境 MAMP 添加 PHP 的 pcntl 扩展.类 Unix 的环境都可以使用本方法安装,注意灵活变通. 安装: 下载和本地 PHP 版本对应的源码包,地址为: htt

MAMP 环境下为 php 添加 pcntl 扩展

前言: pcntl 介绍 pcntl 扩展可以支持 PHP 的多线程操作.(非Unix类系统不支持此模块) phpize 介绍 phpize 可以用来给 PHP 动态的添加扩展.比如编译 PHP 时忘记添加某扩展,后来想添加该扩展,即可以使用 phpize 动态的添加该扩展. 本文将介绍如何使用 phpize 给 Mac下的集成环境 MAMP 添加 PHP 的 pcntl 扩展.类 Unix 的环境都可以使用本方法安装,注意灵活变通. 安装: 下面演示的是给 MAMP的PHP 5.6.10版本添

linux中php如何安装CURL扩展方法示例教程

  如果php已经在系统编译好,后来又需要添加新的扩展. 一种方式就是重新完全编译php,另一种方式就是单独编译扩展库,以extension的形式扩展. 下面以安装curl扩展为例: 1.下载curl安装包.(我的php是4.4.4的,下载最新的curl 7.16 不能使用,最后下载7.14的才可以,所以要注意一下版本问题) 代码如下: ./configure make php要求curl的目录要有include和lib目录,并且include下要有easy.h 和curl.h两个文件,lib下

PHP安装memcached扩展笔记

  这篇文章主要介绍了PHP安装memcached扩展笔记,本文讲解了安装服务端.launchpad.安装memcached扩展以及配置PHP.ini等内容,需要的朋友可以参考下 最近在服务器上部缓存系统,记录一下PHP安装memcached扩展. 代码如下: # 安装服务端 yum install memcached -y I. launchpad 请于https://launchpad.net/libmemcached/+download下载目前最新版的libmemcached(201505

PHP5.3以上版本安装ZendOptimizer扩展

 这篇文章主要介绍了PHP5.3以上版本安装ZendOptimizer扩展的方法,十分细致,推荐给有需要的小伙伴参考下.     现在很多PHP程序都需要ZendOptimizer环境,但是ZendOptimizer在PHP5.2之后已经被支持,那怎么办,Zend也不会这么做,原来PHP5.3开始ZendOptimizer正式改为Zend Guard Loader. Zend Guard Loader的发布,而且Zend Optimizer不会再更新,并且由于差异很大使用Zend Guard加密

linux中php如何安装CURL扩展方法

  如果php已经在系统编译好,后来又需要添加新的扩展. 一种方式就是重新完全编译php,另一种方式就是单独编译扩展库,以extension的形式扩展. 下面以安装curl扩展为例: 1.下载curl安装包.(我的php是4.4.4的,下载最新的curl 7.16 不能使用,最后下载7.14的才可以,所以要注意一下版本问题) ./configure make php要求curl的目录要有include和lib目录,并且include下要有easy.h 和curl.h两个文件,lib下要有libc

linux系统下php安装mbstring扩展的二种方法

 这篇文章主要介绍了linux系统环境下,php安装mbstring扩展的二种方法,大家参考使用吧 1.执行   代码如下: yum install php-mbstring     2. 修改php.ini (这一步非常重要, 部分lxadmin版本无法自动修改)   代码如下: echo 'extension=mbstring.so' >>/etc/php.ini #更具php安装目录而定     3. 重启web service   如果是apache: service httpd re