http://www.php.net/manual/en/intro.shmop.php
Shmop – это простой в использовании набор функций, который позволяет PHP читать, записывать, создавать и удалять сегменты разделяемой памяти Unix.
- Есть ли способ в PHP использовать постоянные данные, как в Java EE? (обмен объектами между потоками PHP) без сеанса и кэша / DB
- PHP - доступ к общей памяти, созданной с помощью C ++
- Обмен переменными / памятью между всеми процессами PHP
- pthread Объекты темы восстанавливают свое состояние
- php: удаление разделяемой памяти на окнах
Я не понимаю, какова цель этого расширения? Для чего его используют?
Общая память позволяет нескольким процессам получать доступ к тем же данным в памяти. Вы можете использовать его для обмена данными между запущенными скриптами 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
. Обратите внимание, что неназванные каналы не могут быть созданы между произвольными процессами. Обратите внимание, что трубы на некоторых системах однонаправлены: ручка трубы может использоваться как для чтения, так и для записи, но не для обоих. shm_attach
). Также доступно множество других расширений для различных протоколов обмена сообщениями, включая SAM , STOMP и AMQP . См. « Другие службы » в руководстве по PHP, ну, другие. Хотя сокеты (и что-то на их основе, такие как обтекатели потоков) и каналы могут использоваться для передачи данных между процессами, их возможности с более чем двумя процессами ограничены. Сокеты могут подключаться только к двум процессам; чтобы обрабатывать более двух, необходимо открыть несколько сокетов (в которых обычно входит клиент-серверная архитектура). С трубами только один процесс может читать данные ; как только он появится, эти данные не будут доступны другим читателям, хотя они могут читать другие данные (которые затем станут недоступны для всех, кроме читателя). Произвольное количество процессов может открыть одну и ту же область разделяемой памяти.
Когда работающий процесс запрашивает память, система предоставляет кусочек памяти, доступ к которому может получить только выделенный процесс. Иногда вы запускаете несколько потоков и хотите совместно использовать данные среди них.
«Совместное использование данных» может быть выполнено:
Поскольку в некоторых случаях передача данных не очень удобна, можно использовать общую память .
Эти функции предоставляют функциональные возможности для обработки разделяемых сегментов памяти в PHP.