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

PHP 共享記憶體 (shmop) 完整操作指南與 SimpleSHM 封裝實戰

     編輯:PHP 綜合知識

什麼是共享記憶體?

共享記憶體 (Shared Memory) 允許多個行程存取同一塊實體記憶體區域,是進程間通訊 (IPC) 中速度最快的方式之一,因為資料交換不經由核心,避免 I/O 瓶頸。PHP 透過 shmop 擴充功能提供底層操作介面。

核心函數速查表

函數用途
shmop_open()建立或開啟共享記憶體區段,回傳存取 ID
shmop_write()向區段寫入資料
shmop_read()從區段讀取資料
shmop_size()取得區段大小 (位元組)
shmop_delete()標記區段刪除 (實際釋放需所有行程關閉)
shmop_close()關閉行程對區段的連結

基本 CRUD 操作範例

<?php
$sysId = 864;          // 系統 ID (整數,跨行程共用)
$mode = 'c';           // c: 建立或開啟並讀寫
$perm = 0755;          // 權限 (八進位)
$size = 1024;          // 位元組大小

// 1. 開啟/建立
$shmid = shmop_open($sysId, $mode, $perm, $size);
if ($shmid === false) die("建立失敗");

// 2. 寫入
$len = shmop_write($shmid, "Hello World!", 0);
echo "寫入 $len 位元組\n";

// 3. 讀取 (需知道長度)
$data = shmop_read($shmid, 0, shmop_size($shmid));
echo "讀取: $data\n";

// 4. 刪除與關閉
shmop_delete($shmid);  // 標記刪除
shmop_close($shmid);   // 釋放連結
?>

模式參數說明

  • a:唯讀開啟既有區段
  • w:讀寫開啟既有區段
  • c:建立新區段,或開啟既有區段並讀寫 (最常用)
  • n:建立新區段,若已存在則失敗

物件導向封裝:SimpleSHM

為了簡化操作,可建立一個輕量封裝類別:

<?php
class SimpleSHM {
    private $shmid;
    private $sysId;

    public function __construct(int $sysId = null) {
        $this->sysId = $sysId ?? random_int(1000, 9999);
        $this->shmid = shmop_open($this->sysId, 'c', 0755, 10240); // 10KB
        if ($this->shmid === false) throw new RuntimeException("SHM 開啟失敗");
    }

    public function write(string $data): int {
        return shmop_write($this->shmid, $data, 0);
    }

    public function read(): string {
        return shmop_read($this->shmid, 0, shmop_size($this->shmid));
    }

    public function delete(): void {
        shmop_delete($this->shmid);
    }

    public function __destruct() {
        if ($this->shmid) shmop_close($this->shmid);
    }
}

// 使用範例
$mem = new SimpleSHM(897);
$mem->write(json_encode(['user' => 'John', 'roles' => ['admin', 'editor']]));
$stored = json_decode($mem->read(), true);
print_r($stored);

實際應用場景

  • 快取儲存:資料庫查詢結果、API 回應、模板編譯結果
  • Session 共享:多伺服器環境下無需外部 Redis/Memcached
  • 行程間資料交換:CLI 背景作業與 Web 行程傳遞大量資料
  • 計數器/鎖:高併發下的原子操作 (需搭配信號量)

效能優化建議

  1. 序列化選擇:igbinary > msgpack > json_encode > serialize (速度與體積權衡)
  2. 記憶體大小預估:預留 20% 餘裕,避免寫入失敗需重建區段
  3. 清理機制:定期掃描殘留區段 (系統重啟會自動清除)

限制與替代方案

  • 僅限單機多行程,跨機器需用 Redis、Memcached、NAS
  • 資料結構單純 (字串),複雜查詢不適合
  • 大量資料建議改用 SQLite (WAL 模式) 或 Redis

共享記憶體是 PHP 開發者工具箱中被低估的利器,善用它能在適當場景大幅降低延遲、減輕資料庫壓力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved