Heim >Backend-Entwicklung >PHP-Tutorial >Anwendungsfallanalyse für PHP-Shared-Memory-Nutzung und Signalsteuerung
Dieses Mal werde ich Ihnen eine Analyse der Anwendungsfälle der PHP-Shared-Memory-Nutzung und Signalsteuerung geben Fall, werfen wir einen Blick darauf.
Gemeinsamer SpeicherDie Verwendung von Shared Memory dient hauptsächlich dazu, einige Daten in verschiedenen Prozessen auf demselben Computer gemeinsam nutzen zu können, z in mehreren Die Nutzung des aktuellen Prozesses wird vom PHP-FPM-Prozess gemeinsam genutzt. Diese Art der Kommunikation wird auch Inter-Process Communication, kurz IPC, genannt.
Die in PHP integrierte Shmop-Erweiterung (Shared Memory Operations) bietet eine Reihe von Funktionen für Shared-Memory-Operationen (möglicherweise wurde dieses Dokument noch nicht ins Chinesische übersetzt, weil es nicht viele Leute verwenden). Unter Linux werden diese Funktionen direkt durch Aufrufen der shm*-Funktionsreihe implementiert, während unter Windows dieselben Aufrufe auch durch Kapselung von Systemfunktionen implementiert werden.
Hauptfunktionen:shmop_close
– Schließen Sie den gemeinsam genutzten Speicherblock
shmop_deleteshmop_open– Erstellen oder öffnen eines Shared-Memory-Blocks
shmop_read– Lesen von Daten aus einem Shared-Memory-Block
shmop_size– Ermitteln Sie die Größe des gemeinsam genutzten Speicherblocks.
shmop_write– Schreiben Sie Daten in den gemeinsam genutzten Speicherblock. Verwandte Themen Dazu gibt es auch eine sehr wichtige Funktion: ftok, die über die Inode-Informationen der Datei (angezeigt über den Befehl stat oder ls -i unter *nix) einen eindeutigen Schlüssel für IPC erstellt (der Inode der Datei/des Ordners ist eindeutig). ). Diese Funktion wird auch durch direkten Aufruf der gleichnamigen Systemfunktion unter Linux implementiert, und unter Windows wird immer noch eine gewisse Kapselung verwendet.
Ein einfaches Zählbeispiel:
<?php # 创建一块共享内存 $shm_key = ftok(FILE, 't'); $shm_id = shmop_open($shm_key, 'c', 0644, 8); # 读取并写入数据 $count = (int) shmop_read($shm_id, 0, 8) + 1; shmop_write($shm_id, str_pad($count, 8, '0', STR_PAD_LEFT), 0); // echo shmop_read($shm_id, 0, 8); # 关闭内存块,并不会删除共享内存,只是清除 PHP 的资源 shmop_close($shm_id);
Der obige Code führt keine Zählerhöhung um 1 aus und die Daten werden von verschiedenen Prozessen gemeinsam genutzt. Mit anderen Worten: Sofern dieser Speicher nicht manuell gelöscht wird, werden diese Daten nicht zurückgesetzt.
Es gibt etwas zu beachten: Der zweite Parameter von shmop_open ist ein Flag, ähnlich dem zweiten Parameter von fopen, und seine Werte sind die vorherigen:
"a" liest- nur Zugriff;
"c" Wenn das Speichersegment nicht vorhanden ist, kann es gelesen und geschrieben werden;
"w" lesen und schreiben;
„n“ create Wenn bereits ein neues Speichersegment mit demselben Schlüssel vorhanden ist, schlägt die Erstellung fehl. Dies dient der sicheren Nutzung des gemeinsam genutzten Speichers. Da außerdem das verwendete Shared-Memory-Segment eine feste Länge hat, muss beim Speichern und Lesen die Länge der Daten berechnet werden, da sonst das Schreiben fehlschlagen oder ein Nullwert gelesen werden kann. SignalsteuerungDa oben der gemeinsame Speicher zum Speichern von Daten verwendet wird, müssen Sie berücksichtigen, ob mehrere Prozesse Daten in den gemeinsamen Speicher schreiben gleichzeitig die Umstände, ob Konflikte vermieden werden müssen. Wenn ja, müssen Sie zur Steuerung ein Semaphor einführen.
PHP bietet auch eine ähnliche integrierte Erweiterung sysvsem (diese Erweiterung ist in der Windows-Umgebung nicht verfügbar). Die FTOK-Funktion ist ebenfalls in dieser Erweiterung im Dokument enthalten, aber tatsächlich wird FTOK in der Standardfunktion bereitgestellt Bibliothek, also auch unter Windows verfügbar). Bevor ich über die Semaphorsteuerung spreche, möchte ich noch auf eine weitere interessante Sache eingehen: Wenn Sie sich die offizielle Dokumentation ansehen, werden Sie feststellen, dass es auch Funktionen für Shared-Memory-Operationen (shm_*) gibt, da diese eigentlich derselben Kategorie angehören (oder drei Erweiterungen vom selben Autor), und eine ist sysvmsg (Queue
Nachricht). Die Implementierung der Funktionen unterscheidet sich geringfügig, aber was sie tatsächlich tun, ist im Grunde das Gleiche. Was ist der Unterschied zwischen dieser und der oben genannten Shmop-Erweiterung? Die README-Datei unter dem Shmop-Quellcode hat eine einfache Beschreibung:PHP hatte bereits eine Shared-Memory-Erweiterung (sysvshm), geschrieben von Christian Cartus 32982644a4ae8a6ce575374773bddd52, leider wurde diese Erweiterung entworfen nur mit PHP im Hinterkopf und bietet High-Level-Funktionen, die für das grundlegende SHM, an das wir gedacht hatten, äußerst störend sind.
简单说来:sysvshm 扩展提供的方法并不是原封不动的存储用户的数据,而是先使用 PHP 的变量序列化函数对参数进行序列化然后再进行存储。这就导致通过这些方法存储的数据无法和非 PHP 进程共享。不过这样也能存储更丰富的 PHP 数据类型,上文的扩展中 shmop_write 只能写入字符串。那么为什么 sysvshm 同样不支持 Windows 呢?因为其并没有引入封装了 shm* 系列函数的tsrm_win32.h 的头文件。
引入信号控制之后的示例:
<?php $id_key = ftok(FILE, 't'); $sem_id = sem_get($id_key); # 请求信号控制权 if (sem_acquire($sem_id)) { $shm_id = shmop_open($id_key, 'c', 0644, 8); # 读取并写入数据 $count = (int) shmop_read($shm_id, 0, 8) + 1; shmop_write($shm_id, str_pad($count, 8, '0', STR_PAD_LEFT), 0); // echo shmop_read($shm_id, 0, 8); # 关闭内存块 shmop_close($shm_id); # 释放信号 sem_release($sem_id); }
但是本地想模拟实现写入冲突实际上是非常难的(考虑到计算机的执行速度)。在本地测试中,使用 for 循环操作时如果不使用shmop_close 关闭资源会出现无法打开共享内存的错误警告。这应该是因为正在共享内存被上一次操作占用中还没有释放导致。
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
Das obige ist der detaillierte Inhalt vonAnwendungsfallanalyse für PHP-Shared-Memory-Nutzung und Signalsteuerung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!