讲解thinkphp5.1如何实现多线程爬虫

广告:宝塔Linux面板高效运维的服务器管理软件 点击【 https://www.bt.cn/p/uNLv1L 】立即购买

讲解thinkphp5.1如何实现多线程爬虫

下面thinkphp框架教程栏目将给大家讲解thinkphp5.1 利用cli命令行+Guzzle类库实现多线程爬虫,希望对需要的朋友有所帮助!

创建一个cli命令
php think make:command Thread thread
登录后复制

测试能否成功执行

php think thread
登录后复制登录后复制安装Guzzle类库

文档地址:guzzle文档地址(https://guzzle-cn.readthedocs.io/zh_CN/latest/quickstart.html)

实现代码
<?php/** * Created by. * User: Jim * Date: 2020/9/29 * Time: 14:31 */namespace app\command;use GuzzleHttp\Client;use GuzzleHttp\Pool;use think\console\Command;use think\console\Input;use think\console\Output;/** * Guzzle * Class Thread * @package app\command * 文档地址 https://guzzle-cn.readthedocs.io/zh_CN/latest/quickstart.html */class Thread extends Command{    /**     * 请求的总次数     * @var int     */    protected $totalPageCount = 50;    /**     * 当前请求的次数     * @var int     */    protected static $counter = 1;    /**     * 线程的数量     * @var int     */    protected $threads = 20;    protected function configure()    {        // 指令配置        $this->setName('thread');        // 设置参数    }    protected function execute(Input $input, Output $output)    {        $client = new Client();        $requests = function ($total) use ($client) {            foreach (range(1, $total) as $r) {                $uri = 'https://apinew.juejin.im/content_api/v1/short_msg/detail';                yield function () use ($client, $uri) {                    return $client->postAsync($uri, [                        'verify' => false,                        'json' => [                            'msg_id' => '6845185452727599118'                        ]                    ]);                };            }        };        $pool = new Pool($client, $requests($this->totalPageCount), [            'concurrency' => $this->threads,            // 请求成功            'fulfilled' => function ($response, $index) use ($output) {                $res = $response->getBody()->getContents();                $output->writeln($res);                $output->writeln("正在执行第{$index}个·····");                if ($this->checkThreadIsEnd() == true) {                    $output->writeln("------------请求结束---------");                    return false;                }            },            // 请求失败            'rejected' => function ($reason, $index) use ($output) {                $output->writeln("执行失败,{$reason}");            },        ]);        $promise = $pool->promise();        $promise->wait();    }    /**     * 检测任务是否结束     * @return bool     */    private function checkThreadIsEnd()    {        if (self::$counter < $this->totalPageCount) {            self::$counter++;            return false;        } else {            return true;        }    }}
登录后复制执行命令
php think thread
登录后复制登录后复制效果

以上就是讲解thinkphp5.1如何实现多线程爬虫的详细内容,更多请关注9543建站博客其它相关文章!

广告:SSL证书一年128.66元起,点击购买~~~

9543建站博客
一个专注于网站开发、微信开发的技术类纯净博客。
作者头像
admin创始人

肥猫,知名SEO博客站长,14年SEO经验。

上一篇:学swoole还是golang
下一篇:linux系统下workerman无法启动

发表评论

关闭广告
关闭广告