shmop 是 PHP 操作 System V 共享記憶體的擴充,適合同機多進程高速資料交換(如 CLI 守護進程間通訊)。本文涵蓋安裝、基本 API、效能特徵與現代替代方案。
安裝步驟
# 1. 進入原始碼目錄
cd /usr/src/php-8.2/ext/shmop
# 2. phpize
/usr/bin/phpize
# 3. 配置編譯
./configure --with-php-config=/usr/bin/php-config
# 4. 編譯安裝
make && make install
# 5. 啟用擴充
echo "extension=shmop" >> /etc/php/8.2/cli/php.ini
# 6. 驗證
php -m | grep shmop
核心 API 速查
| 函式 | 用途 |
| shmop_open(key, flags, mode, size) | 建立/開啟段,回傳資源 ID |
| shmop_write(id, data, offset) | 寫入資料,回傳寫入位元組數 |
| shmop_read(id, offset, count) | 讀取資料,回傳字串 |
| shmop_size(id) | 取得段大小 |
| shmop_close(id) | 關閉資源(不刪除段) |
| shmop_delete(id) | 標記刪除(最後一個 close 後實際移除) |
讀寫範例
<?php
$key = ftok(__FILE__, 'a'); // 產生系統鍵值,避免衝突
$shmId = shmop_open($key, 'c', 0644, 1024);
if (!$shmId) die('shmop_open failed');
// 寫入
$data = json_encode(['pid' => getmypid(), 'time' => microtime(true), 'msg' => 'Hello']);
shmop_write($shmId, $data, 0);
// 讀取(需知道實際長度或讀滿再 trim)
$raw = shmop_read($shmId, 0, shmop_size($shmId));
$arr = json_decode(rtrim($raw, "\0"), true);
print_r($arr);
shmop_close($shmId);
// shmop_delete($shmId); // 真正刪除
?>
效能與限制
- 速度極快:記憶體複製,無網路/磁碟 I/O,單機 QPS 輕鬆百萬級。
- 大小固定:建立時指定
size,擴容需重建並遷移資料。
- 無序列化:僅支援二進位字串,複雜結構需自行
serialize/igbinary/msgpack。
- 無原子操作:需自行用
semaphore(sem_acquire/release)或檔案鎖保護並發讀寫。
- 跨機器不可用:僅限同一作業系統核心實例。
現代替代方案對比