php使用pthreads v3多线程实现抓取新浪新闻信息操作示例


Posted in PHP onFebruary 21, 2020

本文实例讲述了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 (empty($db) || empty($this->url)) {
      return false;
    }

    $content = file_get_contents($this->url);
    if (!empty($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 (!empty($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()就好了。

运行结果如下:

php使用pthreads v3多线程实现抓取新浪新闻信息操作示例

数据也保存进了数据库

php使用pthreads v3多线程实现抓取新浪新闻信息操作示例

当然大家也可以再次通过url,拿到具体的页面内容,这里就不做演示了,有兴趣的可以自已去实现。

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

PHP 相关文章推荐
怎样去阅读一份php源代码
Aug 21 PHP
PHP函数spl_autoload_register()用法和__autoload()介绍
Feb 04 PHP
ThinkPHP的RBAC(基于角色权限控制)深入解析
Jun 17 PHP
解析PHP提交后跳转
Jun 23 PHP
如何取得中文字符串中出现次数最多的子串
Aug 08 PHP
将php数组输出html表格的方法
Feb 24 PHP
thinkphp模板赋值与替换实例简述
Nov 24 PHP
crontab无法执行php的解决方法
Jan 25 PHP
PHP框架性能测试报告
May 08 PHP
PHP文件管理之实现网盘及压缩包的功能操作
Sep 20 PHP
PHP+RabbitMQ实现消息队列的完整代码
Mar 20 PHP
实例讲解PHP表单
Jun 10 PHP
php操作redis数据库常见方法实例总结
Feb 20 #PHP
php使用redis的几种常见操作方式和用法示例
Feb 20 #PHP
PHP使用openssl扩展实现加解密方法示例
Feb 20 #PHP
php使用redis的有序集合zset实现延迟队列应用示例
Feb 20 #PHP
解决windows上php xdebug 无法调试的问题
Feb 19 #PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
Feb 18 #PHP
laravel框架select2多选插件初始化默认选中项操作示例
Feb 18 #PHP
You might like
PHP中使用Session配合Javascript实现文件上传进度条功能
2014/10/15 PHP
PHP APP微信提现接口代码
2018/09/30 PHP
滚动条变色 隐藏滚动条与双击网页自动滚屏显示代码
2009/12/28 Javascript
jQuery数组处理代码详解(含实例演示)
2012/02/03 Javascript
jquery表单验证使用插件formValidator
2012/11/10 Javascript
jQuery.validate 常用方法及需要注意的问题
2013/03/20 Javascript
js+css实现的简单易用兼容好的分页
2013/12/30 Javascript
js文件Cookie存取值示例代码
2014/02/20 Javascript
js 判断控件获得焦点的示例代码
2014/03/04 Javascript
javascript动态创建链接的方法
2015/05/13 Javascript
浅谈JavaScript前端开发的MVC结构与MVVM结构
2016/06/03 Javascript
IE8利用自带的setCapture和releaseCapture解决iframe的拖拽事件方法
2016/10/25 Javascript
JS文件/图片从电脑里面拖拽到浏览器上传文件/图片
2017/03/08 Javascript
EasyUI创建人员树的实例代码
2017/09/15 Javascript
初识 Vue.js 中的 *.Vue文件
2017/11/22 Javascript
修改Nodejs内置的npm默认配置路径方法
2018/05/13 NodeJs
vue富文本编辑器组件vue-quill-edit使用教程
2018/09/21 Javascript
在vue里使用codemirror遇到的问题
2018/11/01 Javascript
使用vuex存储用户信息到localStorage的实例
2019/11/11 Javascript
微信JSSDK实现打开摄像头拍照再将相片保存到服务器
2019/11/15 Javascript
基于javascript原生判断DOM是否加载完毕
2020/10/14 Javascript
[59:15]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第一场 11.20
2020/11/20 DOTA
Pytorch 实现权重初始化
2019/12/31 Python
python给list排序的简单方法
2020/12/10 Python
size?瑞典:英国伦敦的球鞋精品店
2018/03/01 全球购物
为什么需要版本控制?
2013/08/08 面试题
最新教师自我评价分享
2013/11/12 职场文书
毕业生就业推荐信范文
2013/12/01 职场文书
职业生涯规划设计步骤
2014/01/12 职场文书
《浅水洼里的小鱼》听课反思
2014/02/28 职场文书
开门红主持词
2014/04/02 职场文书
校园运动会广播稿
2014/10/06 职场文书
小班教师个人总结
2015/02/05 职场文书
评职称个人总结
2015/03/05 职场文书
孩子满月酒答谢词
2015/09/30 职场文书
2015元旦感言
2015/12/09 职场文书