不到40行代码教你如何利用php高效快速的爬取10w+网页数据
2020-05-25 本文已影响0人
张清柏
- 前几天看了一下swoole,今天找到了使用场景,就简单写一个demo
- swoole安装教程》》之前分享过,自己去公众号找一下
- 本文是 php利用swoole协程启动多个子进程模式,根据服务器配置实现子进程自定义数量,从而 避免因进程过多导致服务器卡死(本人已经历)
- demo场景,爬取10w+个网页内容
- 脚本
test1.php
内容
<?php
/**
* Created by PhpStorm.
* User: zhangguofu
* Date: 20/5/17
* Time: 上午12:31
*/
echo "process-start-time:" . date("Ymd H:i:s") . PHP_EOL;
$baseUrl = "http://www.baidu.com/";//自定义网页
$count = 1000;//为了方便演示,此处用1000意思一下
for ($i = 0; $i < $count; $i++) {
creatProcess($i, $baseUrl);
}
function creatProcess($i, $url)
{
// 每次过来统计一下进程数量
$cmd = "ps -ef |grep test1 |grep -v grep |wc -l";
$pCount = system($cmd);//进程数量
if ($pCount < 200) {
// 创建子进程
$process = new swoole_process(function (swoole_process $worker) use ($i, $url) {
$content = curlData($url);//方法里面处理你的逻辑
});
$pid = $process->start();
echo $url . '------第' . $i . '个子进程创建完毕'.PHP_EOL;
} else {
sleep(10);//可以根据实际情况定义
creatProcess($i, $url);
}
}
function curlData($url)
{
sleep(20);//为了让子进程多存在一段时间,让大家看到效果
$content = file_get_contents($url);
file_put_contents("./sData/baidu.txt","tttttttttttttttt".$content,FILE_APPEND);
}
echo "process-end-time:" . date("Ymd H:i:s");
-
执行
php test1
-
查看命令行输出结果

- 截图相关解释
- 子进程数量一直在200左右(满200我sleep了10s,所以不会一直是200)。大大提高效率
- 另写了一个监控脚本,每一秒输出一下进程数量
while (true){ echo "Time" . date("Ymd H:i:s").'----------'; sleep(1); $cmd="ps -ef |grep test1 |grep -v grep |wc -l"; $ret1 = system($cmd); }


-
请求1000次,时间一共是144秒,里面还有几次sleep的时间,如果去掉sleep,真实时间48s,当然,逻辑业务不一样,时间也不一样
process-start-time:20200525 18:25:36 process-end-time:20200525 18:26:24
- 看一下我爬取的数据 1000条没毛病
