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
在安装好扩展之后,就可以运用多线程了,下面贴个通过搜索结果抓取百度网盘内容的代码:
- <?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 );//线程执行方法
- }
- }
- }
- ?>
Tags: php多线程 thread开发
相关文章
- ·PHP多线程(pthreads)与自动加载BUG问题(2014-08-27)
- ·php多线程抓取信息测试例子(2014-08-27)
- ·PHP多线程的实现方法详解(2014-08-27)
- ·PHP中实现异步调用多线程程序代码(2014-08-28)
- ·php多线程的几点思考(2015-04-08)
- ·php基于Socket实现多线程开发教程(2015-04-15)
- ·PHP多线程pthreads使用例子(2015-12-24)
- ·php curl_multi 多线程查询的例子(2018-09-16)
- ·php多线程并发是怎么实现的(2018-09-18)
- ·php多线程是什么意思(2020-02-03)
- ·php fsockopen解决办法 php实现多线程(2020-08-28)
- ·使用pthreads实现真正的PHP多线程(需PHP5.3以上版本)(2020-11-27)
- ·PHP多线程编程之管道通信实例分析(2021-05-15)
- ·PHP多线程之内部多线程实例分析(2021-05-15)
- ·如何解决PHP无法实现多线程的问题(2021-06-19)
- ·php多线程实现方法及用法实例详解(2021-06-21)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)