以下是如何使用一个共享内存块存储多个变量或数组的示例。 不幸的是,为了存储多个变量,您必须多次使用 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 没有向共享内存中插入任何内容,但它却能提取出已经存储好的三个完全不同的数组。
希望这能有所帮助。我花了点时间才弄清楚。每个人似乎都有自己对 shm 使用方式的想法。哈哈。
顺便说一句,我不确定 ftok 是如何工作的,因为我没有更改 __FILE__ 以匹配 test.php 的文件路径或任何其他内容。我认为文件路径必须完全相同才能正常工作。好吧,它按原样工作了!哈哈。
- Cecil