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

php多线程thread开发与应用的例子

发布:smiling 来源: PHP粉丝网  添加日期:2014-06-25 15:38:45 浏览: 评论:0 

php多线程的使用,首先需要PHP5.3以上版本,并安装pthreads PHP扩展,可以使PHP真正的支持多线程,扩展如何安装请自行百度.

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

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

在安装好扩展之后,就可以运用多线程了,下面贴个通过搜索结果抓取百度网盘内容的代码:

  1. <?php 
  2. include 'include/CurlLoad.class.php'// 引入读取库 
  3. /** 
  4.  * 多线程抓取内容 
  5.  * @param array $url 待抓取URL列表集合 
  6.  * @return 成功返回指定内容,失败返回NULL 
  7.  */ 
  8. function vget($url) { 
  9.  $ret = BaiduSRLinksGet ( $url, 1 ); // 获取结果列表地址 
  10.  if ($ret != null) { 
  11.   if (array_key_exists ( "links"$ret )) { 
  12.    $infos = array (); 
  13.    $number = count ( $ret ['links'] ); 
  14.    for($i = 0; $i < $number$i ++) {//循环创建线程对象 
  15.     $thread_array [$i] = new baidu_thread_run ( $ret ['links'] [$i] ); 
  16.     $thread_array [$i]->start (); 
  17.    } 
  18.    foreach ( $thread_array as $thread_array_key => $thread_array_value ) {//检查线程是否执行结束 
  19.     while ( $thread_array [$thread_array_key]->isRunning () ) { 
  20.      usleep ( 10 ); 
  21.     } 
  22.     if ($thread_array [$thread_array_key]->join ()) {//如果执行结束,取出结果 
  23.      $temp = $thread_array [$thread_array_key]->data; 
  24.      if ($temp != null) 
  25.       $infos ['res'] [] = $temp
  26.     } 
  27.    } 
  28.    $infos ['pages'] = $ret ['pages']; 
  29.    $infos ['status'] = "1"
  30.   } else 
  31.   $infos = null; 
  32.  } else 
  33.   $infos = null; 
  34.  return $infos
  35. /** 
  36.  * 获取百度搜索结果列表URL 
  37.  * 
  38.  * @param string $url 
  39.  *         搜索结果页URL 
  40.  * @param int $format 
  41.  *         默认$format=0,获取默认地址;$format=1获取跳转后真实地址 
  42.  * @return NULL multitype:array() 
  43.  */ 
  44. function BaiduSRLinksGet($url$format = 0) { 
  45.  $html = CurlLoad::HtmlGet ( $url ); // 获取页面 
  46.  if ($html == null) 
  47.   return null; 
  48.  try { 
  49.   preg_match_all ( "/"url":"(?<links>.*)"}/"$html$rets ); // 搜索结果链接筛选 
  50.   if (! array_key_exists ( 'links'$rets )) // 如果数组中不包含Links键名,表示获取失败 
  51.    return null; 
  52.   $ret = array (); 
  53.   if ($format == 1) { 
  54.    $number = count ( $rets ['links'] ); 
  55.    for($i = 0; $i < $number$i ++) { 
  56.     $headr_temp = CurlLoad::Get_Headers ( $rets ['links'] [$i], 1 ); // 通过headr获取真实地址 
  57.     if (array_key_exists ( "Location"$headr_temp )) 
  58.      $ret ['links'] [$i] = $headr_temp ['Location']; 
  59.     else 
  60.      $ret ['links'] = $rets ['links']; 
  61.    } 
  62.   } else 
  63.    $ret ['links'] = $rets ['links']; 
  64.   preg_match_all ( '/href="?/s?wd=site%3Apan.baidu.com%20(?<url>.+?)&ie=utf-8">/'$html$out ); 
  65.   unset ( $out ['url'] [0] ); 
  66.   $number = count ( $out ['url'] ); 
  67.   for($i = 1; $i < $number$i ++) { 
  68.    preg_match_all ( '/&pn=(.*)/'$out ['url'] [$i], $temp ); 
  69.    $ret ['pages'] [$temp [1] [0] / 10] = base64_encode ( $out ['url'] [$i] ); 
  70.   } 
  71.   return $ret
  72.  } catch ( Exception $e ) { 
  73.   WriteLog ( $e ); 
  74.   return null; 
  75.  } 
  76. /** 
  77.  * 百度网盘资源信息获取 
  78.  * 
  79.  * @param string $url 
  80.  *         网盘资源页URL 
  81.  * @return NULL array 
  82.  */ 
  83. function PanInfoGet($url) { 
  84.  $html = CurlLoad::HtmlGet ( $url ); // 获取页面 
  85.  if ($html == null) 
  86.   return null; 
  87.  try { 
  88.   if (preg_match_all ( "/文件名:(?<name>.*) 文件大小:(?<size>.*) 分享者:(?<user>.*) 分享时间:(?<date>.*) 下载次数:(?<number>[0-9]+)/"$html$ret ) == 0) 
  89.    return null; 
  90.   $rets ['name'] = $ret ['name'] [0]; 
  91.   $rets ['size'] = $ret ['size'] [0]; 
  92.   $rets ['user'] = $ret ['user'] [0]; 
  93.   $rets ['date'] = $ret ['date'] [0]; 
  94.   $rets ['number'] = $ret ['number'] [0]; 
  95.   $rets ['link'] = $url
  96.   return $rets
  97.  } catch ( Exception $e ) { 
  98.   WriteLog ( $e ); 
  99.   return null; 
  100.  } 
  101. function WriteLog($str) { 
  102.  $file = fopen ( "../error.log""a+" ); 
  103.  fwrite ( $file"Warning:" . date ( "Y/m/d H:i:s" ) . ":" . $str . "rn" ); 
  104.  fclose ( $file ); 
  105. /** 
  106.  * 多线程抓取对象 
  107.  * @author MuXi 
  108.  * 
  109.  */ 
  110. class baidu_thread_run extends Thread { 
  111.  public $url
  112.  public $data
  113.  public function __construct($url) { 
  114.   $this->url = $url
  115.  } 
  116.  public function run() { 
  117.   if (($url = $this->url)) { 
  118.    $this->data = PanInfoGet ( $url );//线程执行方法 
  119.   } 
  120.  } 
  121. ?> 

Tags: php多线程 thread开发

分享到: