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

简介: Php多线程的使用,首先需要PHP5.3以上版本,并安装pthreads PHP扩展,可以使PHP真正的支持多线程,扩展如何安装请自行百度 PHP扩展下载:https://github.com/krakjoe/pthreads PHP手册文档:http://php.

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

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

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

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

<?php
include 'include/CurlLoad.class.php'; // 引入读取库
/**
 * 多线程抓取内容
 * @param array $url 待抓取URL列表集合
 * @return 成功返回指定内容,失败返回NULL
 */
function vget($url) {
 $ret = BaiduSRLinksGet ( $url, 1 ); // 获取结果列表地址
 if ($ret != null) {
  if (array_key_exists ( "links", $ret )) {
   $infos = array ();
   $number = count ( $ret ['links'] );
   for($i = 0; $i < $number; $i ++) {//循环创建线程对象
    $thread_array [$i] = new baidu_thread_run ( $ret ['links'] [$i] );
    $thread_array [$i]->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 ()) {//如果执行结束,取出结果
     $temp = $thread_array [$thread_array_key]->data;
     if ($temp != null)
      $infos ['res'] [] = $temp;
    }
   }
   $infos ['pages'] = $ret ['pages'];
   $infos ['status'] = "1";
  } else
  $infos = null;
 } else
  $infos = null;
 return $infos;
}
/**
 * 获取百度搜索结果列表URL
 *
 * @param string $url
 *         搜索结果页URL
 * @param int $format
 *         默认$format=0,获取默认地址;$format=1获取跳转后真实地址
 * @return NULL multitype:array()
 */
function BaiduSRLinksGet($url, $format = 0) {
 $html = CurlLoad::HtmlGet ( $url ); // 获取页面
 if ($html == null)
  return null;
 try {
  preg_match_all ( "/"url":"(?<links>.*)"}/", $html, $rets ); // 搜索结果链接筛选
  if (! array_key_exists ( 'links', $rets )) // 如果数组中不包含Links键名,表示获取失败
   return null;
  $ret = array ();
  if ($format == 1) {
   $number = count ( $rets ['links'] );
   for($i = 0; $i < $number; $i ++) {
    $headr_temp = CurlLoad::Get_Headers ( $rets ['links'] [$i], 1 ); // 通过headr获取真实地址
    if (array_key_exists ( "Location", $headr_temp ))
     $ret ['links'] [$i] = $headr_temp ['Location'];
    else
     $ret ['links'] = $rets ['links'];
   }
  } else
   $ret ['links'] = $rets ['links'];
  preg_match_all ( '/href="?/s?wd=site%3Apan.baidu.com%20(?<url>.+?)&ie=utf-8">/', $html, $out );
  unset ( $out ['url'] [0] );
  $number = count ( $out ['url'] );
  for($i = 1; $i < $number; $i ++) {
   preg_match_all ( '/&pn=(.*)/', $out ['url'] [$i], $temp );
   $ret ['pages'] [$temp [1] [0] / 10] = base64_encode ( $out ['url'] [$i] );
  }
  return $ret;
 } catch ( Exception $e ) {
  WriteLog ( $e );
  return null;
 }
}
/**
 * 百度网盘资源信息获取
 *
 * @param string $url
 *         网盘资源页URL
 * @return NULL array
 */
function PanInfoGet($url) {
 $html = CurlLoad::HtmlGet ( $url ); // 获取页面
 if ($html == null)
  return null;
 try {
  if (preg_match_all ( "/文件名:(?<name>.*) 文件大小:(?<size>.*) 分享者:(?<user>.*) 分享时间:(?<date>.*) 下载次数:(?<number>[0-9]+)/", $html, $ret ) == 0)
   return null;
  $rets ['name'] = $ret ['name'] [0];
  $rets ['size'] = $ret ['size'] [0];
  $rets ['user'] = $ret ['user'] [0];
  $rets ['date'] = $ret ['date'] [0];
  $rets ['number'] = $ret ['number'] [0];
  $rets ['link'] = $url;
  return $rets;
 } catch ( Exception $e ) {
  WriteLog ( $e );
  return null;
 }
}
function WriteLog($str) {
 $file = fopen ( "../error.log", "a+" );
 fwrite ( $file, "Warning:" . date ( "Y/m/d H:i:s" ) . ":" . $str . "rn" );
 fclose ( $file );
}
/**
 * 多线程抓取对象
 * @author MuXi
 *
 */
