画江湖之 PHP 多进程开发 [多任务采集图片]
代码 看注释 用了一个包 fabpot/goutte
<?php
include __DIR__ . '/vendor/autoload.php';//引入自动加载类
use Goutte\Client;//使用第三方采集库
$client = new Client();
$links = [
'http://www.nipic.com/topic/show_27192_1.html',
'http://www.nipic.com/topic/show_27054_1.html',
'http://www.nipic.com/topic/show_27085_1.html',
];//要爬的三个分类下的图片
$pids = [];//定义一个子进程的数组
foreach ($links as $url) {
$pid = pcntl_fork();//fork 一个子进程
switch ($pid) {
case -1:
die("Fork failed\n");
case 0:
$id = posix_getpid();//得到子进程id
$pids[$id] = $id;//存入到子进程数组id 中
$data = [];
$crawler = $client->request('GET', $url);
$crawler->filter('.search-works-thumb')->each(function($node) use ($client, $id, &$data) {
$url = $node->link()->getUri();
$crawler = $client->request('GET', $url);
$crawler->filter('#J_worksImg')->each(function($node) use ($id, &$data) {
$src = $node->image()->getUri();
$data[$id][] = $src;//存入消息队列 或者redis 都可以
//echo $src . PHP_EOL;
});
});
print_r($data);
exit;//结束子进程
break;
default:
sleep(2);
break;
}
}
while ( count($pids) ) {
if (($id = pcntl_wait($status, WUNTRACED)) > 0) {//主进程 阻塞等待子进程完成任务
unset($pids[$id]);
}
}
echo "Done\n";
本作品采用《CC 协议》,转载必须注明作者和本文链接
php多进程需要pcntl,posix扩展支持
@loveinalife 对的,所以最好是mac或者linux平台方便
我试了下,为什么一直都是只能爬取到第一个链接的图片啊,后面的链接都没有用到