La memoria condivisa consente a più processi di accedere agli stessi dati in memoria. Puoi usarlo per condividere dati tra gli script PHP in esecuzione.
$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);
Al riavvio del computer, tutto nella memoria condivisa viene perso.
differenti processi possono accedere alla stessa memoria condivisa, allo stesso tempo, che può portare a race conditions. Nell'esempio sopra, se due processi leggono la memoria condivisa prima che sia scritta su di essa, il conteggio sarà 1 in meno di quanto dovrebbe essere. condizioni di corsa possono essere evitati utilizzando un mutex, ma che è al di fuori dell'ambito della presente Q & A.
memoria condivisa viene utilizzata per un tipo di inter-process communication, cioè della trasmissione dei dati. Alcuni altri disponibili in PHP (a seconda della piattaforma e costruzione PHP) sono:
- segnali (
posix_kill
per inviare un segnale, pcntl_signal
per impostare un gestore di segnale), un tipo limitato di message passing. I segnali non sono particolarmente utili nelle pagine di script, poiché ogni script dovrebbe essere eseguito per un tempo molto breve.
- Sockets per i dati. I socket possono utilizzare una rete o possono essere locali.
- Tubi per dati.
posix_mkfifo
viene utilizzato per creare named pipes (aka FIFOs), e lo standard file funzioni sono utilizzati per leggere e scrivere dati. Le pipe senza nome (ovvero anonymous) possono essere create tra processi padre e figlio utilizzando popen
o proc_open
. Non è possibile creare pipe senza nome tra processi arbitrari. Nota che le pipe su alcuni sistemi sono unidirezionali: un handle di pipe può essere usato sia per leggere che scrivere, ma non per entrambi.
- Semaphores per synchronization.
- Code messaggi per messaging. In PHP, l'estensione Semaphore offre sia code di messaggi sia un altro insieme di funzioni di memoria condivisa (ad esempio
shm_attach
). Sono inoltre disponibili molte altre estensioni per vari protocolli di messaggistica, tra cui SAM, STOMP e AMQP. Vedi "Other Services" nel manuale PHP per, beh, altri.
- Rete stream wrappers per i dati. Ad un livello inferiore, questi sono solo socket, sebbene forniscano un'interfaccia diversa. Sono anche per specifici protocolli a livello di applicazione, mentre i socket sono più generali.
- Network protocol extensions, come ad esempio cURL, per la messaggistica dei dati &. Come i wrapper di flusso, questi sono (limitati) socket sotto mentite spoglie.
- Web service extensions, ad esempio SOAP e XML-RPC, per remote procedure calls (RPC). Si noti che mentre questi sono basati su socket, sono per un diverso tipo di IPC (RPC piuttosto che dati).
Mentre i socket (e qualsiasi cosa basata su di essi, come i wrapper di flusso) e le pipe possono essere utilizzati per passare i dati tra i processi, le loro capacità con più di due processi sono limitate. I socket possono connettere solo due processi; per gestire più di due, è necessario aprire più socket (che è il punto in cui di solito viene utilizzata un'architettura client-server). Con i tubi, solo una procedura può read given data; una volta acquisito, tali dati non saranno disponibili per altri lettori, sebbene possano leggere altri dati (che diventeranno quindi non disponibili per tutti tranne il lettore). Un numero arbitrario di processi può aprire la stessa area di memoria condivisa.
C'è un buon modo per far reagire il processo di ricezione a un messaggio, in modo che diventi evento guidato? – CMCDragonkai
@outis, Qual è l'equivalente di Windows? – Pacerier
come funziona su più server nodo? –