当前位置:首页 > PHP教程 > php高级应用 > 列表

php多线程抓取信息测试例子

发布:smiling 来源: PHP粉丝网  添加日期:2014-08-27 10:15:31 浏览: 评论:0 

只在php5.3以后的版本才真正的可以使用多线程序了,以前都是假的curl实现的多线程工作,下面我来给各位介绍几个多线程抓取信息测试例子,希望对各位会有帮助.

PHP 5.3 以上版本,使用pthreads PHP扩展,可以使PHP真正地支持多线程。多线程在处理重复性的循环任务,能够大大缩短程序执行时间。

PHP扩展下载:https://github.com/krakjoe/pthreads

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

1、扩展的编译安装Linux,编辑参数 --enable-maintainer-zts 是必选项:

  1. cd /Data/tgz/php-5.3.8 
  2. ./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 
  3. make clean 
  4. make 
  5. make install         
  6.  
  7. unzip pthreads-master.zip 
  8. cd pthreads-master 
  9. /Data/apps/php/bin/phpize 
  10. ./configure --with-php-config=/Data/apps/php/bin/php-config 
  11. make 
  12. make install 

添加扩展:

vi /Data/apps/php/etc/php.ini

extension = "pthreads.so"

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

  1. <?php   
  2.   class test_thread_run extends Thread    
  3.   {   
  4.       public $url;   
  5.       public $data;   
  6.  
  7.       public function __construct($url)   
  8.       {   
  9.           $this->url = $url;   
  10.       }   
  11.  
  12.       public function run()   
  13.       {   
  14.           if(($url = $this->url))   
  15.           {   
  16.               $this->data = model_http_curl_get($url);   
  17.           }   
  18.       }   
  19.   }   
  20.  
  21.   function model_thread_result_get($urls_array)    
  22.   {   
  23.       foreach ($urls_array as $key => $value)    
  24.       {   
  25.           $thread_array[$key] = new test_thread_run($value["url"]);   
  26.           $thread_array[$key]->start();   
  27.       }   
  28.  
  29.       foreach ($thread_array as $thread_array_key => $thread_array_value)    
  30.       {   
  31.           while($thread_array[$thread_array_key]->isRunning())   
  32.           {   
  33.               usleep(10);   
  34.           }   
  35.           if($thread_array[$thread_array_key]->join())   
  36.           {   
  37.               $variable_data[$thread_array_key] = $thread_array[$thread_array_key]->data;   
  38.           }   
  39.       }   
  40.       return $variable_data;   
  41.   }   
  42.  
  43.   function model_http_curl_get($url,$userAgent="")    
  44.   {   
  45.       $userAgent = $userAgent ? $userAgent : 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)';    
  46.       $curl = curl_init();   
  47.       curl_setopt($curl, CURLOPT_URL, $url);   
  48.       curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);   
  49.       curl_setopt($curl, CURLOPT_TIMEOUT, 5);   
  50.       curl_setopt($curl, CURLOPT_USERAGENT, $userAgent);   
  51.       $result = curl_exec($curl);   
  52.       curl_close($curl);   
  53.       return $result;   
  54.   }   
  55.  
  56.   for ($i=0; $i < 100; $i++)    
  57.   {    
  58.       $urls_array[] = array("name" => "baidu""url" => "http://www.baidu.com/s?wd=".mt_rand(10000,20000));   
  59.   }   
  60.  
  61.   $t = microtime(true);   
  62.   $result = model_thread_result_get($urls_array);   
  63.   $e = microtime(true);   
  64.   echo "多线程:".($e-$t)."n";   
  65. //开源代码phpfensi.com 
  66.   $t = microtime(true);   
  67.   foreach ($urls_array as $key => $value)    
  68.   {   
  69.       $result_new[$key] = model_http_curl_get($value["url"]);   
  70.   }   
  71.   $e = microtime(true);   
  72.   echo "For循环:".($e-$t)."n";   
  73. ?> 

例子,采集数据,代码如下:

  1. <?php  
  2. $urls = array(  
  3. 'http://www.111cn.net/',  
  4. 'http://www.sohu.com/',  
  5. 'http://www.163.com/'  
  6. ); 
  7.  
  8. $save_to='/test.txt'// 把抓取的代码写入该文件  
  9. $st = fopen($save_to,"a"); 
  10.  
  11. $mh = curl_multi_init();  
  12. foreach ($urls as $i => $url) {  
  13. $conn[$i] = curl_init($url);  
  14. curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)");  
  15. curl_setopt($conn[$i], CURLOPT_HEADER ,0);  
  16. curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60);  
  17. curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,true); // 设置不将爬取代码写到浏览器,而是转化为字符串  
  18. curl_multi_add_handle ($mh,$conn[$i]);  
  19.  
  20. do {  
  21. curl_multi_exec($mh,$active);  
  22. while ($active); 
  23.  
  24. foreach ($urls as $i => $url) {  
  25. $data = curl_multi_getcontent($conn[$i]); // 获得爬取的代码字符串  
  26. fwrite($st,$data); // 将字符串写入文件。当然,也可以不写入文件,比如存入数据库  
  27. // 获得数据变量,并写入文件 
  28.  
  29. foreach ($urls as $i => $url) {  
  30. curl_multi_remove_handle($mh,$conn[$i]);  
  31. curl_close($conn[$i]);  
  32.  
  33. curl_multi_close($mh);  
  34. fclose($st);  
  35. ?> 

Tags: php多线程 php抓取信息

分享到: