技术资料首页 >> 程序员专区 >> PHP专栏 >> PHP中的多线程与多进程

PHP中的多线程与多进程 (2)

2006-07-03 04:16:59作者: 来源:http://www.chinaunix.net/jh/27/661015.html 浏览次数:13 文字大小:【】【】【
;  32282  0.0  0.5 49668 6152 pts/1    S    14:03   0:00 /usr/local/php4/b
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
[1] [2] [3] [4]

相关文章