pthreads 是 PHP 唯一原生多線程擴展,僅支援 CLI 模式(PHP 7.2+ 僅支援 PHP 7.0-7.4,PHP 8.x 已移除,建議改用 parallel 擴展或 Swoole/Workerman 協程)。本文記錄 Windows 下 PHP 5.4/5.6/7.x 安裝 pthreads 的完整步驟、版本匹配規則、驗證代碼與常見坑點。
| 維度 | 獲取方式 | 示例值 |
|---|---|---|
| PHP 版本 | php -v | 7.4.33 |
| 線程安全 | php -i | findstr "Thread Safety" → enabled=TS, disabled=NTS | TS |
| 架構 | php -i | findstr "Architecture" → x86/x64 | x64 |
| VC 編譯器 | php -i | findstr "Compiler" → VC14/VS2015 等 | VC15 (VS2017) |
下載地址:PECL pthreads 發布頁,選擇對應目錄,如 pthreads-3.2.1/ 下載 php_pthreads-3.2.1-7.4-ts-vc15-x64.zip。
php_pthreads.dll、pthreadVC2.dll(或 pthreadVC3.dll)。php_pthreads.dll → php/ext/。pthreadVC2.dll → php/ 目錄(與 php.exe 同級)並 → C:\Windows\System32\(或 SysWOW64 視架構)。php.ini):添加 extension=pthreads(無需 .dll 後綴)。pthreadVC2.dll 所在目錄(如 C:\php\)加入系統 PATH。php -m | findstr pthreads 顯示 pthreads 即成功。<?php
// test_threads.php
class AsyncTask extends Thread {
public $data;
public function __construct($arg) { $this->data = $arg; }
public function run() {
$start = microtime(true);
// 模擬耗時任務
usleep(mt_rand(100000, 500000));
$this->result = "Task {$this->data} done in " . round((microtime(true)-$start)*1000, 2) . " ms";
}
}
$threads = [];
for ($i = 1; $i <= 5; $i++) {
$threads[$i] = new AsyncTask("Job-$i");
$threads[$i]->start();
}
foreach ($threads as $t) {
$t->join(); // 等待結束
echo $t->result . "\n";
}
echo "All done.\n";
執行: php test_threads.php
輸出示例:
Task Job-1 done in 123.45 ms
Task Job-2 done in 234.56 ms
Task Job-3 done in 345.67 ms
Task Job-4 done in 111.22 ms
Task Job-5 done in 456.78 ms
All done.
| 類/方法 | 用途 |
|---|---|
Thread | 基礎線程類,繼承並實現 run() |
Worker | 線程池,可堆疊 Stackable 任務 |
Stackable | 可被 Worker 執行的任務單元 |
Pool | 高級線程池(pthreads v3+),Pool::submit() |
Volatile | 線程間共享數據容器(v3+),替代舊 Stackable 數組 |
synchronized($obj, fn) | 互斥鎖,保護臨界區 |
$thread->start() | 啟動線程 |
$thread->join() | 阻塞等待線程結束 |
$thread->isRunning() | 判斷是否運行中 |
| 錯誤現象 | 原因 | 解決 |
|---|---|---|
PHP Startup: Unable to load dynamic library 'pthreads' | 版本/TS/NTS/VC/架構不匹配 | 嚴格按上表四要素下載對應包 |
The program can't start because pthreadVC2.dll is missing | 運行時庫未放入 PATH 目錄 | 放入 php/、System32/ 並加入 PATH |
Fatal error: Class 'Thread' not found | 擴展未載入或在 FPM/Apache 模式下運行 | 僅 CLI 模式可用;php -m 確認 |
| 線程間數據不同步/丟失 | 未使用 Volatile 或 synchronized | 共享數據必須用 Volatile 容器 + 鎖 |
| 內存洩漏/崩潰 | 線程未 join() 就退出主進程 | 主進程結束前 foreach($threads as $t) $t->join(); |
parallel 擴展(更輕量、API 現代、支援 PHP 8.1+)。parallel 或 FFI 調用 C/Rust/Go 庫。<?php
// PHP 8.1+ 安裝: pecl install parallel
use parallel\{Runtime, Future};
$runtimes = [new Runtime(), new Runtime(), new Runtime()];
$futures = [];
foreach ($runtimes as $i => $rt) {
$futures[] = $rt->run(function($id) {
usleep(mt_rand(100000, 500000));
return "Parallel Job-$id done";
}, [$i+1]);
}
foreach ($futures as $f) {
echo $f->value() . "\n"; // 阻塞獲取結果
}
掌握 Windows 下 pthreads 安裝調試,能為老項目維護提供支持;新架構請果斷擁抱 parallel、Swoole 協程等現代併發方案。