class baidu_thread_run extends Thread {
 public $url;
 public $data;
 public function __construct($url) {
  $this->url = $url;
 }
 public function run() {
  if (($url = $this->url)) {
   $this->data = PanInfoGet ( $url );//线程执行方法
  }
 }
}
?>

 

如何联系我:【万里虎】www.bravetiger.cn 【QQ】3396726884 (咨询问题100元起,帮助解决问题500元起) 【博客】http://www.cnblogs.com/kenshinobiy/
目录
相关文章
|
28天前
|
Serverless PyTorch 算法框架/工具
Serverless应用引擎部署问题之下个节点不可用如何解决
Serverless部署是指将应用程序部署到无服务器架构中,该架构允许开发者专注于代码而无需关心底层服务器的运行和维护;针对Serverless部署过程中可能遇到的挑战,本合集提供全面的指南和最佳实践,帮助开发者顺利实现应用的无服务器化部署。
185 2
|
1月前
|
缓存 弹性计算 NoSQL
您在使用Serverless应用引擎(SAE)部署PHP应用时遇到了性能问题
【1月更文挑战第12天】【1月更文挑战第57篇】您在使用Serverless应用引擎(SAE)部署PHP应用时遇到了性能问题
343 1
|
6月前
|
IDE NoSQL 关系型数据库
开发php,需要安装哪些工具
开发php,需要安装哪些工具
|
7月前
|
关系型数据库 MySQL PHP
php开发中MySQL时间类型筛选语句的解决方案
php开发中MySQL时间类型筛选语句的解决方案
47 0
|
6月前
|
移动开发 前端开发 搜索推荐
基于PHP开发的拍卖直播系统源码分享
东莞梦幻网络科技最新推出的拍卖直播系统源码,安卓端使用Java语言开发,苹果端则采用Objective-C开发,前端H5则采用了Vue.js开发,后台管理系统基于PHP的ThinkPHP框架开发。
|
6月前
|
NoSQL 测试技术 PHP
CRM系统源码PHP开发
在竞争激烈的市场中,公司需要与客户保持积极的关系。一个好的CRM(客户关系管理)系统可以帮助公司满足客户,研究将探索建立有效的CRM以满足客户的不同方法和技术。目的是检查客户关系管理 (CRM) 在保留和满足客户方面的有效性。研究表明,客户关系管理对客户满意度有显着影响,且两个变量均呈正相关关系。公司使其 CRM 变得强大和可靠,客户将更加满意并留住公司。   
|
7月前
|
设计模式 数据库连接 PHP
PHP设计模式21-工厂模式的讲解及应用
PHP快速入门与实战学会好设计模式,能够对我们的技术水平得到非常大的提升。同时也会让我们的代码写的非常优雅,避免出错,也能更好的扩展和维护我们的项目。
101 32
|
7月前
|
IDE 关系型数据库 MySQL
window下面安装phpstudy进行PHP开发
php的集成开发环境比较多,有wamp server,xmapp,phpstudy等。经过这些年的体验,发现相对来说个人还是比较喜欢phpstudy一点。主要原因有一下几点。维护的比较频繁,一直有更新。可以灵活切换多个php版本,这样针对于不同的php项目能够很好的适应。一件集成,傻瓜安装,让开发人员关注于开发本身。
|
7月前
|
SQL 安全 关系型数据库
php开发实战分析(8):mysql类库的操作高级使用API开发(字段操作、权限分配、日期格式、跨表查询,数据分表)
php开发实战分析(8):mysql类库的操作高级使用API开发(字段操作、权限分配、日期格式、跨表查询,数据分表)
291 0

相关产品

  • 云迁移中心