php多线程thread开发与应用的例子
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 );//线程执行方法
}
}
}
?>
php多线程thread开发与应用的例子的更多相关文章
- 【C#多线程】C#多线程 Thread 开发基础
引用 using System; using System.Threading; 多线程代码 Thread mainthread = new Thread(ExecuteThread); mainth ...
- [java多线程] - Thread&Runnable运用
负载是一个很大的话题,也是一个非常重要的话题.不管是在大的互联网软件中,还是在一般的小型软件,都对负载有一定的要求,负载过高会导致服务器压力过大:负载过低又比较浪费服务器资源,而且当高请求的时候还可能 ...
- 多线程-Thread和ThreadPool
多线程原理 多线程都是基于委托的. 多线程优缺点 缺点: 1.导致程序复杂,开发调试维护困难,特别是线程交互. 2.线程过多导致服务器卡死,因为占用CPU 内存等资源. 优点: 1.良好的交互,特别对 ...
- 多线程(Thread),其实很简单!
目录: 1:线程简介 2:怎么操作线程 3:Thread的常用方法 4:简单的获奖机 5:应用程序域 线程:是Windows任务调度的最小单位.线程是程序中的一个执行流,每个线 ...
- c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习
c#中@标志的作用 参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...
- 2.匿名类,匿名类对象,private/protected/public关键字、abstract抽象类,抽象方法、final关键字的使用,多线程Thread类start方法原理
package com.bawei.multithread; //注意:模板方法我们通常使用抽象类或者抽象方法!这里我们为了方便在本类中使用就没有使用抽象类/抽象方法 public class Tem ...
- QT 多线程程序设计(也有不少例子)
QT通过三种形式提供了对线程的支持.它们分别是,一.平台无关的线程类,二.线程安全的事件投递,三.跨线程的信号-槽连接.这使得开发轻巧的多线程Qt程序更为容易,并能充分利用多处理器机器的优势.多线程编 ...
- android 多线程Thread,Runnable,Handler,AsyncTask
先看两个链接: 1.http://www.2cto.com/kf/201404/290494.html 2. 链接1: android 的多线程实际上就是java的多线程.android的UI线程又称 ...
- VC++ 多线程编程,win32,MFC 例子(转)
一.问题的提出 编写一个耗时的单线程程序: 新建一个基于对话框的应用程序SingleThread,在主对话框IDD_SINGLETHREAD_DIALOG添加一个按钮,ID为IDC_SLEEP_SIX ...
随机推荐
- centos7下载安装谷歌浏览器
centos7安装完成结束后,发现自带的火狐浏览器不太习惯,自己还是习惯谷歌浏览器,因为是新手嘛,所以自己就各种找教程看如何下载安装谷歌浏览器,一个一个按照教程试验,终于最后试验成功了一个,亲测可用. ...
- 用Cookie记住上次登录用户名
一个登录页面设置查看Cookie中的数据(Cookie不为null);然后将页面提交到另一个页面去,在这个页面中的到是否选择记住用户名,如果选择了, 就创建Cookie对象,将用户名存储起来,下次登录 ...
- Microsoft Visual Studio 2013 Update 1 离线安装程序
☆ 微软官网地址:☆http://www.microsoft.com/zh-cn/download/details.aspx?id=41650☆ 离线安装程序 直接下载链接:☆http://downl ...
- 获取XML配置数据
XML结构: <Setting> <BIG> <tdHead> <td TdName="序号" TdWidth=&quo ...
- 【转】关于C#使用Excel的数据透视表的例子
收到消息,下星期又有导出 Excel 报表的代码要写.心想,不就是 OleDb 先 CREATE 表, 然后 INSERT 么?都是体力活啊...... 结果拿到纸张的报表,我就悲剧了.报表的结构,像 ...
- [转]Windows Shell 编程 第四章 【来源 http://blog.csdn.net/wangqiulin123456/article/details/7987933】
第四章 文件的本质 以前,所有文件和目录都有一个确定的属性集:时间,日期,尺寸,以及表示‘只读的’,‘隐藏的,‘存档的’,或‘系统的’状态标志.然而,Windos95(及后来的WindowsNT4.0 ...
- HTML5标签及使用方法描述
HTML 5 作为新一代的超文本标记语言,增加了许多标签.这些标签不但更有语义,而且功能强大.具体有以下标签: <article> 定义外部的内容.比如来自一个外部的新闻提供者的一篇新的文 ...
- Android logcat使用
Android logcat使用 1. Android日志说明 当Android系统运行的时候,会搜集所有的系统信息. logcat是Android系统的一个命令行工具,主要用来查看和过滤日志信息. ...
- JSON的基本格式以及与JavaScript之间的转换
JSON的基本格式以及与JavaScript之间的转换 近来,发现很多人写json格式的数据时,总是没有达到JSON的规范,虽然在语言要求不严格的情况下能够通过, 但是,难免会遇到这样那样的问题,到时 ...
- docker+tomcat+java配置(ubuntu)
原创文章,转载请注明出处. 本文是基于ubuntu14.04搭建的dosker,tomcat配置是在docker容器外面(为了方便查看日志)使用的是docker启动挂载,该tomcat工程依赖于doc ...