回覆列表
  • 1 # 程式設計師小助手

    引言

    別的語言都在一窩蜂地搞編譯,搞虛擬機器,搞多執行緒,提高效率。我們整天敲 PHP 程式碼,除了 Nginx 呼叫 php-fpm 拉取 PHP 檔案的解析外,對於多執行緒有多少了解?

    請問,PHP 能不能使用多執行緒?如果能,怎麼實現的?

    本文就帶你開啟這個疑問。

    學習時間

    這個問題的答案是肯定的,PHP 可以使用多執行緒。我們藉助於 pthreads 實現:

    該專案提供了與基於Posix Threads的PHP相容的多執行緒。

    有啥亮點沒?下面這些全是:

    一個易於使用,快速學習的面向物件的PHP 7.2執行緒API執行所有預定義和使用者宣告的方法和函式,包括閉包。包括現成的同步無限的可能性...

    需要一些擴充套件的基礎的支援,PHP 7.2 及以上版本,ZTS Enabled ( Thread Safety ),Posix Threads Implementation。

    還有一些注意事項:

    pthreads是一個面向物件的API,它提供了PHP中多執行緒所需的所有工具。 PHP應用程式可以建立,讀取,寫入,執行並與執行緒,輔助物件和執行緒物件同步。 警告:pthreads副檔名不能在Web伺服器環境中使用。 因此,PHP中的執行緒應僅保留給基於CLI的應用程式使用。

    命令列應用指令碼完全適用,這也與我們編寫 Bash,Python等等類似。下面舉一個例子:

    然後執行一次:

    再執行一次:

    實際運用

    上面的程式碼是個示例性質的應用,僅僅是為了展示多執行緒執行。下面來一段業務程式碼。

    該類模擬一個url請求。因為網路問題,有可能失敗,或者不確定返回時間,所以適合並行。接著我們使用該類進行多網路請求併發。為了減輕系統負荷,使用微秒延時。

    $t = microtime(true);

    $g = new AsyncWebRequest(sprintf("http://www.google.com/?q=%s", rand() * 10));

    例項化之後,我們發起請求:

    if ($g->start()) {

    printf("Request took %f seconds to start ", microtime(true) - $t);

    while ( $g->isRunning() ) {

    echo "."; usleep(100);

    }

    if ($g->join()) {

    printf(" and %f seconds to finish receiving %d bytes\n", microtime(true) - $t, strlen($g->data));

    } else

    printf(" and %f seconds to finish, request failed\n", microtime(true) - $t);

    }

    其他方案

    如果不用 pthreads 庫提供的能力,該怎麼寫並行的多工呢?其實 PHP 提供了一個 popen 函式,用於開啟程序檔案指標。

    popen 返回一個和 fopen 所返回的相同的檔案指標,只不過它是單向的(只能用於讀或寫)並且必須用 pclose 來關閉。此指標可以用於 fgets,fgetss 和 fwrite。 當模式為 "r",返回的檔案指標等於命令的 STDOUT,當模式為 "w",返回的檔案指標等於命令的 STDIN。

    直接上程式碼:

    for ($i=0; $i<10; $i++) { // 開啟10個程序 for ($j=0; $j<10; $j++) { $pipe[$j] = popen("script2.php", "w"); } // 等待完成 for ($j=0; $j<10; ++$j) { pclose($pipe[$j]); } }

    大家看到了實現的方法與 pthreads 完全不同,這段程式碼仍然是阻塞執行,只不過同時開啟10個程序,並行執行。

    並行與多執行緒完全不同。不過,可視作一個簡單的解決方案吧。

    寫在最後

    經過上述兩種實現方法,大家應該對於多執行緒,多程序,並行這些概念有一些認識了。

    Happy coding :_)

  • 2 # 0祥0子0

    php用途比較單一 就是寫web頁面 一般人不關注多執行緒 java在多執行緒方面比較好 go在協程方面比較厲害 php也有協程 可以試試

  • 中秋節和大豐收的關聯?
  • 直腸息肉手術後大便次數多有時便中帶血?