記憶體共用
左手進!右手怎麼出?
自從學了socket function 之後,在應用上我就一直在思考,從socket 取得的資料怎麼給不同的程式輸出?
之前都是透過資料庫轉換。是可以達到目的,可是我想做的是非常即時的呈現,資料庫有Disk IO,本身就有相當程度的物理極限,想要達到更快的輸出我需要使用其他的方式。
前兩天找資料得知php 可以使用COM ,在找COM 相關應用時,看到Windows 程式都可以使用“記憶體共用”這種技巧,忽然想到,不知道在哪裡我也看到php 好像也有這樣子的function 。
找到試了一下,沒錯!這就是我要的^^
1.Shared Memory Functions (shmop)
for windows,FreeBSD
將資料寫入記憶體
複製內容到剪貼板
代碼:
<?php
// Create 100byte shared memory block with system id of 0xff3
$shm_id =shmop_open(0xff3,"c",0644,100);
$shm_bytes_written =shmop_write($shm_id,"my shared memory block",0);// 回傳字串長度
?>
從記憶體取出
<?php
$shm_id =shmop_open(0xff3,"c",0644,100);
$shm_size =shmop_size($shm_id);
$my_string =shmop_read($shm_id,0,$shm_size);
echo $my_string ."n";
shmop_delete($shm_id);
shmop_close($shm_id);
?>
2.Semaphore,Shared Memory and IPC Functions
-使用之前-
目前看來此類的function 只支援UNIX-like OS ,使用前請確認extensions 有System V 相關功能的選取、安裝。
在FreeBSD 上我是選擇SYSVMSG,SYSVSEM,SYSVSHM 三個extensions
範例
以下程式碼為
www.php.net轉載,在test.php 儲存在記憶體的變數,可以透過test2.php 的程式取出使用。
請注意,期間並無使用cookie or session 類似的方式,卻可以傳遞變數。
1.test.php
複製內容到剪貼板
代碼:
<?PHP
// test.php
$SHM_KEY =ftok(__FILE__,'A');
$shmid =sem_get($SHM_KEY,1024,0644|IPC_CREAT);
$shmid2=sem_get($SHM_KEY,1024,0644|IPC_CREAT);
$shmid3=sem_get($SHM_KEY,1024,0644|IPC_CREAT);
$data = shm_attach($shmid,1024);
$data2=shm_attach($shmid2,1024);
$data3=shm_attach($shmid3,1024);
$test =array("hello","world","1","2","3");
$test2=array("hello","world","4","5","6");
$test3=array("hello","world","7","8","9");
shm_put_var($data,$inmem,$test);
shm_put_var($data2,$inmem2,$test2);
shm_put_var($data3,$inmem3,$test3);
?>
2.test2.php
複製內容到剪貼板
代碼:
<?PHP
// test2.php
$SHM_KEY =ftok(__FILE__,'A');
$shmid =sem_get($SHM_KEY,1024,0644|IPC_CREAT);
$shmid2=sem_get($SHM_KEY,1024,0644|IPC_CREAT);
$shmid3=sem_get($SHM_KEY,1024,0644|IPC_CREAT);
$data = shm_attach($shmid,1024);
$data2=shm_attach($shmid2,1024);
$data3=shm_attach($shmid3,1024);
print_r(shm_get_var($data,$inmem));
print_r(shm_get_var($data2,$inmem2));
print_r(shm_get_var($data3,$inmem3));
shm_detach($data);
shm_detach($data2);
shm_detach($data3);
?>
函式說明
shm_remove():移除記憶體中的變數,在此就是$data ,要注意的是請勿在shm_detach()後使用