在 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中文網其他相關文章!