Что делает расширение shmop PHP? - PullRequest
13 голосов
/ 26 декабря 2011

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

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

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

Ответы [ 2 ]

34 голосов
/ 26 декабря 2011

Общая память позволяет нескольким процессам получать доступ к одним и тем же данным в памяти. Вы можете использовать его для обмена данными между запущенными скриптами 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);

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

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

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

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

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

9 голосов
/ 26 декабря 2011

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

«Обмен данными» может быть выполнен:

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

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

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

...