1
R18 2017-09-13 19:59:51 +08:00 via Android
|
2
orderc 2017-09-13 20:04:06 +08:00
pcntl_fork
|
5
gouchaoer 2017-09-13 20:29:40 +08:00
|
6
ericgui OP @gouchaoer 我给你的知乎文章留言了,我就是按照你的博客,挨个研究你在博客上推荐的几个库,现在研究到这个 symfony/process,看了好几天了,没看到 doc 里写多进程的内容,所以才来 v 站提问,没想到偶遇高人,不甚荣幸!
|
7
ericgui OP @gouchaoer 不过我用 Facebook/Webdriver 里的示例代码没运行成功,后来用的是 chromedriver,但效率太低。能加个 QQ 么?
|
8
vex2 2017-09-13 20:42:44 +08:00
symfony/process 也是 pcntl_fork 实现的
|
9
gouchaoer 2017-09-13 21:55:56 +08:00 via Android
|
10
t6attack 2017-09-13 22:09:54 +08:00
悲催的说,当初研究这个时,那些扩展一个也没搞明白。
最后自己造了土轮子。用 popen 执行代码,当作子进程。用读写文件的方式交流运行情况、并施加控制。 |
13
gouchaoer 2017-09-13 23:48:43 +08:00
```
$process = new \Symfony\Component\Process\Process ( "php test.php" ); $process->disableOutput (); $process->start (); ``` 这就完了嘛,你只是启动一个进程而已 |
14
Fishdrowned 2017-09-13 23:56:25 +08:00 via Android
我用 swoole process 管理进程,要安装 swoole 扩展,如果自己有主机不是问题
|
15
iyaozhen 2017-09-14 00:04:16 +08:00
@Fishdrowned +1 这个更好用
|
16
ericgui OP @gouchaoer 我在队列里有一万多个 URL,都是等待要爬取的,我想同时启动多个 worker 爬取,而不是一个个从队列里取出 url 来爬,所以想用多进程。不知道怎么处理,所以想请教。
|
17
gouchaoer 2017-09-14 12:25:33 +08:00
@ericgui 把 url 放进 redis 的 list 中,启动多个 worker 去 list 取就完了,别去用进程间通信因为太难了,进程间交流通过 redis 最简单
|
18
fuxkcsdn 2017-09-14 13:17:40 +08:00 via iPhone
用 pcntl_fork 加 daemon 就可以了
master 获取任务,通过 ipc 分发任务给 child (可控) 或者各个 child 各自负责获取任务也行 |