首先,PHP是可以操作多進程的,這個模塊叫做pcntl,一般情況下,會被默認安裝,可以通過php -m來查詢。
PHP也可以操作多線程,需要一個叫做pthread的庫來實現,但是PHP的pthread比較奇怪,變量一直不能共享,似乎失去了多線程的意義。
相對來說,在生產環境更具備價值的是php的多進程。
一般收來是如下幾個函數:
pcntl_fork,這個函數就相當於linux系統下的fork系統調用,用來fork出一個新的進程。
pcntl_wait或者pcntl_waitpid,這個函數是用來防止僵屍進程的。
pcntl_exe相當於linux下的exec,就是在當前進程中直接執行另外一個進程,比如利用php進程直接呼起一個go程序或者nodejs程序
pcntl_signal是給一個進程安裝信號處理器,比如說給當前進程安裝一個“A信號”處理器,那么當當前進程收到A信號后,就會作出相應的反應。比如我們給當前進程安裝一個usr1信號,然后自己就會重啟。
pcntl_signal_dispatch,當給進程通過pcntl_signal安裝了信號處理器后,還需要通過這個函數分發起來,不分發起來是完全沒用的,進程收到信號並不會有什么反應。
pcntl_alarm,給一個進程設置鬧鍾信號,就是每隔x時間就給某進程發送一次SIGALRM信號,該進程收到后作出相應反應。
這些基本上就是常用的php多進程操作的主要函數。
進程和線程是有很大區別的。我們知道,進程是操作系統最小操作單元,進程之於操作系統,就好比線程之於進程。一個進程中可以含有多個線程。但是二者有很大的區別:
1 創建進程代價相對於創建線程是比較大的
2 進程間的切換的代價相對於線程間切換是比較大的
3 多個進程而言,每個進程都擁有自己的存儲空間、堆棧、數據,彼此之間並不能共享;而線程是屬於同一個進程的,說白了是沒有自己隱私空間的,變量、數據、內存都是共享的,如果涉及到多個線程操作同一個變量,那么此時就一定要注意給變量加鎖,這就是傳說中的線程安全問題。而對於多進程而言,就不會有這個問題,因為完全相同的兩個變量名,如果屬於兩個進程,那么兩個進程操作這兩個變量彼此之間不會有任何問題。當然了,這中優勢你可以看作是劣勢,而線程的這個劣勢又隨時可以轉換為優勢