Heim  >  Artikel  >  Backend-Entwicklung  >  Beispielanalyse für PHP-Shared-Memory-Nutzung und Signalsteuerung

Beispielanalyse für PHP-Shared-Memory-Nutzung und Signalsteuerung

不言
不言Original
2018-05-09 10:22:451182Durchsuche

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__, &#39;t&#39;);
$shm_id = shmop_open($shm_key, &#39;c&#39;, 0644, 8);
# 读取并写入数据
$count = (int) shmop_read($shm_id, 0, 8) + 1;
shmop_write($shm_id, str_pad($count, 8, &#39;0&#39;, 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 32982644a4ae8a6ce575374773bddd52, leider wurde diese Erweiterung entworfen nur mit PHP im Hinterkopf und bietet High-Level-Funktionen, die für das grundlegende SHM, das wir im Sinn hatten, äußerst störend sind.

Um es einfach auszudrücken: Die von der sysvshm-Erweiterung bereitgestellte Methode besteht nicht darin, Benutzerdaten intakt zu speichern , aber Die Parameter werden zuerst mit der Variablenserialisierungsfunktion von PHP serialisiert und dann gespeichert. Das bedeutet, dass mit diesen Methoden gespeicherte Daten nicht mit Nicht-PHP-Prozessen geteilt werden können. Allerdings können damit auch umfangreichere PHP-Datentypen gespeichert werden. In der obigen Erweiterung kann shmop_write nur Strings schreiben. Warum unterstützt sysvshm nicht auch Windows? Weil die Header-Datei von tsrm_win32.h, die die shm*-Funktionsreihe kapselt, nicht eingeführt wird.

Beispiel nach Einführung der Signalsteuerung:

<?php
$id_key = ftok(__FILE__, &#39;t&#39;);
$sem_id = sem_get($id_key);
# 请求信号控制权
if (sem_acquire($sem_id)) {
  $shm_id = shmop_open($id_key, &#39;c&#39;, 0644, 8);
  # 读取并写入数据
  $count = (int) shmop_read($shm_id, 0, 8) + 1;
  shmop_write($shm_id, str_pad($count, 8, &#39;0&#39;, STR_PAD_LEFT), 0);
  // echo shmop_read($shm_id, 0, 8);
  # 关闭内存块
  shmop_close($shm_id);
  # 释放信号
  sem_release($sem_id);
}

Aber es ist tatsächlich sehr schwierig, Schreibkonflikte lokal zu simulieren (angesichts der Computerausführungsgeschwindigkeit). Wenn Sie im lokalen Test shmop_close nicht verwenden, um die Ressource zu schließen, wenn Sie eine for-Schleifenoperation verwenden, wird eine Fehlermeldung angezeigt, dass der gemeinsam genutzte Speicher nicht geöffnet werden kann. Dies kann daran liegen, dass der gemeinsam genutzte Speicher durch den vorherigen Vorgang belegt und noch nicht freigegeben wurde.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn