這是一個如何使用一個共享記憶體區塊來儲存多個變數或陣列的範例。不幸的是,為了儲存超過一個的變數,您必須多次使用 sem_get()。對於 shm_attach()、shm_put_var() 和 shm_get_var() 也是如此。
#!/usr/local/bin/php -q
<?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);
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($data2);
?>
要真的測試它,請建立第二個腳本,如下所示並執行它..
#!/usr/local/bin/php -q
<?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($data2);
?>
如您所見,test2.php 沒有將任何內容插入共享記憶體中.. 但它卻提取了 3 個已經儲存的完全不同的陣列..
希望這有幫助.. 我花了一些時間才弄對.. 每個人似乎都有自己對如何使用 shm 的想法。 哈哈。
順便說一下,老實說,我不確定 ftok 如何運作,因為我沒有更改 __FILE__ 以匹配 test.php 的檔案路徑或任何東西.. 我認為檔案路徑必須完全相同才能正常運作.. 沒關係,它按原樣運作了! 哈哈..
- Cecil