如何选择共享内存id(shmop / SimpleSHM)

时间:2017-01-11 18:35:36

标签: php shared-memory

我想在PHP中使用共享内存,比如描述here (SimpleSHM)。但我想知道如何正确选择$systemid。我必须"硬编码"我的PHP代码中的数字(示例中为864, 897),因此不同的进程可以进行交互。

但是如何确保在其他地方(其他应用程序,冲突)不使用相同的ID?如果我在运行时动态生成id,我会遇到鸡/蛋问题(如何使用共享内存在我的PHP段中共享id)。

好的,我可以在一个地方生成内存,将id写入文件,并使用共享内存在其他地方读取它。但这是最好的方式吗?

代码示例:

<?php
$systemid = 864; // System ID for the shared memory segment
$mode = "c"; // Access mode
$permissions = 0755; // Permissions for the shared memory segment
$size = 1024; // Size, in bytes, of the segment
$shmid = shmop_open($systemid, $mode, $permissions, $size);
?>

<?php
$new = new SimpleSHM(897);
$new->write('Sample');
echo $new->read();
?>

2 个答案:

答案 0 :(得分:1)

为SHM段生成唯一键的规范方法是使用ftok()函数:

$key = ftok(__FILE__, "0");

这将生成一个值(可能是*),该值对于调用所在的文件是唯一的。如果在同一文件中需要另一个键,请为第二个参数使用不同的字符。 (它必须是单个字符。)

*:实际上有一些罕见的情况,ftok()将为多个文件返回相同的值。这是不可避免的,因为密钥的最大值小于文件系统上可存在的最大文件数。如果这成为一个问题,您可能需要使用其他一些共享数据的方法。

答案 1 :(得分:0)

如果想要让多个不同的PHP脚本/库/类共享内存用于不同的目的,需要许多不同的$ systemid值,我强烈建议为每个创建一个常量来给它起一个名字。在文件中自己定义这些常量,然后在任何打算使用共享内存的PHP脚本中包含/ require该文件。

E.g:

<?php
define("MY_SHARED_MEMORY_PURPOSE_X", 864);
define("MY_SHARED_MEMORY_PURPOSE_Y", 897);

如果您想避免使用include / require语句并使用自动加载器,可以将这些常量附加到类中:

class My_Shared_Memory_Constants {
    class PURPOSE_X = 864;
    class PURPOSE_Y = 897;
}

那么你可以像这样引用它们:

$new = new SimpleSHm(My_Shared_Memory_Constants::PURPOSE_X);

如果您担心与您无法控制的其他库或软件发生冲突,则可以在创建共享内存段时使用 n 标志。如果同一段已经存在,则应该失败。如果您担心这一点,则应该维护能够在关联数组(或可以在进程之间共享的db表)中成功打开的systemids,以便您的代码可以按名称引用它们。