V2EX 首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  PHP

请问大家是怎么处理 PHP 多进程的?

  •  
  •   ericgui · 68 天前 · 1551 次点击
    这是一个创建于 68 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近在写爬虫,然后页面必须要 用到 chromedriver 和 selenium,速度慢,效率低
    所以想用多进程,看到一个库,symfony/process
    看了半天,也没明白怎么搞多进程

    能否请教一下,大家是怎么做 多 进程的?

    如果有其他办法提高爬虫效率 ,也请不吝赐教,谢谢
    19 回复  |  直到 2017-09-14 13:40:05 +08:00
        1
    R18   68 天前 via Android
        2
    orderc   68 天前
    pcntl_fork
        3
    ericgui   68 天前
    @R18 这个 pcntl 有 wrapper 吗?
        4
    ericgui   68 天前
    @R18 哦,找到了一个,谢谢
        5
    gouchaoer   68 天前
    https://www.v2ex.com/t/325540#reply26

    我就是用的这个库,它底层包装的 proc_open 函数,pcntl 是 fork 机制不太适合 lz 的情况
        6
    ericgui   68 天前
    @gouchaoer 我给你的知乎文章留言了,我就是按照你的博客,挨个研究你在博客上推荐的几个库,现在研究到这个 symfony/process,看了好几天了,没看到 doc 里写多进程的内容,所以才来 v 站提问,没想到偶遇高人,不甚荣幸!
        7
    ericgui   68 天前
    @gouchaoer 不过我用 Facebook/Webdriver 里的示例代码没运行成功,后来用的是 chromedriver,但效率太低。能加个 QQ 么?
        8
    vex2   68 天前
    symfony/process 也是 pcntl_fork 实现的
        9
    gouchaoer   68 天前 via Android
    @ericgui 你给我打钱就行

    @vex2 给你推荐一个 php 扩展: https://github.com/jilieryuyi/wing-process
    彻底兼容 win/Linux
        10
    t6attack   68 天前
    悲催的说,当初研究这个时,那些扩展一个也没搞明白。
    最后自己造了土轮子。用 popen 执行代码,当作子进程。用读写文件的方式交流运行情况、并施加控制。
        11
    ericgui   68 天前
    @gouchaoer 没问题。真心求教!我给你的博客 下面 的 email 写个邮件 ,然后加个 QQ ?
        12
    gouchaoer   68 天前
    @ericgui 有问题不知道在 github 在社区问为啥一定要 QQ,这很不合适的
        13
    gouchaoer   68 天前
    ```
    $process = new \Symfony\Component\Process\Process ( "php test.php" );
    $process->disableOutput ();
    $process->start ();
    ```
    这就完了嘛,你只是启动一个进程而已
        14
    Fishdrowned   68 天前 via Android
    我用 swoole process 管理进程,要安装 swoole 扩展,如果自己有主机不是问题
        15
    iyaozhen   68 天前
    @Fishdrowned +1 这个更好用
        16
    ericgui   67 天前
    @gouchaoer 我在队列里有一万多个 URL,都是等待要爬取的,我想同时启动多个 worker 爬取,而不是一个个从队列里取出 url 来爬,所以想用多进程。不知道怎么处理,所以想请教。
        17
    gouchaoer   67 天前
    @ericgui 把 url 放进 redis 的 list 中,启动多个 worker 去 list 取就完了,别去用进程间通信因为太难了,进程间交流通过 redis 最简单
        18
    fuxkcsdn   67 天前 via iPhone
    用 pcntl_fork 加 daemon 就可以了
    master 获取任务,通过 ipc 分发任务给 child (可控)
    或者各个 child 各自负责获取任务也行
        19
    ericgui   67 天前
    @gouchaoer 想加您 QQ 请教的目的,就是想问一下怎么启动多个 worker,完全没概念。即便您比较忙,不能多聊,给几个关键词我去查查也可以的。所以。。。
    DigitalOcean
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   1022 人在线   最高记录 3541   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.0 · 51ms · UTC 16:59 · PVG 00:59 · LAX 08:59 · JFK 11:59
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1