Implementación de la memoria PHP compartida de la cola de memoria php

  

<? Php /** * Implementación de la cola de memoria de bucle PHP usando memoria compartida * Admite múltiples procesos, admite el almacenamiento de varios tipos de datos * Nota : poner en cola completa o la operación quitar de la cola, tan pronto como el unset (), para liberar el SHMQueue crítico región * /clase {private $ maxQSize = 0; //máxima longitud de la cola privada frente $ = 0; //puntero de cabecera de la cola $ privada trasera = 0; //puntero de cola de la cola privada $ blockSize = 256; //tamaño de bloque (bytes) $ privada memSize = 25600; //máximo de memoria compartida (byte) $ privada shmid = 0; $ privada filePtr =' ./shmq. ptr '; privado $ semID = 0; función __construct público () {$ ShmKey = ftok (__ FILE__,' t '); $ this- > shmid = shmop_open ($ ShmKey, " C ", 0644, $ this- > memsize); $ this- > maxQSize = $ this- > memsize /$ this- > blockSize; //aplicar un semáforo $ this- > semID = sem_get ($ ShmKey, 1); sem_acquire ($ este - > semID); //solicitar la entrada en la región crítica $ this > init ();} function init privada () {if ($ this file_exists (> filePtr)) {$ contenidos = file_get_contents ( $ this- > filePtr); $ data = explode ('| ', $ contents); if (isset ($ data [0]) &&isset ($ data [1])) {$ this- > front = (int) $ data [0]; $ this- > trasera = (int) $ datos [1];}}} función pública getLength () {return (($ this- > trasera - $ this- > frente + $ this- > memsize)% ($ this- > memSize)) /$ this- > blockSize;} public function enqueue ($ value) {if ($ this- > ptrInc ($ this > trasera) == $ this > frontal) {//fuerza de retorno completo false;} $ data = $ this- > encode (valor $); shmop_write ($ this- > shmid, $ data, $ this- > trasera); $ this- > trasera = $ this- > ptrInc ($ this > trasera); return true;} dequeue función pública () {if ($ this- > delante == $ this > trasera) {//Fuerza retorno vacío falsa;} $ de valor = shmop_read ($ this- > shmid, $ this- > frente, $ this- > blockSize-1); $ this- > frente = $ this- > ptrInc ($ this- > frontal); regreso $ this- > de decodificación (valor $);} función privada ptrInc ($ ptr) {return ($ ptr + $ this- > blockSize)% ($ this- > memsize);} función privada encode (valor $) {$ data = serialize ($ value). " __ eof "; if (st rlen ($ data) > $ this- > blockSize -1) {throw new Excepción (strlen ($ data) y;. quot es el tamaño de bloque de sobrecarga "!);} return $ data;} decodificación función privada (valor $ ) {$ data = explotan (" __ EF ", $ value); unserialize ($ datos [0]) return;} public function __destruct () {$ data = $ this- > delante '|. '$ This- >. posterior; file_put_contents ($ this- > filePtr, $ data); sem_release ($ this- > SemID); //la región crítica, la liberación de semáforos}}

//*******************************************

muestra usando el siguiente código:

//en el equipo de operación $ shmq = new SHMQueue (); $ data = 'prueba de datos'; $ shmq- > enqueue ($ data); unset ($ shmq); //Dequeue operation $ shmq = new SHMQueue (); $ data = $ shmq- > deQueue (); unset ($ shmq);? ≫


Copyright © Conocimiento de Windows All Rights Reserved