Я хочу использовать общую память с PHP, как описать здесь (SimpleSHM). Но мне интересно, как выбрать $systemid
правильно. Я должен «жестко закодировать» номер (864, 897
в примерах) в моем PHP-коде, чтобы разные процессы могли взаимодействовать.
Но как я могу убедиться, что этот идентификатор не используется в другом месте (другое приложение, конфликты)? Если я генерирую идентификатор динамически во время выполнения, у меня возникает проблема курица / яйцо (как разделить идентификатор между моими сегментами PHP, используя общую память).
Хорошо, я могу сгенерировать память в одном месте, записать идентификатор в файл и прочитать его в других местах, также используя общую память. Но так ли это лучше?
Примеры кода:
<?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();
?>
Канонический метод генерации уникального ключа для сегмента SHM заключается в использовании ftok()
функция:
$key = ftok(__FILE__, "0");
Это сгенерирует значение, которое (вероятно, *) уникально для файла, в котором появляется вызов. Если вам нужен другой ключ в том же файле, используйте другой символ для второго аргумента. (Это должен быть один символ.)
*: На самом деле есть редкие ситуации, когда ftok()
вернет одно и то же значение для нескольких файлов. Это неизбежно, так как максимальное значение ключа меньше максимального числа файлов, которые могут существовать в файловой системе. Если это станет проблемой, вам, вероятно, придется использовать какой-то другой метод обмена данными.
Если идея состоит в том, чтобы иметь несколько разных PHP-скриптов / библиотек / классов, которые совместно используют память для разных целей, что требует большого количества различных значений $ systemid, я настоятельно рекомендую создать для каждого из них константу, чтобы дать ей имя. Определите эти константы в файле самостоятельно, а затем включите / потребуйте этот файл в любом сценарии PHP, который намеревается использовать общую память.
Например.:
<?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 флаг при создании сегментов общей памяти. Если он уже существует для того же сегмента, он должен произойти сбой. Если это ваша проблема, вы должны сохранить системные идентификаторы, которые вы можете успешно открыть, в ассоциативном массиве (или в таблице БД, которая может быть разделена между процессами), чтобы ваш код мог ссылаться на них по имени.