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

PHP手册文档:http://php.net/manual/zh/book.pthreads.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":"(?.*)"}/", $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(?.+?)&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 ( "/文件名:(?.*) 文件大小:(?.*) 分享者:(?.*) 分享时间:(?.*) 下载次数:(?[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 );//线程执行方法

}

}

}

?>

php thread 例子,php多线程thread开发与应用的例子相关推荐

  1. java多线程thread使用_Java多线程——thread及runnable的基本使用及交替执行

    /*** Created by LiuHuiChao on 2016/3/11.*/public classActor extendsThread { @Overridepublic voidrun( ...

  2. 继承Thread类实现多线程简单实例

    继承Thread类实现多线程简单实例 文章目录 继承Thread类实现多线程简单实例 一.多线程的意义 二.多线程的创建 三.代码 一.多线程的意义 1.为什么要使用多线程 (a)提高用户体验或者避免 ...

  3. 【java的socket编程】结合多线程Thread实现通信(使用线程池和非线程池对比)、java开发UDP/IP网络程序

    结合多线程实现socket 使用非线程池(拓展Thread) 使用线程池(Executor pool) 使用DatagramPacket DatagramSocket开发UDP/IP程序 使用UDP获 ...

  4. Android开发笔记(四十八)Thread类实现多线程

    Thread概述 Thread类是真正的线程,查看源码可见Thread也实现了Runnable接口,但它内部有创建新的工作线程,所以Thread对象运行在与主线程不一样的分线程上. 因为Thread对 ...

  5. java中thread实例_Java多线程2:Thread中的实例方法

    Thread类中的方法调用方式: 学习Thread类中的方法是学习多线程的第一步.在学习多线程之前特别提出一点,调用Thread中的方法的时候,在线程类中,有两种方式,一定要理解这两种方式的区别: 1 ...

  6. Java 多线程Thread

    重点: java中多线程运行原理 掌握两种线程创建方式 两种创建线程方式好处和弊端 掌握使用Thread类 中获取和设置线程名称的方法 使用匿名内部类创建多线程 描述java中线程池的运行原理 线程安 ...

  7. python的多线程threading_Python中多线程thread与threading的实现方法,pythonthreading

    Python中多线程thread与threading的实现方法,pythonthreading 学过Python的人应该都知道,Python是支持多线程的,并且是native的线程.本文主要是通过th ...

  8. [C++] - C++11 多线程 - Thread

    转载整理自:https://github.com/forhappy/Cplusplus-Concurrency-In-Practice/tree/master/zh/chapter3-Thread 1 ...

  9. 多线程 -Thread -Runnable -Callable

    多线程(Thread) 线程简介 线程实现 线程状态 线程同步 线程通信问题 高级主题 核心概念 线程就是独立的执行路径; 在程序运行时,即使没有自己创建线程,后台也会有多个线程,如主线程,gc程; ...

最新文章

  1. JVM运行时数据区---堆(堆内存)
  2. asp连接mysql odbc,在ASP中连接MySQL数据库的方法,最好的通过ODBC方法
  3. 关于C#(ASP.net)存取MySQL LongText字段的心得[转]
  4. Spring的Java配置方式
  5. Windows环境下32位汇编程序设计C版code--第五章(三)
  6. C++ leetCode 1. 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个
  7. 上海市二级c语言软件环境,上海市计算机二级C语言复习资料 word整理版.doc
  8. 有些事情现在不做一辈子就都不会做了
  9. Eclipse中部分快捷键
  10. Restful Service 中 DateTime 在 url 中传递
  11. java生成图片验证码
  12. plot sin 03-数据区域边界线的位置
  13. 信息系统项目管理师核心考点(十九)制定项目章程依据(输入)
  14. 38掌握分布式存储系统 GlusterFS 的基本用法,包括卷管理、数据复制
  15. Linux使用zip打包文件
  16. CSS3-选择器+文字+边框+背景+颜色+渐变
  17. 一文读懂:股权激励的“三重境界”
  18. 猿创征文 | Java知识【Java基础语法】
  19. VTK学习笔记(三十六)VTK图像填充
  20. 腾达n4怎么设置虚拟服务器,腾达(Tenda)N4无线路由器怎么设置

热门文章

  1. Tricks(三十四)—— 判断某一属性列是数值型还是标称型
  2. vb还是python强大-VB已死,Python当立 | 忆云竹
  3. python中国官网-Python教程
  4. 零基础学python-如何零基础开始自学Python编程
  5. python用什么来写模块-使用C语言编写Python模块-引子【转】
  6. 小学生python编程教程-围观~山东省的小学生Python编程入门都学的什么?
  7. python从入门到精通pdf下载-Python网络爬虫从入门到精通 PDF 下载
  8. 启达传媒-微信小程序|微信小程序工具|微信小程序开发|微信小程序制作
  9. html列表隐藏显示出来,JavaScript栏目列表隐藏/显示简单实现
  10. java 获取js元素,表单元素值获取方式js及java方式的简单实例