Что делает PHP-расширение shmop?

http://www.php.net/manual/en/intro.shmop.php

Shmop – это простой в использовании набор функций, который позволяет PHP читать, записывать, создавать и удалять сегменты разделяемой памяти Unix.

Я не понимаю, какова цель этого расширения? Для чего его используют?

Общая память позволяет нескольким процессам получать доступ к тем же данным в памяти. Вы можете использовать его для обмена данными между запущенными скриптами PHP.

$shm = shmop_open(0xF00, "c", 0644, 4); $count = unpack('L', shmop_read($shm, 0, 4)); $count = reset($count); var_dump($count); echo "count: ", $count++, "<br/>\n"; shmop_write($shm, pack('L', $count), 0); 

Когда компьютер перезагружается, все в общей памяти теряется.

Различные процессы могут одновременно обращаться к одной и той же общей памяти, что может привести к условиям гонки . В приведенном выше примере, если два процесса считывают разделяемую память перед записью обратно, количество будет меньше, чем должно быть. Условия гонки могут быть предотвращены с помощью мьютекса , но это выходит за рамки этого Q & A.

Общая память используется для одного типа взаимодействия между процессами , а именно передачи данных. Некоторые другие, доступные на PHP (в зависимости от платформы и сборки PHP):

  • Сигналы ( posix_kill для отправки сигнала, pcntl_signal для настройки обработчика сигнала), ограниченный тип передачи сообщений. Сигналы не особенно полезны в сценариях, так как каждый скрипт должен работать в течение очень короткого времени.
  • Сокеты для данных. Сокеты могут использовать сеть или могут быть локальными.
  • Трубы для данных. posix_mkfifo используется для создания именованных каналов (aka FIFO ), а стандартные функции файлов используются для чтения и записи данных. Без имени (ака анонимные ) трубы могут быть созданы между родительскими и дочерними процессами, используя popen или proc_open . Обратите внимание, что неназванные каналы не могут быть созданы между произвольными процессами. Обратите внимание, что трубы на некоторых системах однонаправлены: ручка трубы может использоваться как для чтения, так и для записи, но не для обоих.
  • Семафоры для синхронизации .
  • Очереди сообщений для обмена сообщениями . В PHP расширение Semaphore предлагает как очереди сообщений, так и другой набор функций общей памяти (например, shm_attach ). Также доступно множество других расширений для различных протоколов обмена сообщениями, включая SAM , STOMP и AMQP . См. « Другие службы » в руководстве по PHP, ну, другие.
  • Обтекатели сетевого потока для данных. На более низком уровне это только сокеты, хотя они предоставляют другой интерфейс. Они также предназначены для определенных протоколов уровня приложений, тогда как сокеты более общие.
  • Расширения сетевого протокола , такие как cURL , для обмена сообщениями и данными. Подобно обтекателям потоков, они (лимитированные) сокеты скрыты.
  • Расширения веб-служб , такие как SOAP и XML-RPC , для удаленных вызовов процедур (RPC). Обратите внимание, что, хотя они основаны на сокетах, они предназначены для другого типа IPC (RPC, а не для данных).

Хотя сокеты (и что-то на их основе, такие как обтекатели потоков) и каналы могут использоваться для передачи данных между процессами, их возможности с более чем двумя процессами ограничены. Сокеты могут подключаться только к двум процессам; чтобы обрабатывать более двух, необходимо открыть несколько сокетов (в которых обычно входит клиент-серверная архитектура). С трубами только один процесс может читать данные ; как только он появится, эти данные не будут доступны другим читателям, хотя они могут читать другие данные (которые затем станут недоступны для всех, кроме читателя). Произвольное количество процессов может открыть одну и ту же область разделяемой памяти.

Когда работающий процесс запрашивает память, система предоставляет кусочек памяти, доступ к которому может получить только выделенный процесс. Иногда вы запускаете несколько потоков и хотите совместно использовать данные среди них.

«Совместное использование данных» может быть выполнено:

  • Передача данных через сокеты / трубки
  • Общая память (потоки, процессы)

Поскольку в некоторых случаях передача данных не очень удобна, можно использовать общую память .

Эти функции предоставляют функциональные возможности для обработки разделяемых сегментов памяти в PHP.