PHP多线程之内部多线程实例分析
来源: 阅读:639 次 日期:2015-03-11 11:31:46
温馨提示: 小编为您整理了“PHP多线程之内部多线程实例分析”,方便广大网友查阅!

这篇文章主要介绍了PHP多线程之内部多线程,实例分析了php多线程的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例分析了PHP多线程之内部多线程用法。分享给大家供大家参考。具体如下:

代码如下:

<?php

class Http_MultiRequest

{

//要并行抓取的url 列表

private $urls = array();

//curl 的选项

private $options;

//构造函数

function __construct($options = array())

{

$this->setOptions($options);

}

//设置url 列表

function setUrls($urls)

{

$this->urls = $urls;

return $this;

}

//设置选项

function setOptions($options)

{

$options[CURLOPT_RETURNTRANSFER] = 1;

if (isset($options['HTTP_POST']))

{

curl_setopt($ch, CURLOPT_POST, 1);

curl_setopt($ch, CURLOPT_POSTFIELDS, $options['HTTP_POST']);

unset($options['HTTP_POST']);

}

if (!isset($options[CURLOPT_USERAGENT]))

{

$options[CURLOPT_USERAGENT] = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;)';

}

if (!isset($options[CURLOPT_FOLLOWLOCATION]))

{

$options[CURLOPT_FOLLOWLOCATION] = 1;

}

if (!isset($options[CURLOPT_HEADER]))

{

$options[CURLOPT_HEADER] = 0;

}

$this->options = $options;

}

//并行抓取所有的内容

function exec()

{

if(empty($this->urls) || !is_array($this->urls))

{

return false;

}

$curl = $data = array();

$mh = curl_multi_init();

foreach($this->urls as $k => $v)

{

$curl[$k] = $this->addHandle($mh, $v);

}

$this->execMulitHandle($mh);

foreach($this->urls as $k => $v)

{

$data[$k] = curl_multi_getcontent($curl[$k]);

curl_multi_remove_handle($mh, $curl[$k]);

}

curl_multi_close($mh);

return $data;

}

//只抓取一个网页的内容。

function execOne($url)

{

if (empty($url)) {

return false;

}

$ch = curl_init($url);

$this->setOneOption($ch);

$content = curl_exec($ch);

curl_close($ch);

return $content;

}

//内部函数,设置某个handle 的选项

private function setOneOption($ch)

{

curl_setopt_array($ch, $this->options);

}

//添加一个新的并行抓取 handle

private function addHandle($mh, $url)

{

$ch = curl_init($url);

$this->setOneOption($ch);

curl_multi_add_handle($mh, $ch);

return $ch;

}

//并行执行(这样的写法是一个常见的错误,我这里还是采用这样的写法,这个写法

//下载一个小文件都可能导致cup占用100%, 并且,这个循环会运行10万次以上

//这是一个典型的不懂原理产生的错误。这个错误在PHP官方的文档上都相当的常见。)

private function execMulitHandle($mh)

{

$running = null;

do {

curl_multi_exec($mh, $running);

} while ($running > 0);

}

}

/*下面是上面的类的一个测试的例子:*/

$urls = array("", );

$m = new Http_MultiRequest();

$t = microtime(true);

$m->setUrls($urls);

//parallel fetch(并行抓取):

$data = $m->exec();

$parallel_time = microtime(true) - $t;

echo $parallel_time . "\n";

$t = microtime(true);

//serial fetch(串行抓取):

foreach ($urls as $url)

{

$data[] = $m->execOne($url);

}

$serial_time = microtime(true) - $t;

echo $serial_time . "\n";

希望本文所述对大家的php程序设计有所帮助。

更多信息请查看IT技术专栏

更多信息请查看网络编程
由于各方面情况的不断调整与变化, 提供的所有考试信息和咨询回复仅供参考,敬请考生以权威部门公布的正式信息和咨询为准!
关于我们 | 联系我们 | 人才招聘 | 网站声明 | 网站帮助 | 非正式的简要咨询 | 简要咨询须知 | 加入群交流 | 手机站点 | 投诉建议
工业和信息化部备案号:滇ICP备2023014141号-1 云南省教育厅备案号:云教ICP备0901021 滇公网安备53010202001879号 人力资源服务许可证:(云)人服证字(2023)第0102001523号
云南网警备案专用图标
联系电话:0871-65317125(9:00—18:00) 获取招聘考试信息及咨询关注公众号:hfpxwx
咨询QQ:526150442(9:00—18:00)版权所有:
云南网警报警专用图标
Baidu
map