「这是我参与2022首次更文挑战的第20天,活动详情查看:2022首次更文挑战」
课程背景
- 我作为一个PHP工程师 虽然这几年PHP没落了
- 但我还是有责任补充一些PHP方面的高级教程
- 掘金粑粑开始更文奖励了 不能白白拿人家的奖励
应该发表一些高层次的PHP的技术文章别让PHP倒了
正文开始
前面我们用单线程完成了爬取图片的底层业务,只是单线程速度太慢。不是我们所需要的。所以我们尝试使用多线程。
1 介绍
- php其实本来就是个脚本语言,对于请求跟响应是不存在多线程的。所以如果要弄成多线程,那就只能在php命令行中。
- php实现多线程有两种方式,一种是官方提供的进程控制pcntl方法。还有就是php神器Swoole了。
- 因为多线程这部分内容比较复杂,也是一个瓶颈吧。涉及到很多计算机线程,同步异步方面的知识。所以如果你不是很懂,建议去这个文档看一看,一定会对你有帮助的。EsaySwoole文档
2 创建多个先线程。
开启一个线程的方法
//创建单个线程
$process = new swoole_process(function($pro){
var_dump($pro->pid);
},false);
$process->start();
swoole_process::wait(); //等待执行完成
开始多个线程就是上面的代码循环几遍
<?php
for ($i=0; $i < 10; $i++) {
$process = new swoole_process(function($pro){
var_dump($pro->pid);
},false);
$process->start();
}
for ($i=0; $i < 10; $i++) {
swoole_process::wait();
}
开启进程具体需要做的事情,就是写在闭包中。闭包中定义好要执行的操作以后,掉用当前进程的 start()方法,就可以看起当前进程。
我们做爬取的思路就是提前生成好了需要爬取的连接,也就是把需要完成的工作确定了。剩下的就是分配给相应的线程进行完成即可。