画江湖之 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 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 3

php多进程需要pcntl,posix扩展支持

5年前 评论

@loveinalife 对的,所以最好是mac或者linux平台方便

5年前 评论

我试了下,为什么一直都是只能爬取到第一个链接的图片啊,后面的链接都没有用到

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!