Che cosa fa l'estensione PHP shmop?

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

Shmop è un insieme di funzioni di facile utilizzo che consente a PHP di leggere, scrivere, creare ed eliminare segmenti di memory condivisa Unix.

Non capisco, qual è esattamente lo scopo di questa estensione? A cosa serve?

La memory condivisa consente a più processi di accedere agli stessi dati in memory. 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 ciò che si trova nella memory condivisa viene perso.

Diversi processi possono accedere alla stessa memory condivisa allo stesso tempo, il che può portre a condizioni di gara . Nell'esempio sopra, se due processi leggono la memory condivisa prima che sia scritta su di essa, il count sarà 1 in less di quanto dovrebbe essere. Le condizioni di gara possono essere prevenute usando un mutex , ma questo è al di fuori dello scopo di questa D & R.

La memory condivisa viene utilizzata per un tipo di comunicazione tra processi , ovvero il passaggio dei dati. Alcuni altri disponibili in PHP (a seconda della piattaforma e della build di PHP) sono:

  • Segnali ( posix_kill per submit un segnale, pcntl_signal per impostare un gestore di segnali), un tipo limitato di passaggio di messaggi. I segnali non sono particolarmente utili nelle pagine di script, poiché each script dovrebbe essere eseguito per un tempo molto breve.
  • Prese per i dati I socket possono utilizzare una networking o possono essere locali.
  • Tubi per dati. posix_mkfifo è usato per creare named pipe (aka FIFOs ), e le funzioni file standard sono usate per leggere e scrivere dati. Le pipe senza nome (anche anonime ) possono essere create tra processi genitore e figlio usando popen o proc_open . Non è ansible creare pipe senza nome tra processi arbitrari. Nota che le pipe su alcuni sisthemes sono unidirezionali: un handle di pipe può essere usato sia per leggere che scrivere, ma non per entrambi.
  • Semafori per la sincronizzazione .
  • Code di messaggi per la messaggistica . In PHP, l'estensione del semaforo offre sia code di messaggi sia un altro insieme di funzioni di memory condivisa (ad es. shm_attach ). Sono inoltre disponibili molte altre estensioni per vari protocolli di messaggistica, tra cui SAM , STOMP e AMQP . Vedi " Altri servizi " nel manuale PHP per, beh, altri.
  • Wrapper di stream di networking per i dati. Ad un livello inferiore, questi sono solo socket, sebbene forniscano un'interface diversa. Sono anche per specifici protocolli a livello di applicazione, mentre i socket sono più generali.
  • Estensioni del protocollo di networking , come cURL , per messaggistica e dati. Come i wrapper di stream, questi sono (limitati) socket sotto mentite spoglie.
  • Estensioni del servizio Web , come SOAP e XML-RPC , per chiamate di procedure remote (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 del stream) e le pipe possono essere utilizzati per passare i dati tra i processi, le loro abilità 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 solitamente viene utilizzata un'architettura client-server). Con le pipe, solo un process può leggere dati dati ; 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 memory condivisa.

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

"Condivisione dei dati" può essere fatto da:

  • Passare dati tramite prese / tubi
  • Memoria condivisa (discussioni, processi)

Dal momento che il passaggio dei dati non è molto utile in alcuni casi, si potrebbe voler utilizzare la memory condivisa .

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