php多线程thread开发与应用的例子
程序员文章站
2022-04-15 12:34:10
...
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 .+?)&ie=utf-8">/', $html, $out); unset($out['url'][0]); $number = count($out['url']); for ($i = 1; $i .*) 文件大小:(?.*) 分享者:(? .*) 分享时间:(? .*) 下载次数:(? [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); //线程执行方法 } } } ?>
上一篇: 跨域请求的原因及解决方案