好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

php多进程几个例子 - php高级应用

php多进程几个例子

php多进程这个东西先是在java中有不过现在高版本的php也支持多进程这个功能,但经过测试性能不如j(HdhCmsTestphpfensi测试数据)ava了希望后期有所提高了,下面我们一起来看看我整理了几个关于php多进程例子,希望能帮助你理解多线程.

php多进程的实现依赖于pcntl扩展,编译PHP的时候,可以加上’–enable-pcntl’或者也可以单独编译.

有三点需要注意:

1.子进程不在执行fork之前的代码,只是把父进程的内存状况复制一份新的,所以,关于子进程的个性化设置需要单独设置.

2.输出重定向,程序中使用echo,或造成命令行的混乱,影响分辨,可以用ob_start重定向到log文件,当然,你直接使用log是更好的办法,此实例中log文件,按照进程pid分组.

3.父进程没有代码执行,将可能提前退出,子进程可能成为孤儿进程.

demo接收:

用10个子进程来处理输出任务,任务总量是1000,然后,按照任务数平均分到十个子进程当中去,代码如下:

  //输出重定向到log文件                      function  echo_to_log( $content ){       global   $current_pid ;       $logfile  =   __FILE__  .  $current_pid  .   '.log' ;       $fp  =  fopen ( $logfile ,  'a+' );      fwrite( $fp ,  $content );      fclose( $fp );  }                                                                                     ob_start( 'echo_to_log' );  //获取当前进程pid   $current_pid  =  getmypid ();  $fork_nums  = 10;  $total  = 1000;                                                                                     for ( $i  = 0;  $i  <  $fork_nums ;  $i ++){       $pid  = pcntl_fork();       //等于0时,是子进程        if ( $pid  == 0){           $current_pid  =  $pid ;          do_task( $i );        //大于0时,是父进程,并且pid是产生的子进程的PID       }  else   if ( $pid  > 0) {      }  }                                                                                     //任务函数   function  do_task( $task_num ){       global   $total ;       $start  =  $total  / 10 *  $task_num ;       $end  =  $total  / 10 * ( $task_num  + 1);       for (; $start < $end ; $start ++){           echo   $task_num  .  " "  .  $start  .  "\n" ;      }       //子进程执行完任务以后终止,当然你可以返回主进程的代码部分做相关操作。        exit ();  } 

多进程控制的框架代码,留着备查,代码如下:

declare (ticks=1);  function  sigHandler( $signal )  {       echo   "a child exited\n" ;  }  pcntl_signal(SIGCHLD, sigHandler, false);  echo   "this is "  . posix_getpid() . PHP_EOL;  for ( $i =0;  $i <3;  $i ++)  {       $pid  = pcntl_fork();       if ( $pid  == -1)       {              echo   'fork failed '  . PHP_EOL;      }          else   if ( $pid )      {         }          else       {              $pid  = posix_getpid();           echo   'child '  .  $pid  .  ' '  . time() . PHP_EOL;          sleep(rand(2,5));           echo   'child '  .  $pid  .  ' done '  . time() . PHP_EOL;           exit (0);      }     }  do   {       $pid  = pcntl_wait( $status );        echo   'child quit '  .  $pid  . PHP_EOL;  } while ( $pid  > 0);   echo   'parent done'  . PHP_EOL; 

例子,给出一段PHP多线程、与For循环,抓取百度搜索页面的PHP代码示例,代码如下:

<?php     class  test_thread_run  extends  Thread     {         public   $url ;         public   $data ;           public   function  __construct( $url )        {             $this ->url =  $url ;        }           public   function  run()        {             if (( $url  =  $this ->url))            {                 $this ->data = model_http_curl_get( $url );            }        }    }       function  model_thread_result_get( $urls_array )     {         foreach  ( $urls_array   as   $key  =>  $value )         {             $thread_array [ $key ] =  new  test_thread_run( $value [ "url" ]);             $thread_array [ $key ]->start();        }           foreach  ( $thread_array   as   $thread_array_key  =>  $thread_array_value )         {             while ( $thread_array [ $thread_array_key ]->isRunning())            {                usleep(10);            }             if ( $thread_array [ $thread_array_key ]->join())            {                 $variable_data [ $thread_array_key ] =  $thread_array [ $thread_array_key ]->data;            }        }         return   $variable_data ;    }       function  model_http_curl_get( $url , $userAgent = "" )     {         $userAgent  =  $userAgent  ?  $userAgent  :  'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)' ;          $curl  = curl_init();        curl_setopt( $curl , CURLOPT_URL,  $url );        curl_setopt( $curl , CURLOPT_RETURNTRANSFER, 1);        curl_setopt( $curl , CURLOPT_TIMEOUT, 5);        curl_setopt( $curl , CURLOPT_USERAGENT, (HdhCmsTestphpfensi测试数据) $userAgent );         $result  = curl_exec( $curl );        curl_close( $curl );         return   $result ;    }       for  ( $i =0;  $i  < 100;  $i ++)     {          $urls_array [] =  array ( "name"  =>  "baidu" ,  "url"  =>  "http://HdhCmsTestphpfensi测试数据/s?wd=" .mt_rand(10000,20000));    }       $t  = microtime(true);     $result  = model_thread_result_get( $urls_array );     $e  = microtime(true);     echo   "多线程:" .( $e - $t ). "\n" ;       $t  = microtime(true);     foreach  ( $urls_array   as   $key  =>  $value )     {         $result_new [ $key ] = model_http_curl_get( $value [ "url" ]);    }     $e  = microtime(true);     echo   "For循环:" .( $e - $t ). "\n" ;  ?> 

