In diesem Artikel erfahren Sie, wie Sie gemeinsam genutzten Speicher in PHP erstellen, um die Last zu reduzieren. Folgen Sie dem Artikel, um zu erfahren, dass PHP über zwei Schnittstellensätze für die Speicherfreigabe verfügt. Eine davon ist shm, bei dem es sich tatsächlich um eine gemeinsame Nutzung von Variablen handelt und die Objektvariablen vor dem Speichern serialisiert. Es ist recht praktisch zu verwenden, aber serialisierter Speicher ist für Speicherzugriffsvorgänge, bei denen die Effizienz im Vordergrund steht, bedeutungslos. Die andere Funktion ist shmop, die bei Linux und Windows üblich ist, deren Funktion jedoch schwächer ist als bei shm. Unter Linux werden diese Funktionen direkt durch den Aufruf der shm*-Funktionsreihe implementiert, während sie unter Windows auch durch das Kapselungssystem implementiert werden Funktionen haben den gleichen Aufruf getätigt.
Um ein Shared-Memory-Segment zu erstellen, müssen Sie die Funktion shmop verwenden. Voraussetzung ist also, dass die Erweiterung aktiviert ist. [Empfohlenes Lernen:
PHP-Video-Tutorial shmop-Hauptfunktionenshmop_open (einen gemeinsam genutzten Speicherblock erstellen oder öffnen), shmop_write (Daten in einen gemeinsam genutzten Speicherblock schreiben), shmop_read (aus einem gemeinsam genutzten Speicherblock lesen) data), shmop_size (die Größe des gemeinsam genutzten Speicherblocks abrufen), shmop_close (den gemeinsam genutzten Speicherblock schließen), shmop_delete (den gemeinsam genutzten Speicherblock löschen)
Nach dem Login kopieren
Das Erste, was In dieser Funktion erscheint der System-ID-Parameter. Dies ist eine Nummer, die das gemeinsam genutzte Speichersegment im System identifiziert. Der zweite Parameter ist der Zugriffsmodus, der dem Zugriffsmodus der fopen-Funktion sehr ähnlich ist. Sie können in 4 verschiedenen Modi auf ein Speichersegment zugreifen:
Modus „a“, der Ihnen den Zugriff auf ein schreibgeschütztes Speichersegment ermöglicht, schreibgeschützter Zugriffsmodus „c“, der ein neues Speichersegment erstellt, oder wenn der Speicher Segment ist bereits vorhanden, versuchen Sie es zum Lesen und Schreiben zu öffnen.
Modus „n“, es erstellt ein neues Speichersegment. Wenn derselbe Schlüssel bereits vorhanden ist, schlägt die Erstellung fehl. Dies dient der sicheren Nutzung des gemeinsam genutzten Speichers.
Der dritte Parameter sind die Berechtigungen des Speichersegments. Sie müssen hier einen Oktalwert angeben.
Der vierte Parameter gibt die Speichersegmentgröße in Bytes an. Da das verwendete Shared-Memory-Segment eine feste Länge hat, muss beim Speichern und Lesen die Länge der Daten berechnet werden, da sonst der Schreibvorgang fehlschlagen oder ein Nullwert gelesen werden kann. .
Bitte beachten Sie, dass diese Funktion eine ID-Nummer zurückgibt, die von anderen Funktionen verwendet werden kann, um dieses gemeinsam genutzte Speichersegment zu bearbeiten. Diese ID ist die Shared-Memory-Zugriffs-ID, im Gegensatz zur System-ID, die als Parameter übergeben wird. Achten Sie darauf, die beiden nicht zu verwechseln. Bei einem Fehler gibt shmop_open FALSE zurück. Beim Erstellen eines Speicherblocks wird empfohlen, für den Schlüsselparameter Konstanten anstelle von Variablen zu verwenden, da es sonst wahrscheinlich zu Speicherverlusten kommt.
shmop_write (Daten in das Speichersegment schreiben)Diese Funktion ähnelt der fwrite-Funktion, die zwei Parameter benötigt: die Open-Stream-Ressource (zurückgegeben von fopen) und die Daten, die Sie schreiben möchten. Auch die Funktion shmop_write übernimmt diese Aufgabe.
Der erste Parameter ist die von shmop_open zurückgegebene ID, die den gemeinsam genutzten Speicherblock identifiziert, den Sie bearbeiten. Der zweite Parameter sind die Daten, die Sie speichern möchten, und der letzte dritte Parameter ist die Position, an der Sie mit dem Schreiben beginnen möchten. Standardmäßig verwenden wir immer 0, um anzugeben, wo mit dem Schreiben begonnen werden soll. Beachten Sie, dass diese Funktion bei einem Fehler FALSE und bei Erfolg die Anzahl der geschriebenen Bytes zurückgibt.
shmop_read (Daten aus dem Speichersegment lesen)Das Lesen von Daten aus dem gemeinsam genutzten Speichersegment ist sehr einfach. Sie benötigen lediglich ein offenes Speichersegment und die Funktion shmop_read. Diese Funktion akzeptiert einige Parameter und funktioniert wie fread.
Bitte achten Sie hier auf die Parameter. Die Funktion shmop_read akzeptiert die von shmop_open zurückgegebene ID, die wir bereits kennen, akzeptiert aber auch zwei weitere Parameter. Das zweite Argument ist die Position im Speichersegment, aus der Sie lesen möchten, und das dritte Argument ist die Anzahl der Bytes, die Sie lesen möchten. Der zweite Parameter kann immer 0 sein und den Anfang der Daten angeben, aber der dritte Parameter kann problematisch sein, da wir nicht wissen, wie viele Bytes wir lesen möchten.
Dies ist sehr ähnlich zu dem, was wir in der fread-Funktion tun, die zwei Parameter benötigt: die offene Stream-Ressource (zurückgegeben von fopen) und die Anzahl der Bytes, die Sie aus dem Stream lesen möchten. Verwenden Sie die Dateigrößenfunktion (die die Anzahl der Bytes in einer Datei zurückgibt), um sie vollständig zu lesen.
shmop_size (gibt die tatsächliche Größe der Speichersegmentdaten zurück)Wenn wir beispielsweise einen Speicherplatz mit einer Länge von 100 Bytes öffnen, die tatsächliche Länge der gespeicherten Daten jedoch nur 90 beträgt, wird der Wert zurückgegeben durch die Verwendung von shmop_size beträgt 90.
shmop_delete (Speichersegment löschen)Diese Funktion akzeptiert nur einen Parameter: die Shared-Memory-ID, die wir löschen möchten. Dadurch wird das Speichersegment nicht tatsächlich gelöscht. Es markiert das Speichersegment zum Löschen, da ein gemeinsam genutztes Speichersegment nicht gelöscht werden kann, während ein anderer Prozess es verwendet. Die Funktion shmop_delete markiert das Speichersegment zum Löschen und verhindert so, dass ein anderer Prozess es öffnen kann. Um es zu löschen, müssen wir dieses Speichersegment schließen. Beim Erstellen eines Speicherblocks wird empfohlen, für den Schlüsselparameter Konstanten anstelle von Variablen zu verwenden, da es sonst wahrscheinlich zu Speicherverlusten kommt.
shmop_close(Speichersegment schließen)
我们在对内存段进行读取和写入,但完成操作后,我们必须从它解除,这非常类似于处理文件时的 fclose 函数。打开包含一个文件的流并在其中读取或写入数据后,我们必须关闭它,否则将发生锁定。
简单测试结果查看
我是在LNMP环境下操作的,如果你也和我一样,在执行完简单的操作之后,可以使用linux命令查看一下地址和占用大小
# ipcs -m [root@bogon ~]# ipcs -m ------ Shared Memory Segments -------- key shmid owner perms bytes nattch status 0x00000000 0 gdm 600 393216 2 dest 0x00000000 32769 gdm 600 393216 2 dest 0x4337b101 884750 nobody 644 1024 0
命令说明
key :共享内存的唯一的key值,共享内存通过该key来判断你读取的是哪一块内存。 owner:创建该共享内存块的用户 bytes:该内存块的大小 status:当前状态,如:dest,即将删除等。
项目实际应用小案例
/** * 将领技能 */ class Generalskill_model extends CI_Model { private $_memory_key = 0x4337b001; //共享内存地址key private $_memory_size = 1048576; //开辟共享内存大小 //最好根据实际数据长度大小定义。 public function __construct() { parent::__construct(); } public function get_skill_list() { $data = []; $shmid = @shmop_open($this->_memory_key, 'a', 0644, $this->_memory_size); if ($shmid === FALSE) { $shmid = @shmop_open($this->_memory_key, 'c', 0644, $this->_memory_size); $data = $this->return_skill_list(); shmop_write($shmid, json_encode($data), 0); @shmop_close($shmid); return $data; } $data = json_decode(preg_replace('/[\x00-\x1F\x80-\x9F]/u', '', trim(shmop_read($shmid, 0, $this->_memory_size))), true); @shmop_close($shmid); return $data; } public function return_skill_list() { //这里是一个超大的数组,其实就是把这个数组json化,然后存入共享内存段。 其实可以用redis等其他缓存...这里我就是为了不用redis等其他nosql才用的shmop return array ( => array ('id' => '1','animation' => '13','skill_type' => '1','power_type' => '1','site' => '1','type' => '1','paramete' => '0','paramete2' => '0','paramete3' => '0','chance' => '0','ratio' => '1', ), => array ('id' => '2','animation' => '3','skill_type' => '2','power_type' => '1','site' => '1','type' => '1','paramete' => '0','paramete2' => '0','paramete3' => '0','chance' => '0','ratio' => '2', ),..........................................
当然你要考虑的是,如果数据更新的话,那么内存段也要删除,并且更新数据…通过shmop_delete可以删除 。这就需要你们自己根据项目应用来考虑了
还有就是这篇文章只是为了简单的读,并没有出现复杂的读写,否则可能会出现进程互斥等意想不到的冲突如果复杂,那么就可以考虑信号量了。
Das obige ist der detaillierte Inhalt vonDetailliertes Beispiel dafür, wie PHP Shared Memory erstellt, um die Last zu reduzieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!