qiao 32283 0.0 0.5 49668 6152 pts/1 S 14:03 0:00 /usr/local/php4/b
qiao 32284 0.0 0.5 49668 6152 pts/1 S 14:03 0:00 /usr/local/php4/b
qiao 32286 0.0 0.0 1620 600 pts/1 S 14:03 0:00 grep php
[qiao@oicq qiao]$ 0 -> 1133503401
1 -> 1133503402 *
2 -> 1133503403 **
3 -> 1133503404 ***
4 -> 1133503405 ****
5 -> 1133503406 *****
6 -> 1133503407 ******
7 -> 1133503408 *******
8 -> 1133503409 ********
9 -> 1133503410 *********
[qiao@oicq qiao]$
如果$bWaitFlag=TURE,则结果如下:
[qiao@oicq qiao]$ php test.php
Start
0 -> 1133503602
wait 0 -> 1133503602
1 -> 1133503603 *
wait 1 -> 1133503603
2 -> 1133503604 **
wait 2 -> 1133503604
3 -> 1133503605 ***
wait 3 -> 1133503605
4 -> 1133503606 ****
wait 4 -> 1133503606
5 -> 1133503607 *****
wait 5 -> 1133503607
6 -> 1133503608 ******
wait 6 -> 1133503608
7 -> 1133503609 *******
wait 7 -> 1133503609
8 -> 1133503610 ********
wait 8 -> 1133503610
9 -> 1133503611 *********
wait 9 -> 1133503611
End
[qiao@oicq qiao]$
从多进程的例子可以看出,使用pcntl_fork()之后,将生成一个子进程,而且子进程运行的代码,从pcntl_fork()之后的代码开始,而子进程不继承父进程的数据信息(实际上是把父进程的数据做了一个全新的拷贝),因而使用if(!$pids[$i]) 来控制子进程实际运行的代码段。
更详细的研究出于时间关系,暂时没有进行,你可以参考我给出的手册的链接。
[ 本帖最后由 HonestQiao 于 2005-12-2 22:02 编辑 ]
hitty 回复于:2005-12-02 15:41:20
好像在 phpx 上看到过
例二是不是可以用来暴力破解
[ 本帖最后由 hitty 于 2005-12-2 15:46 编辑 ]
xuzuning 回复于:2005-12-02 15:59:15
看不出有什么实际意义
如果当前程序不需要“进程”的结果,那么要打开那个“进程”干什么?
如果当前程序需要使用“进程”的结果,那么你终归是要等待“进程”的结束,那么多不多又有什么区别呢?
HonestQiao 回复于:2005-12-02 16:32:58
引用:原帖由 xuzuning 于 2005-12-2 15:59 发表
看不出有什么实际意义
如果当前程序不需要“进程”的结果,那么要打开那个“进程”干什么?
如果当前程序需要使用“进程”的结果,那么你终归是要等待“进程”的结束,那么多不多又有什么区别呢?
做类似页面抓取的工作可能需要,不然一次一个页面抓取浪费带宽。
再如做本地的文件转换,例如有一批文件需要转换。
其实进程之间可以使用很多方法通信。
当然可以手动启动很多进程,但是毕竟它提供了这个功能,你可以看pcntl的手册,它可以对子进程进行控制,例如他结束你可以知道,他超时你可以处理。
xuzuning 回复于:2005-12-02 16:47:05
没有看清楚!
编译php的时候,需要加上--enable-pcntl,且推荐仅仅在CLI模式运行,不要在WEB服务器环境运行。
呵呵!
用c或shell要好多了吧?
HonestQiao 回复于:2005-12-02 16:49:44
引用:原帖由 xuzuning 于 2005-12-2 16:47 发表
没有看清楚!
编译php的时候,需要加上--enable-pcntl,且推荐仅仅在CLI模式运行,不要在WEB服务器环境运行。
呵呵!
用c或shell要好多了吧?
用c当然无可厚非,不过门槛比php高多了。
但是用shell可能不是很多人可以接受。
wobushiwo 回复于:2005-12-02 17:05:50
我也是借助外力,是OS本身的多进程
不觉得这样控制有什么优势,甚至会加大复杂程度
hightman 回复于:2005-12-02 18:29:33
引用:原帖由 HonestQiao 于 2005-12-2 15:32 发表
从多进程的例子可以看出,使用pcntl_fork()之后,将生成一个子进程,而且子进程运行的代码,从pcntl_fork()之后的代码开始,而子进程不继承父进程的数据信息,因而使用if(!$pids[$i]) 来控制子进程实际运行的代码段。
这里表述不当, 子进程继承了父进程的很多数据信息.
而 $pids[$i] 是 pcntl_fork() 的返回值, 进程创建后子进程返回 0 父进程返回子进程. 所以用 fork() 的返回值区别子进程或者父进程.
由于进程/线程都是系统的调度单位, 参与系统资源竞争, 所以适当情况下多进程/线程是十分必要的, 而不是像某些回贴说的增加复杂度.
有些情况不是借助外力可以创建进程就行的, 可能需要从父进程中读取一些信息呢.
Haohappy 回复于:2005-12-02 19:38:09
多线程还是很好用的,我做过的项目中就有用到,也是用于搜索,抓取WEB页面。
如果是在Unix下,没有必要采用
$fp = fsockopen('localhost', 80, $errno, $errmsg);
fputs($fp, "GET /a.php?act=brnrn");
直接用exec("php a.php args")这样更方便。
wobushiwo 回复于:2005-12-02 20:32:12
我的方法大概像 Haohappy
php本身处理多线程/进程就不好,我认为没必要搞一个 伪 多线程与多进程,增加编写php编写的难度
有必要吗?假如本身就是假的,是为了一种实现方式,那另一种办法也能实现,而且又不用增加任何代码等
为啥要像LZ那样去写?
请注意哦:是LZ的实现方式我觉得没必要,不是说多线程/进程不好,偶写的程序中多线程帮了很大忙
hightman 回复于:2005-12-02 20:35:26
可是 exec() 可以说是阻塞式的吧, 也就是说 exec() 要等它执行完才能执行后面的代码
这样就不符合要求了
wobushiwo 回复于:2005-12-02 20:37:38
php fork出来的子进程有那么特殊吗?
一般来说子会继承父的信息的
LZ的说明不继承,我估计是建立在他的上下文中,也就是局限在那代码的那个判断中的意思吧?
wobushiwo 回复于:2005-12-02 20:38:21
不好意思,是 + &
wobushiwo 回复于:2005-12-02 20:39:56
假如不局限在一种语言或环境中,我常是多语言混编
假如可以的话,我依靠OS,或者加上其他语言,而不会像LZ只用PHP去实现
MAYBE 我的 PHP太烂了
HonestQiao 回


