Dieser Artikel stellt hauptsächlich die Analyse der PHP-Shared-Memory-Nutzung und der Signalsteuerungsbeispiele vor. Jetzt kann ich ihn mit allen teilen, die ihn benötigen.
Die Beispiele in diesem Artikel Beschreiben Sie die PHP-Speichernutzung und Signalsteuerung. Teilen Sie es als Referenz mit allen. Die Details lauten wie folgt:
Gemeinsamer Speicher
Die Verwendung von Shared Memory dient hauptsächlich der Ermöglichung verschiedener Benutzer können denselben Computer verwenden, z. B. die Nutzung des aktuellen Prozesses durch mehrere PHP-FPM-Prozesse. 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 nicht viele Leute es 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_delete – Löschen Sie den Shared-Memory-Block
shmop_open – Einen Shared-Memory-Block erstellen oder öffnen
shmop_read – Daten aus einem Shared-Memory-Block lesen
shmop_size – Ermitteln Sie die Größe des gemeinsam genutzten Speicherblocks
shmop_write – Schreiben Sie Daten in den gemeinsam genutzten Speicherblock
Es gibt noch eine weitere wichtige Sache zu dieser Funktion: ftok, erstellt den eindeutigen IPC-Schlüssel anhand der Inode-Informationen der Datei (angezeigt über den Befehl stat oder ls -i auf *nix) (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 zwischen 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.Signalsteuerung
Da 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 (Warteschlangennachrichten). 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
<?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); }
Verwandte Empfehlungen:
So implementieren Sie Shmop-Serienfunktionen mithilfe des PHP-Shared-Memory
Detaillierte Einführung in den vom PHP-Shared-Memory verwendeten Code
Das obige ist der detaillierte Inhalt vonBeispielanalyse für PHP-Shared-Memory-Nutzung und Signalsteuerung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!