首頁  >  文章  >  後端開發  >  PHP 中的並行與並行

PHP 中的並行與並行

WBOY
WBOY原創
2024-07-17 08:08:58419瀏覽

Concurrency and Parallelism in PHP

並行和並行是現代程式設計中的基本概念,允許應用程式透過交錯執行(並發)或同時執行(並行)同時執行多個任務。 PHP 主要以其同步執行模型而聞名,現已發展為透過各種技術支援這些範例。

PHP 的標準執行模型

PHP 傳統上遵循同步執行模型,尤其是在典型的 Web 伺服器設定中與 Apache 一起使用時。在此模型中,每個 HTTP 請求都由單一 PHP 進程處理。處理請求涉及的步驟包括:

  1. Apache 接收 HTTP 請求並將其轉送給 PHP。
  2. PHP 在單一執行緒中從頭到尾執行腳本
  3. PHP 將輸出 傳回 Apache,然後 Apache 將回應傳回客戶端。

此模型確保簡單性和易於理解,但對於需要並行執行或同時處理多個任務的任務來說可能會變得低效。

PHP 中並發性和平行性的演變

隨著 Web 應用程式變得越來越複雜,PHP 中並發和並行執行的需求也在增長。讓我們來探索 PHP 提供的實作這些範例的技術。

1. 同步程式碼

同步程式碼是最簡單的執行形式,其中任務一個接一個地執行。

echo "Synchronous Code Example:\n";
function synchronousFunction() {
    for ($i = 0; $i < 3; $i++) {
        echo "Synchronous Loop Iteration: $i\n";
        sleep(1);
    }
}
synchronousFunction();

在此範例中,循環的每次迭代都按順序執行,迭代之間有一秒的延遲。這種方法很簡單,但對於可以從並行執行中受益的 I/O 密集型或 CPU 密集型任務來說效率較低。

2. 分叉進程

分叉建立一個與原始進程(父進程)同時運行的新進程(子進程)。這對於並行化任務很有用。

echo "\nForking Process Example:\n";
function forkProcess() {
    $pid = pcntl_fork();
    if ($pid == -1) {
        die('could not fork');
    } else if ($pid) {
        echo "Parent Process: PID $pid\n";
        pcntl_wait($status); // Protect against Zombie children
    } else {
        echo "Child Process: Hello from the child process!\n";
        exit(0);
    }
}
forkProcess();

在此程式碼中,pcntl_fork() 建立一個子進程。父進程和子進程同時執行,允許並行任務執行。父行程等待子程序完成以避免建立殭屍行程。

3. 執行緒

PHP 的執行緒功能可透過 pthreads 等擴充來使用。執行緒比進程輕,並且共享相同的記憶體空間,因此適合需要共享資料的任務。

if (!class_exists('Thread')) {
    die("Threads are not supported in this PHP build\n");
}

echo "\nThreading Example:\n";
class MyThread extends Thread {
    public function run() {
        for ($i = 0; $i < 3; $i++) {
            echo "Thread Loop Iteration: $i\n";
            sleep(1);
        }
    }
}

$thread = new MyThread();
$thread->start();
$thread->join();

此範例定義了一個擴充 Thread 的 MyThread 類別。 run方法在一個新執行緒中執行,與主執行緒並發運行。這種方法對於 I/O 密集型操作非常有用,其中執行緒可以處理等待資源。

4. 發電機

生成器提供了一種實作簡單協同例程的方法,允許函數迭代地產生結果,而不會阻塞整個程式。

echo "\nGenerators Example:\n";
function simpleGenerator() {
    yield 'First';
    yield 'Second';
    yield 'Third';
}

$gen = simpleGenerator();
foreach ($gen as $value) {
    echo "Generator Yielded: $value\n";
}

產生器使用yield關鍵字一次產生一個值,允許暫停和恢復函數,從而促進一種協作式多工作業。

PHP 從同步根源到支援各種形式的並行性已經取得了很大的進展。雖然同步程式碼對許多用例來說仍然簡單有效,但分叉進程、執行緒和使用生成器等技術為有效處理複雜、可並行的任務開闢了新的可能性。

以上是PHP 中的並行與並行的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn