1. 程式人生 > >php是單程序語言,但是也有辦法支援多程序

php是單程序語言,但是也有辦法支援多程序

    話說第一門比較精通的語言,是go。但用的最久的語言,目前來看是php,別問我的技術生涯規劃是怎樣的,我可能只是想在養活自己的同時憑喜好接觸更多語言。

    那麼今天閒來無事說一下對php的理解,如果用一句話概括:這的確是一門好上手的語言。只要你還稍微有點執行力,稍微懂一點計算機網路,資料庫基礎還有php語法,應該就可以寫出諸多型別的程式了。因為是在大公司任職,又一直使用框架,php是如何與nginx互動的,如何連上資料庫的這些問題統統沒細想,更別說在後臺cli模式下編寫多程序程式或者守護程序了。所以做了好幾個月的php開發時,只是記得php是一門單程序弱型別的語言,卻不怎麼理解。感覺很多初入行的程式設計師都會有很長一段時間內,做簡單重複得工作,卻不知自己該往哪些方向鑽研,還覺得自己什麼都不會。這個時候,就只能是日積月累多堅持了。

    這裡,我先普及一下php實現多程序的方式,因為最近剛好複習到這裡。即便你是連程序和執行緒都分不清的菜鳥,那這篇文章對你也不怎麼有用,因為我講的並不詳細,只是想隨便說個例子來督鼓勵一下大家的學習。咳咳,那麼現在開始,要想寫出一個php多程序的程式,其實就像把大象放在冰箱裡有幾步一樣簡單。php實現多程序簡單來說就三步:建立子程序,管理子程序,處理子程序。說起來簡單,其中涉及到的知識卻是不少,比如說你得知道每個程序都有一個程序號(pid),還得知道命令列是如何執行php檔案之類的。

    第一步的建立子程序,用到的是pcntl_fork()函式,函式返回值通常為0,失敗時返回-1。我先舉一個建立子程序的直觀小栗子(抄襲):

    $ppid = posix_getpid();
    $pid = pcntl_fork();
    if ($pid == -1) {
        throw new Exception('fork子程序失敗!');
    } elseif ($pid > 0) {
        cli_set_process_title("我是父程序,我的程序id是{$ppid}.");
     sleep(30); // 保持30秒,確保能被ps查到 } else { $cpid = posix_getpid(); cli_set_process_title("我是{$ppid}的子程序,我的程序id是{$cpid}."); sleep(30); }

    第二步的管理子程序,使用的是訊號。簡單來說,就是父程序裡使用兩個函式pcntl_signal()和pcntl_signal_dispatch,負責給子程序安裝訊號處理器和分發工作。  這個步驟就先如此簡單介紹一下,因為涉及到一個回撥函式的概念,以後我會補上更全面地內容。

    第三步的處理子程序,也是需要兩個函式。一個是傳送終止訊號的posix_kill()函式,一個是等待子程序狀態的pcntl_waitpid()函式,這樣就可以實現跟子程序共同完成的任務的目的了。

    所以,後端開發就是這樣,很多以為會複雜的東西,其實步驟很清晰,基本都屬於用到的知識多,用到的函式卻不多這樣。所以入門的時候就硬著頭皮學下去好了,要相信自己總有一天可以很清楚明白。