我们都知道php是单进程的,虽然swoole支持多进程,但我没接触过(这个以后肯定要学习)。但是php添加一个php-pcntl拓展也可以实现多进程处理一个事务。
下面是一个简单的例子:
1 $pids = array(); 2 foreach ($result as $k => $v) { 3 $pids[$k] = pcntl_fork(); //起一个子进程 4 switch ($pids[$k]) { 5 case -1: 6 echo "fork error : \r\n";//进程创建失败 7 exit; 8 case 0: 9 match($city, $table_name, $v);//进程创建成功 进行逻辑处理 10 exit; 11 default: 12 break; 13 } 14 } 15 foreach ($pids as $i => $pid) { 16 if ($pid) { 17 pcntl_waitpid($pid, $status);//监督子进程状态,并回收僵尸进程 18 } 19 }
附:
php-pcntl文档地址:http://php.net/manual/zh/book.pcntl.php
当然本文的重点是编译安装拓展
一、安装php-pcntl拓展
我装的是php7,恰好我的php源码ext子目录下有pcntl 所以省去了下载的一步(如果没有请百度下载);
第一步,切到pcntl目录下
1 cd /home/***/php-7.2.3/ext/pcntl
第二步,调用phpize命令生成./configure 文件
1 find / -name phpize
//查看phpize的位置
1 /usr/local/php/bin/phpize //调用生成 ./configure
第三步, 调用./configure
1 find / -name php-config //查找php-config
1 ./configure --with-php-config=/usr/local/php/bin/php-config //取决于你安装php之后php-config文件的位置
第四步,make && make install编译安装(注:一定要分开操作,make的时候有时会提示些错误)
第五步,php.ini添加 pcntl.so
1 echo "extension=pcntl.so" >> /etc/php.ini //注意自己的php.ini的位置
第六步,重启php-fpm
1 systemctl restart php-fpm.service
也可以用
1 systemctl reload php-fpm.service
我的reload不知道怎么回事不能用了,所以用了restart。这样pcntl拓展就安装完成了
1 php -m |grep pcntl //查看拓展安装
二、安装php-redis拓展
php-redis的拓展安装与上面的步骤一样,写在博客里主要是因为当时php源码里没有redis的包,自己在网上找的,付一下地址:http://pecl.php.net/package/redis
步骤简单写一下:
1、下载拓展包,解压并切换到解压完的目录下
2、phpize生成./configure文件
3、./configure --with-php-config=/usr/local/php/bin/php-config
4、make && make install
5、php.ini添加 extension=redis.so
6、重启php-fpm
7、php-m检查拓展安装情况