PHP的pcntl進程式控制制之pcntl_fork

來源:互聯網
上載者:User
這篇文章主要介紹了關於PHP的pcntl進程式控制制之pcntl_fork,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

pcntl 簡介

PHP的進程式控制制支援實現了Unix方式的進程建立, 程式執行, 訊號處理以及進程的中斷。 進程式控制制不能被應用在Web伺服器環境,當其被用於Web服務環境時可能會帶來意外的結果。

這份文檔用於闡述每個進程式控制制函數的通常用法。關於Unix進程式控制制的更多資訊建議您查閱 系統文檔中關於fork(2),waitpid(2),signal(2)等的部分或更全面的參考資料比如 《Unix環境進階編程》(作者:W. Richard Stevens,Addison-Wesley出版)。

PCNTL現在使用了ticks作為訊號處理的回調機制,ticks在速度上遠遠超過了之前的處理機制。 這個變化與“使用者ticks”遵循了相同的語義。您可以使用declare() 語句在程式中指定允許發生回調的位置。這使得我們對非同步事件處理的開銷最小化。在編譯PHP時 啟用pcntl將始終承擔這種開銷,不論您的指令碼中是否真正使用了pcntl。

有一個調整是PHP 4.3.0之前的所有pcntl指令碼要使其工作,要麼在期望允許回調的(代碼)部分使用 declare() ,要麼使用declare()新的全域文法 使其在整個指令碼範圍有效。

Note: 此擴充在 Windows 平台上不可用。

官方文檔

pcntl官方文檔

pcntl_fork

# 來源官方PHP 4 >= 4.1.0, PHP 5, PHP 7)pcntl_fork — 在當前進程當前位置產生分支(子進程)。譯註:fork是建立了一個子進程,父進程和子進程 都從fork的位置開始向下繼續執行,不同的是父進程執行過程中,得到的fork傳回值為子進程 號,而子進程得到的是0。說明int pcntl_fork ( void )pcntl_fork()函數建立一個子進程,這個子進程僅PID(進程號) 和PPID(父進程號)與其父進程不同。fork怎樣在您的系統工作的詳細資料請查閱您的系統 的fork(2)手冊。傳回值成功時,在父進程執行線程內返回產生的子進程的PID,在子進程執行線程內返回0。失敗時,在 父進程上下文返回-1,不會建立子進程,並且會引發一個PHP錯誤。

代碼

<?php/** * Created by PhpStorm. * User: Object * Date: 2018/6/11 * Time: 10:12 */const NEWLINE = "\n\n";if (strtolower(php_sapi_name()) != 'cli') {    die("請在cli模式下運行");}echo "當前進程:" . getmypid() . NEWLINE;$pid = pcntl_fork(); //fork出子進程//fork後父進程會走自己的邏輯,子進程從處開始走自己的邏輯,堆棧資訊會完全複製給子進程記憶體空間,父子進程相互獨立if ($pid == -1) { // 建立錯誤,返回-1    die('進程fork失敗');} else if ($pid) { // $pid > 0, 如果fork成功,返回子進程id    // 父進程邏輯    $time = microtime(true);    echo "我是父進程:{$time}".NEWLINE;} else { // $pid = 0    // 子進程邏輯    $time = microtime(true);    echo "我是子進程:{$time}".NEWLINE;}

執行結果

當前進程:17472我是父進程:1528697500.2961我是子進程:1528697500.2961

fork後會子進程先執行還是父進程先執行邏輯呢?

測試代碼

此處我們調換上面代碼的父子進程的if順序
if ($pid == -1) { // 建立錯誤,返回-1    die('進程fork失敗');} else if (!$pid) { // $pid = 0    // 子進程邏輯    $time = microtime(true);    echo "我是子進程:{$time}".NEWLINE;} else if ($pid) { // $pid > 0, 如果fork成功,返回子進程id    // 父進程邏輯    $time = microtime(true);    echo "我是父進程:{$time}".NEWLINE;}

執行結果

當前進程:17472我是父進程:1528697500.2961我是子進程:1528697500.2961

測試總結

fork首先會執行父進程邏輯再執行子進程邏輯

以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.