首页 > php教程 > php手册 > 正文

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

php中文网
发布: 2016-05-25 16:45:20
原创
1481人浏览过

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

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

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

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

BJXSHOP网上购物系统 - 书店版
BJXSHOP网上购物系统 - 书店版

BJXSHOP购物管理系统是一个功能完善、展示信息丰富的电子商店销售平台;针对企业与个人的网上销售系统;开放式远程商店管理;完善的订单管理、销售统计、结算系统;强力搜索引擎支持;提供网上多种在线支付方式解决方案;强大的技术应用能力和网络安全系统 BJXSHOP网上购物系统 - 书店版,它具备其他通用购物系统不同的功能,有针对图书销售而进行开发的一个电子商店销售平台,如图书ISBN,图书目录

BJXSHOP网上购物系统 - 书店版 0
查看详情 BJXSHOP网上购物系统 - 书店版
<?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免费学习笔记(深入)”;

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号