首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP shmop 共享記憶體操作指南:安裝、讀寫、效能與替代方案

     編輯:PHP 相關知識

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)或檔案鎖保護並發讀寫。
  • 跨機器不可用:僅限同一作業系統核心實例。

現代替代方案對比

除非極特殊場景(如嵌入式、禁用網路、微秒級延遲要求),優先選 Redis 或 APCu。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方案適用場景特點
Redis分散式快取、佇列、鎖、Pub/Sub網路延遲 ~0.5ms、功能豐富、集群支援
APCu單機進程間唯讀/高頻讀資料用戶空間快取、無需 daemon、PHP 內建
SQLite (:memory:)結構化查詢、ACID、小資料集SQL 支援、檔案可持久化
shmop極簡、超高頻、固定結構、單機零依賴、最低延遲、API 原始