2011-12-25 17 views

risposta

31

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.

+0

C'è un buon modo per far reagire il processo di ricezione a un messaggio, in modo che diventi evento guidato? – CMCDragonkai

+0

@outis, Qual è l'equivalente di Windows? – Pacerier

+0

come funziona su più server nodo? –

9

Quando un processo in esecuzione richiede memoria, il sistema fornisce una porzione di memoria a cui è possibile accedere solo dal processo assegnato. A volte si eseguono più thread e si desidera condividere i dati tra di loro.

"Condivisione di dati" può essere fatto da:

  • dati che passano attraverso prese/tubi
  • Shared Memory (thread, processi)

Poiché il passaggio di dati non è molto utile in qualche casi, si potrebbe voler usare Shared memory.

Le funzioni in questione forniscono funzionalità per gestire i segmenti di memoria condivisa in PHP.

+0

Quindi è praticamente inutile allora? Voglio dire, se puoi usare variabili globali per questo, non c'è motivo di scherzare con quelle funzioni di shmop_ * – Alex

+2

@Alex: PHP in realtà non ha "variabili globali" del genere. È un termine improprio in PHP, poiché hai sempre spazi di processo separati. - Pensa a shmop più come memcache, eccetto che è una funzionalità di sistema POSIX/Unix, intesa per la condivisione tra applicazioni PHP e C (se non fosse per la mancata corrispondenza nella rappresentazione binaria, non è possibile trovare quella duplicata). Puoi anche immaginarlo come un ramdisk, infatti shmop di solito crea una voce di file in '/ etc/shm/*' – mario

+0

La memoria condivisa è gestita dal sistema operativo. Hanno molto più servizi di protezione e controllo rispetto all'uso limitato di variabili globali. La memoria condivisa viene principalmente utilizzata per la comunicazione tra processi. Se non ne hai esplicitamente bisogno, segui le variabili. – fuzzy