PHP多线程类,代码如下:

/**    * @title:  PHP多线程类(Thread)    * @version: 1.0    * @author:   < web@ >    * @published: 2010-11-2    *     * PHP多线程应用示例:    *  require_once 'thread.class.php';    *  $thread = new thread();    *  $thread->addthread('action_log','a');    *  $thread->addthread('action_log','b');    *  $thread->addthread('action_log','c');    *  $thread->runthread();    *      *  function action_log($info) {    *   $log = 'log/' . microtime() . '.log';    *   $txt = $info . "rnrn" . 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn";    *   $fp = fopen($log, 'w');    *   fwrite($fp, $txt);    *   fclose($fp);    *  }    */   class  thread {         var   $hooks  =  array ();       var   $args  =  array ();             function  thread() {      }             function  addthread( $func )      {        $args  =  array_slice (func_get_args(), 1);        $this ->hooks[] =  $func ;     $this ->args[] =  $args ;     return  true;      }             function  runthread()      {        if (isset( $_GET [ 'flag' ]))       {         $flag  =  intval ( $_GET [ 'flag' ]);       }        if ( $flag  ||  $flag  === 0)    {     call_user_func_array( $this ->hooks[ $flag ],  $this ->args[ $flag ]);    }        else         {            for ( $i  = 0,  $size  =  count ( $this ->hooks);  $i  <  $size ;  $i ++)           {             $fp = fsockopen ( $_SERVER [ 'HTTP_HOST' ], $_SERVER [ 'SERVER_PORT' ]);             if ( $fp )            {              $out  =  "GET {$_SERVER['PHP_SELF']}?flag=$i HTTP/1.1rn" ;              $out  .=  "Host: {$_SERVER['HTTP_HOST']}rn" ;              $out  .=  "Connection: Closernrn" ;                    fputs ( $fp , $out );                   fclose( $fp );            }           }       }      }  } 

使用方法,代码如下:

$thread  =  new  thread();  $thread ->addthread( 'func1' , 'info1' );  $thread ->addthread( 'func2' , 'info2' );  $thread ->addthread( 'func3' , 'info3' );  $thread ->runthread(); 

说明: addthread是添加线程函数,第一个参数是函数名,之后的参数(可选)为传递给指定函数的参数.

runthread是执行线程的函数.

在linux系统中需要配置安装一下pthreads

1、扩展的编译安装(Linux),HdhCmsTestphpfensi测试数据 编辑参数 --enable-maintainer-zts 是必选项,代码如下:

cd /Data/tgz/php-5.5.1  ./configure --prefix=/Data/apps/php --with-config-file-path=/Data/apps/php/etc --with-mysql=/Data/apps/mysql --with-mysqli=/Data/apps/mysql/bin/mysql_config --with-iconv-dir --with-freetype-dir=/Data/apps/libs --with-jpeg-dir=/Data/apps/libs --with-png-dir=/Data/apps/libs --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-fpm --enable-mbstring --with-mcrypt=/Data/apps/libs --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --enable-opcache --with-pdo-mysql --enable-maintainer-zts  make clean  make  make install           unzip pthreads-master.zip  cd pthreads-master  /Data/apps/php/bin/phpize  ./configure --with-php-config=/Data/apps/php/bin/php-config  make  make install  vi /Data/apps/php/etc/php.ini 

添加如下代码:

extension = "pthreads.so" 

PHP扩展下载:https://github测试数据/krakjoe/pthreads

PHP手册文档:http://php.net/manual/zh/book.pthreads.php

查看更多关于php多进程几个例子 - php高级应用的详细内容...

  阅读:35次