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

How to choose shared memory id (shmop/SimpleSHM)

我想与 PHP 一起使用共享内存,如描述 here (SimpleSHM)。但我想知道如何正确选择 $systemid 。我必须 "hardcode" 我的 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();
?>

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

例如:

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

等等

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

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

然后你可以这样引用它们:

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

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

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

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

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

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