php实现多进程
2017-12-11 作者  Winter    PHP/MYSQL    阅读量873    评论量0


(一)环境配置

PHP有个pcntl_fork的函数可以实现多进程,但要加载pcntl拓展,而且只有在linux下才能编译这个拓展。


1.首先在ubuntu下编译pcntl.so,我的ubuntu下找不到pcntl的包,于是要生成pcntl.so包。

创建一个文件夹下载了整个PHP包,在里面找到了pcntl包。将包放置于/var/www/php文件夹下


#cd /var/www/pcntl

# phpize

# ./configure 

# make

# make install

成功生成pcnl.so文件。ubuntu生成文件路径:/usr/lib/php5/20090626+lfs/pcntl.so

2 将pcnl.so文件加载到php环境中。

首先,创建pcntl.ini : /etc/php5/apache2/conf.d/pcntl.ini

内容:extension=pcntl.so

其次,修改php.ini,加载pcntl.so

[pcntl]

extension=pcntl.so


(二)程序设计


        $intNum= 4; // 进程总数
        $pids= array(); // 进程PID数组
        for($i= 0; $i<$intNum; $i++)
        {
            $pids[$i] = pcntl_fork();// 产生子进程,而且从当前行之下开试运行代码,

              而且不继承父进程的数据信息
             if($pids[$i] == -1)
             {
                echo "couldn't fork". "\n";
             }
             elseif(!$pids[$i])
             {
                 sleep(1);
                 echo "\n"."第".$i."个进程 -> ". time(). "\n";
                 switch($i){
                  case 0:
                  $result=json_encode(test(0,2));
                  break;
                  case 1:
                  $result=json_encode(test(2,2));
                  break;
                  case 2:
                  $result=json_encode(test(4,2));
                  break;
                  case 3:
                  $result=json_encode(test(6,2));
                  break;

           }


       file_put_contents('message.txt',"第".$i."个进程的数据:".$result."\n\r",FILE_APPEND);

                echo "\n"."第".$i."个进程 -> " ."抓取页面".$i."-> " . time()."\n";

                exit(0);//子进程要exit否则会进行递归多进程,父进程不要exit否则终止多进程
             }  
        }

        foreach ($pids as $i => $pid) {
            if($pid) {
                pcntl_waitpid($pid, $status);
            }
        }


        function test($m,$n){


        $mysql_server_name='localhost';
        $mysql_username='root';
        $mysql_password='123456';
        $mysql_database='test';
        $conn=mysql_connect($mysql_server_name,$mysql_username,

       $mysql_password,$mysql_database);


        mysql_select_db($mysql_database,$conn);
        $sql=mysql_query("select * from user limit {$m},{$n}");
        $result=array();
        while ($row=mysql_fetch_row($sql)){
            $result[]=$row;
        }
        
            mysql_close($conn);
            return $result;
        
        }
        
?>

结果:

第0个进程的数据:[["1","test1"],["2","test2"]]

第3个进程的数据:[["7","test7"],["8","test8"]]

第2个进程的数据:[["5","test5"],["6","test6"]]

第1个进程的数据:[["3","test3"],["4","test4"]]


                   

上一篇:没有了
下一篇:php 链接sqlserver 包含windows 与 linux

1条评论
frog2017-12-26 11:34:13
不错
回复
热门文章
热评文章
精品课程

¥小额赞助

联系我们

邮箱:chennengit@163.com

手机:13455295173(微信)

QQ:376926761