Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Общая память позволяет нескольким процессам получать доступ к тем же данным в памяти. Вы можете использовать его для обмена данными между запущенными скриптами 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, чтобы настроить обработчик сигналов), ограниченный тип передачи сообщений. Сигналы не особенно полезны в сценариях страниц, так как каждый script должен работать в течение очень короткого времени.
  • Sockets для данных. Сокеты могут использовать сеть или могут быть локальными.
  • Трубы для данных. posix_mkfifo используется для создания named pipes ( aka FIFOs), а стандартный file функции используются для чтения и записи данных. Без имени (aka anonymous) между родительским и дочерним процессами могут быть созданы трубы, используя popen или proc_open. Обратите внимание, что неназванные каналы не могут быть созданы между произвольными процессами. Обратите внимание, что трубы на некоторых системах однонаправлены: ручка трубопровода может использоваться как для чтения, так и для записи, но не для обоих.
  • Семафоры для synchronization.
  • Очереди сообщений для сообщений. В PHP расширение Semaphore предлагает как очереди сообщений, так и другой набор функций общей памяти (например, shm_attach). Также доступно множество других расширений для различных протоколов обмена сообщениями, включая SAM, STOMP и AMQP. См. "Другие службы "в руководстве для PHP, ну и другие.
  • Сеть обтекатели потоков для данных. На более низком уровне это только сокеты, хотя они предоставляют другой интерфейс. Они также предназначены для определенных протоколов уровня приложений, тогда как сокеты более общие.
  • Расширения сетевого протокола, такие как cURL, для обмена сообщениями и данных. Подобно обтекателям потоков, это маскировочные маски (limitd).
  • Расширения веб-служб, такие как SOAP и XML-RPC, для удаленные вызовы процедур (RPC). Обратите внимание, что, хотя они основаны на сокетах, они предназначены для другого типа IPC (RPC, а не для данных).

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

Ответ 2

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

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

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

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

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