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

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

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

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

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

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

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