《一》php多进程编程:第一次fork
《一》php多進(jìn)程編程:第一次fork請?zhí)砑渔溄用枋?br />《二》守護(hù)進(jìn)程介紹請?zhí)砑渔溄用枋?br />《三》用PHP編寫守護(hù)進(jìn)程請?zhí)砑渔溄用枋?/p>
?
?
工作原因,要用到php多進(jìn)程,于是粗略的了解一下,完成之后把過程記錄下來,整理成教程,希望對學(xué)習(xí)php多進(jìn)程編程的程序員有所幫助。
?
?
前言
使用php cli的時(shí)候,我們在終端會這樣
php hello.php?
?
運(yùn)行一個(gè)hello.php程序,這樣linux會為我們創(chuàng)建一個(gè)進(jìn)程。不考慮 nohup ,在一個(gè)終端,我們以cli方式運(yùn)行的php程序也只能有這一個(gè)進(jìn)程。一個(gè)進(jìn)程處理的任務(wù)必定是有限的,在系統(tǒng)資源空閑那么多的情況下,為什么不使用多進(jìn)程來提高效率呢?
不過php多進(jìn)程需要安裝pcntl和posix擴(kuò)展(windows不支持)
?
?
fork,創(chuàng)建子進(jìn)程
?
?
創(chuàng)建子進(jìn)程的方法就是fork,在php里面,這個(gè)函數(shù)是pcntl_fork()
?
pcntl_fork作用就是創(chuàng)建和當(dāng)前進(jìn)程一樣的子進(jìn)程,這個(gè)子進(jìn)程代碼段和當(dāng)前進(jìn)程一模一樣,但是擁有自己的數(shù)據(jù)段。看一個(gè)最簡單的創(chuàng)建子進(jìn)程的方法
?
?
<?php$pid = pcntl_fork(); if( $pid == -1 ){exit("fork error"); } if( $pid == 0 ){//子進(jìn)程執(zhí)行pcntl_fork的時(shí)候,pid總是0,并且不會再fork出新的進(jìn)程echo "child process{$pid}\n"; }else{//父進(jìn)程fork之后,返回的就是子進(jìn)程的pid號,pid不為0echo "parent process{$pid}\n"; }?
可以這樣解釋:pcntl_fork之后,系統(tǒng)會再次啟動一個(gè)進(jìn)程,重新運(yùn)行當(dāng)前的代碼,就醬~
?
運(yùn)行結(jié)果如下
可以看到,父進(jìn)程經(jīng)過pcntl_fork之后,反回了一個(gè)pid為3558,下面ps的進(jìn)程號有一個(gè)3558,那就是經(jīng)過fork之后的子進(jìn)程啦
來看一下進(jìn)程(之前我在hello.php里面sleep了幾十秒,所以程序未退出)
?
?
這樣,一個(gè)簡單地多進(jìn)程就出來了。如果要執(zhí)行任務(wù),那么就可以直接把任務(wù)的代碼放到條件里面去就可以啦
?
?
?
?
參考文獻(xiàn):
http://imhuchao.com/596.html
轉(zhuǎn)載于:https://blog.51cto.com/laok8/2107868
總結(jié)
以上是生活随笔為你收集整理的《一》php多进程编程:第一次fork的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 西安电话面试:谈谈Vue数据双向绑定原理
- 下一篇: php实现 简单密码(代码颜色变化)