作者:虎仔球妈_459 | 来源:互联网 | 2018-03-21 14:48
php多线程的使用,首先需要PHP5.3以上版本,并安装pthreadsPHP扩展,可以使PHP真正的支持多线程,扩展如何安装请自行百度.PHP扩展下载:github.com...
php多线程的使用,首先需要PHP5.3以上版本,并安装pthreads PHP扩展,可以使PHP真正的支持多线程,扩展如何安装请自行百度.
PHP扩展下载:https://github.com/krakjoe/pthreads
PHP手册文档:http://php.net/manual/zh/book.pthreads.php
在安装好扩展之后,就可以运用多线程了,下面贴个通过搜索结果抓取百度网盘内容的代码:
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[&#39;links&#39;][$i], 1); // 通过headr获取真实地址
if (array_key_exists("Location", $headr_temp)) $ret[&#39;links&#39;][$i] = $headr_temp[&#39;Location&#39;];
else $ret[&#39;links&#39;] = $rets[&#39;links&#39;];
}
} else $ret[&#39;links&#39;] = $rets[&#39;links&#39;];
preg_match_all(&#39;/href="?/s?wd=site%3Apan.baidu.com%20(?.+?)&ie=utf-8">/&#39;, $html, $out);
unset($out[&#39;url&#39;][0]);
$number = count($out[&#39;url&#39;]);
for ($i = 1; $i <$number; $i++) {
preg_match_all(&#39;/&pn=(.*)/&#39;, $out[&#39;url&#39;][$i], $temp);
$ret[&#39;pages&#39;][$temp[1][0] / 10] = base64_encode($out[&#39;url&#39;][$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[&#39;name&#39;] = $ret[&#39;name&#39;][0];
$rets[&#39;size&#39;] = $ret[&#39;size&#39;][0];
$rets[&#39;user&#39;] = $ret[&#39;user&#39;][0];
$rets[&#39;date&#39;] = $ret[&#39;date&#39;][0];
$rets[&#39;number&#39;] = $ret[&#39;number&#39;][0];
$rets[&#39;link&#39;] = $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); //线程执行方法
}
}
}
?>