首頁 >後端開發 >php教程 >如何在 PHP 中實作多執行緒?

如何在 PHP 中實作多執行緒?

Linda Hamilton
Linda Hamilton原創
2024-12-25 06:24:12558瀏覽

How Can I Implement Multithreading in PHP?

PHP 中如何使用多執行緒

引言

在 PHP 中實作多執行緒模型是否可行,無論是真正實作還是僅僅模擬它。先前,曾有人建議強製作業系統載入 PHP 可執行檔的另一個實例,並處理其他同時進行的進程。

這樣做的問題在於,當 PHP 程式碼執行完成後,PHP 實例仍駐留在記憶體中,因為無法從 PHP 中終止。因此,如果你模擬多個線程,你可以想像將會發生什麼。所以我仍然在尋找一種方法,可以在 PHP 中有效地執行或模擬多執行緒。有什麼想法嗎?

PHP 中多執行緒是可能實現的

是的,你可以在 PHP 中使用 pthreads 進行多執行緒。

根據 PHP 文件:

pthreads 是一個物件導向的 API,提供了在 PHP 中多執行緒所需的所有工具。 PHP 應用程式可以建立、讀取、寫入、執行和同步執行緒、工作執行緒和執行緒化物件。

警告:
pthreads 擴充功能無法在 Web 伺服器環境中使用。因此,PHP 中的多執行緒應該僅限於基於 CLI 的應用程式。

簡單測試

#!/usr/bin/php
<?php
class AsyncOperation extends Thread {

    public function __construct($arg) {
        $this->arg = $arg;
    }

    public function run() {
        if ($this->arg) {
            $sleep = mt_rand(1, 10);
            printf('%s: %s  -start -sleeps %d' . "\n", date("g:i:sa"), $this->arg, $sleep);
            sleep($sleep);
            printf('%s: %s  -finish' . "\n", date("g:i:sa"), $this->arg);
        }
    }
}

// 创建一个数组
$stack = array();

// 启动多线程
foreach ( range("A", "D") as $i ) {
    $stack[] = new AsyncOperation($i);
}

// 启动所有线程
foreach ( $stack as $t ) {
    $t->start();
}

?>

實際案例

error_reporting(E_ALL);
class AsyncWebRequest extends Thread {
    public $url;
    public $data;

    public function __construct($url) {
        $this->url = $url;
    }

    public function run() {
        if (($url = $this->url)) {
            /*
             * 如果请求大量数据,你可能想要使用 fsockopen 和 read,并在读取之间使用 usleep
             */
            $this->data = file_get_contents($url);
        } else
            printf("Thread #%lu was not provided a URL\n", $this->getThreadId());
    }
}

$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);
}

以上是如何在 PHP 中實作多執行緒?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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