在 PHP 中,實現線程池的最佳方法是使用 pthreads 擴展。但是,pthreads 擴展僅支持 CLI(命令行接口)模式,不適用于 Web 環境。因此,如果你需要在 Web 環境中實現線程池,可以考慮使用第三方庫,如 parallel 或 amphp/amp。
以下是使用 pthreads 擴展實現線程池的示例:
sudo apt-get install php-pthreads
ThreadPool.php
的文件,并添加以下代碼:<?php
class ThreadPool {
private $threadCount;
private $jobs = [];
private $threads = [];
private $running = true;
public function __construct($threadCount) {
if (!extension_loaded('pthreads')) {
throw new Exception('pthreads extension not loaded.');
}
$this->threadCount = $threadCount;
}
public function addJob(callable $job) {
$this->jobs[] = $job;
}
public function start() {
for ($i = 0; $i < $this->threadCount; $i++) {
$thread = new Thread(new Job($this->jobs));
$thread->start();
$this->threads[] = $thread;
}
}
public function join() {
foreach ($this->threads as $thread) {
$thread->join();
}
}
}
class Job extends Thread {
private $jobs;
public function __construct(array $jobs) {
$this->jobs = $jobs;
}
public function run() {
foreach ($this->jobs as $job) {
$job();
}
}
}
// 示例任務
function task() {
echo "Task executed by thread " . Thread::currentThread()->getId() . PHP_EOL;
}
// 創建線程池并添加任務
$threadPool = new ThreadPool(3);
for ($i = 0; $i < 10; $i++) {
$threadPool->addJob(function() use ($i) {
task();
});
}
// 啟動線程池并等待任務完成
$threadPool->start();
$threadPool->join();
?>
在這個示例中,我們創建了一個名為 ThreadPool
的類,它接受一個參數 $threadCount
,表示線程池中的線程數量。我們還創建了一個名為 Job
的類,它實現了 Thread
類,并在其 run
方法中執行任務。
要使用這個線程池,只需創建一個 ThreadPool
實例,添加任務,然后啟動線程池并等待任務完成。在這個示例中,我們添加了 10 個任務和 3 個線程,因此每個線程將執行 3 個任務。