Administrare server open source

Platforma de hosting cu software liber, gratuit, open source.

In PHP, ca in orice limbaj respectabil, putem folosi zone de memorie comuna care poate fi accesata de alte fisiere pentru partajarea informatiilor. Pentru a folosi zonele de memorie comuna va trebui prima data sa ne asiguram ca PHP are suport pentru shared memory. Facem asta ruland urmatoarea comanda:

[root@lamp ~]# php -i | grep shmop
shmop
shmop support => enabled
[root@lamp ~]#

Daca apare shmop support => enabled putem trece la treaba. Pentru utilizarea zonelor de memorie partajata vom folosi functiile shmop_open(), shmop_read(), shmop_write(), shmop_size() si shmop_close().

Pentru inceput vom crea un fisier shm.php care va aloca sectorul de memorie partajata si va face un test simplu de scriere/citire:

< ?php
 
header('Content-type: text/plain');
 
$text1  = "Hello, world!";
$shmid = shmop_open( 0x777, "c", 0644, strlen( $text1 ) );
 
if( !$shmid ) {
    echo "Nu pot crea segmentul de memorie.\n";
} else {
    $shmsize = shmop_size( $shmid );
    echo "Am alocat $shmsize bytes pentru segment.\n";
 
    $wrsize = shmop_write( $shmid, $text1, 0 );
    if( $wrsize != strlen( $text1 ) ) {
        echo "Nu am putut scrie in segment tot textul.\n";
    }   
 
    $text2 = shmop_read( $shmid, 0, $shmsize );
    if( !$text2 ) {
        echo "Nu am putut citi textul din segmentul de memorie.\n";
    } else {
        echo "Am citit din memorie: $text2\n";
    }
    shmop_close( $shmid );
}
 
?>

Daca totul functioneaza corect, ar trebui ca atunci cand apelam fisierul din browser sa primim urmatorul mesaj:

Am alocat 13 bytes pentru segment.
Am citit din memorie: Hello, world!

Urmarind fisierul, am creat o zona de memorie partajata folosind functia shmop_open(). Daca alocarea s-a facut corect, verificam marimea, scriem un text si apoi il citim.

La final inchidem handlerul folosit pentru gestionarea zonei de memorie folosind shmop_close(), dar zona alocata va ramane in memorie. In FreeBSD putem verifica asta folosind comanda ipcs -m, care ne va returna o lista cu toate zonele de memorie partajata existente in sistem:

[root@lamp ~]# ipcs -m
Shared Memory:
T           ID          KEY MODE        OWNER    GROUP   
m     46923776         1911 --rw-r--r-- lamp     web     
m     19333122     21518574 --rw------- root     wheel   
[root@lamp ~]#

Observam in rezultatul comenzii inregistrarea care are ca proprietar utilizatorul lamp.

Urmatorul pas ar fi sa citim informatia din zona partajata din cadrul unui alt fisier, pentru ca in final acesta este scopul partajarii memoriei. Pentru a face asta trebuie sa retinem 0x777, ID-ul zonei de memorie care am alocat-o folosind shmop_open(). Asadar vom crea fisierul shm-read.php cu urmatorul continut:

< ?php
 
header('Content-type: text/plain');
 
$shmid = shmop_open( 0x777, "a", 0, 0 );
 
if( !$shmid ) {
    echo "Nu pot deschide segmentul de memorie.\n";
} else { 
    $shmsize = shmop_size( $shmid );
    echo "Am deschis un segment de memorie shared de $shmsize bytes.\n";
 
    $text = shmop_read( $shmid, 0, $shmsize );
    if( !$text ) {
        echo "Nu pot citi din memorie.\n";
    } else { 
        echo "Am citit din memorie: $text\n";
    }
 
    shmop_close( $shmid );
}   
 
?>

Daca il rulam prin browser si totul functioneaza corect vom vedea urmatorul text:

Am deschis un segment de memorie shared de 13 bytes.
Am citit din memorie: Hello, world!

Memoria a fost citita iar mesajul din zona respectiva este mesajul care l-am adaugat in fisierul shm.php la pasul anterior.

Urmatorul pas normal ar fi sa stergem zona de memorie partajata dupa ce nu o mai folosim pentru a nu ocupa spatiu inutil. Pentru asta vom folosi functia shmop_delete(). Vom crea fisierul delete.php cu urmatorul cod:

< ?php
 
header('Content-type: text/plain');
 
$text1  = "Hello, world!";
$shmid = shmop_open( 0x777, "a", 0, 0 );
 
// Verificam daca zona exista
if( $shmid ) {
    $shmsize = shmop_size( $shmid );
    echo "Zona de memorie cu ID-ul 0x777 exista si are $shmsize bytes.\n";
    shmop_close( $shmid );
} else {
    echo "Zona de memorie nu exista.\n";
}
 
// Stergem zona de memorie
$shmid = shmop_open( 0x777, "a", 0, 0 );
if( $shmid ) {
    shmop_delete( $shmid );
    shmop_close(  $shmid );
}
 
// Verificam daca zona a fost stearsa
$shmid = shmop_open( 0x777, "a", 0, 0 );
if( $shmid ) {
    $shmsize = shmop_size( $shmid );
    echo "Zona de memorie cu ID-ul 0x777 exista si are $shmsize bytes.\n";
    shmop_close( $shmid );
} else {
    echo "Zona de memorie a fost stearsa.\n";
}
 
?>

La accesare, fisierul delete.php ar trebui sa afiseze urmatorul rezultat:

Zona de memorie cu ID-ul 0x777 exista si are 13 bytes.
Zona de memorie a fost stearsa.

In prima parte, pentru exemplificare, verificam daca zona de memorie mai exista. Apoi o stergem in partea a doua iar in a treia parte a codului verificam din nou daca exista. In mod normal, daca nu apare vreo eroare, in a treia parte a codului zona nu mai exista. Acest fapt il putem verifica in FreeBSD si folosind comanda ipcs -m ca in exemplul de mai sus:

[root@lamp ~]# ipcs -m
Shared Memory:
T           ID          KEY MODE        OWNER    GROUP   
m     19333122     21518574 --rw------- root     wheel   
[root@lamp ~]#

Comparat cu rezultatul anterior, observam ca acum nu mai exista zona cu proprietar lamp, deci scriptul din delete.php si-a atins scopul.

PHP

5 Responses so far.

  1. Eddie says:

    Super articol … te-am trecut pe lista mea de bloguri pe care le citesc zilnic,Bafta in continuare la ceea ce faci.Cu respect.Eddie

  2. Sergiu Tot says:

    Merci de apreciere!

    Acu’ intr-o zi am avut nevoie de memorie partajata si daca tot mi-am reimprospatat memoria, am zis sa scriu si un mic tutorial 😉

  3. OnlineZZ says:

    Foarte bun articolul.. 10x ca ne-ai impartasi si noua din cunostiintele tale de php 😀

  4. Victor says:

    Buna….

    Alocarea si citirea connforma cu primele 2 sectiuni merge. Insa partea a treia de stergere a zonei de memorie da o eroare/warning. Scuze eu sint incepator….si poate am gresit eu pe undeva.

    Aceasta imi arata mie:

    Zona de memorie cu ID-ul 0x777 exista si are 13 bytes.

    Warning: shmop_open() [function.shmop-open]: unable to attach or create shared memory segment in /var/www/delete.php on line 25
    Zona de memorie a fost stearsa.

    Merci. Pa.

  5. iphonix says:

    asta ce zici aici este deja deep programming …

    app am o problema bizara rau de tot, pe godaddy uneori pur si simplu nu imi merge imagick … crezi ca e de la lipsa de memorie?