php多线程抓取信息测试例子
发布:smiling 来源: PHP粉丝网 添加日期:2014-08-27 10:15:31 浏览: 评论:0
只在php5.3以后的版本才真正的可以使用多线程序了,以前都是假的curl实现的多线程工作,下面我来给各位介绍几个多线程抓取信息测试例子,希望对各位会有帮助.
PHP 5.3 以上版本,使用pthreads PHP扩展,可以使PHP真正地支持多线程。多线程在处理重复性的循环任务,能够大大缩短程序执行时间。
PHP扩展下载:https://github.com/krakjoe/pthreads
PHP手册文档:http://php.net/manual/zh/book.pthreads.php
1、扩展的编译安装Linux,编辑参数 --enable-maintainer-zts 是必选项:
- cd /Data/tgz/php-5.3.8
- ./configure --prefix=/Data/apps/php --with-config-file-path=/Data/apps/php/etc --with-mysql=/Data/apps/mysql --with-mysqli=/Data/apps/mysql/bin/mysql_config --with-iconv-dir --with-freetype-dir=/Data/apps/libs --with-jpeg-dir=/Data/apps/libs --with-png-dir=/Data/apps/libs --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-fpm --enable-mbstring --with-mcrypt=/Data/apps/libs --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --enable-opcache --with-pdo-mysql --enable-maintainer-zts
- make clean
- make
- make install
- unzip pthreads-master.zip
- cd pthreads-master
- /Data/apps/php/bin/phpize
- ./configure --with-php-config=/Data/apps/php/bin/php-config
- make
- make install
添加扩展:
vi /Data/apps/php/etc/php.ini
extension = "pthreads.so"
一段PHP多线程、与For循环,抓取百度搜索页面的PHP代码示例,代码如下:
- <?php
- class test_thread_run extends Thread
- {
- public $url;
- public $data;
- public function __construct($url)
- {
- $this->url = $url;
- }
- public function run()
- {
- if(($url = $this->url))
- {
- $this->data = model_http_curl_get($url);
- }
- }
- }
- function model_thread_result_get($urls_array)
- {
- foreach ($urls_array as $key => $value)
- {
- $thread_array[$key] = new test_thread_run($value["url"]);
- $thread_array[$key]->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())
- {
- $variable_data[$thread_array_key] = $thread_array[$thread_array_key]->data;
- }
- }
- return $variable_data;
- }
- function model_http_curl_get($url,$userAgent="")
- {
- $userAgent = $userAgent ? $userAgent : 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)';
- $curl = curl_init();
- curl_setopt($curl, CURLOPT_URL, $url);
- curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($curl, CURLOPT_TIMEOUT, 5);
- curl_setopt($curl, CURLOPT_USERAGENT, $userAgent);
- $result = curl_exec($curl);
- curl_close($curl);
- return $result;
- }
- for ($i=0; $i < 100; $i++)
- {
- $urls_array[] = array("name" => "baidu", "url" => "http://www.baidu.com/s?wd=".mt_rand(10000,20000));
- }
- $t = microtime(true);
- $result = model_thread_result_get($urls_array);
- $e = microtime(true);
- echo "多线程:".($e-$t)."n";
- //开源代码phpfensi.com
- $t = microtime(true);
- foreach ($urls_array as $key => $value)
- {
- $result_new[$key] = model_http_curl_get($value["url"]);
- }
- $e = microtime(true);
- echo "For循环:".($e-$t)."n";
- ?>
例子,采集数据,代码如下:
- <?php
- $urls = array(
- 'http://www.111cn.net/',
- 'http://www.sohu.com/',
- 'http://www.163.com/'
- );
- $save_to='/test.txt'; // 把抓取的代码写入该文件
- $st = fopen($save_to,"a");
- $mh = curl_multi_init();
- foreach ($urls as $i => $url) {
- $conn[$i] = curl_init($url);
- curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)");
- curl_setopt($conn[$i], CURLOPT_HEADER ,0);
- curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60);
- curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,true); // 设置不将爬取代码写到浏览器,而是转化为字符串
- curl_multi_add_handle ($mh,$conn[$i]);
- }
- do {
- curl_multi_exec($mh,$active);
- } while ($active);
- foreach ($urls as $i => $url) {
- $data = curl_multi_getcontent($conn[$i]); // 获得爬取的代码字符串
- fwrite($st,$data); // 将字符串写入文件。当然,也可以不写入文件,比如存入数据库
- } // 获得数据变量,并写入文件
- foreach ($urls as $i => $url) {
- curl_multi_remove_handle($mh,$conn[$i]);
- curl_close($conn[$i]);
- }
- curl_multi_close($mh);
- fclose($st);
- ?>
Tags: php多线程 php抓取信息
相关文章
- ·php多线程thread开发与应用的例子(2014-06-25)
- ·PHP多线程(pthreads)与自动加载BUG问题(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)