php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
发布:smiling 来源: PHP粉丝网 添加日期:2022-02-13 12:49:04 浏览: 评论:0
本文实例讲述了php使用pthreads v3多线程实现抓取新浪新闻信息,分享给大家供大家参考,具体如下:
我们使用pthreads,来写一个多线程的抓取页面小程序,把结果存到数据库里。
数据表结构如下:
- CREATE TABLE `tb_sina` (
- `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
- `url` varchar(256) DEFAULT '' COMMENT 'url地址',
- `title` varchar(128) DEFAULT '' COMMENT '标题',
- `time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '时间',
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='sina新闻';
代码如下:
- <?php
- class DB extends Worker
- {
- private static $db;
- private $dsn;
- private $root;
- private $pwd;
- public function __construct($dsn, $root, $pwd)
- {
- $this->dsn = $dsn;
- $this->root = $root;
- $this->pwd = $pwd;
- }
- public function run()
- {
- //创建连接对象
- self::$db = new PDO($this->dsn, $this->root, $this->pwd);
- //把require放到worker线程中,不要放到主线程中,不然会报错找不到类
- require './vendor/autoload.php';
- }
- //返回一个连接资源
- public function getConn()
- {
- return self::$db;
- }
- }
- class Sina extends Thread
- {
- private $name;
- private $url;
- public function __construct($name, $url)
- {
- $this->name = $name;
- $this->url = $url;
- }
- public function run()
- {
- $db = $this->worker->getConn();
- if (emptyempty($db) || emptyempty($this->url)) {
- return false;
- }
- $content = file_get_contents($this->url);
- if (!emptyempty($content)) {
- //获取标题,地址,时间
- $data = QL\QueryList::Query($content, [
- 'tit' => ['.c_tit > a', 'text'],
- 'url' => ['.c_tit > a', 'href'],
- 'time' => ['.c_time', 'text'],
- ], '', 'UTF-8', 'GB2312')->getData();
- //把获取的数据插入数据库
- if (!emptyempty($data)) {
- $sql = 'INSERT INTO tb_sina(`url`, `title`, `time`) VALUES';
- foreach ($data as $row) {
- //修改下时间,新浪的时间格式是这样的04-23 15:30
- $time = date('Y') . '-' . $row['time'] . ':00';
- $sql .= "('{$row['url']}', '{$row['tit']}', '{$time}'),";
- }
- $sql = rtrim($sql, ',');
- $ret = $db->exec($sql);
- if ($ret !== false) {
- echo "线程{$this->name}成功插入{$ret}条数据\n";
- } else {
- var_dump($db->errorInfo());
- }
- }
- }
- }
- }
- //抓取页面地址
- $url = 'http://roll.news.sina.com.cn/s/channel.php?ch=01#col=89&spec=&type=&ch=01&k=&offset_page=0&offset_num=0&num=60&asc=&page=';
- //创建pool池
- $pool = new Pool(5, 'DB', ['mysql:dbname=test;host=192.168.33.226', 'root', '']);
- //获取100个分页数据
- for ($ix = 1; $ix <= 100; $ix++) {
- $pool->submit(new Sina($ix, $url . $ix));
- }
- //循环收集垃圾,阻塞主线程,等待子线程结束
- while ($pool->collect()) ;
- $pool->shutdown();
由于使用到了QueryList,大家可以通过composer进行安装。
composer require jaeger/querylist
不过安装的版本是3.2,在我的php7.2下会有问题,由于each()已经被废弃,所以修改下源码,each()全换成foreach()就好了。
运行结果如下:
数据也保存进了数据库
当然大家也可以再次通过url,拿到具体的页面内容,这里就不做演示了,有兴趣的可以自已去实现。
Tags: pthreads php多线程
- 上一篇:php操作redis数据库常见方法实例总结
- 下一篇:最后一页
相关文章
- ·PHP多线程(pthreads)与自动加载BUG问题(2014-08-27)
- ·PHP多线程pthreads使用例子(2015-12-24)
- ·使用pthreads实现真正的PHP多线程(需PHP5.3以上版本)(2020-11-27)
- ·php pthreads多线程的安装与使用(2021-07-06)
- ·php多线程thread开发与应用的例子(2014-06-25)
- ·php多线程抓取信息测试例子(2014-08-27)
- ·PHP多线程的实现方法详解(2014-08-27)
- ·PHP中实现异步调用多线程程序代码(2014-08-28)
- ·php多线程的几点思考(2015-04-08)
- ·php基于Socket实现多线程开发教程(2015-04-15)
- ·php curl_multi 多线程查询的例子(2018-09-16)
- ·php多线程并发是怎么实现的(2018-09-18)
- ·php多线程是什么意思(2020-02-03)
- ·php fsockopen解决办法 php实现多线程(2020-08-28)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)