PHP wird als Skriptsprache häufig in Netzwerkanwendungen verwendet. Im Allgemeinen ist PHP keine Sprache, die sich auf den zugrunde liegenden Betrieb des Systems bezieht. In einigen speziellen Szenarien, wie z. B. gleichzeitiger Programmierung, Multiprozessprogrammierung, Kommunikation zwischen Prozessen usw., ist jedoch dennoch ein gewisses Verständnis erforderlich des zugrunde liegenden Systems. In diesem Artikel werden zwei einfache Kenntnisse im Zusammenhang mit der Kommunikation zwischen Prozessen vorgestellt: Semaphore und gemeinsam genutzter Speicher. Außerdem werden entsprechende Anwendungsbeispiele für Semaphore und gemeinsam genutzter Speicher in PHP bereitgestellt.
1. Semaphore
Um die gegenseitige Exklusivität zwischen mehreren Prozessen sicherzustellen, müssen einige technische Mittel zur Synchronisierung verwendet werden von ihnen. Ein Semaphor ist ein ganzzahliger Wert, der die Menge der verfügbaren Ressourcen darstellt. Bevor ein Prozess Ressourcen verwendet, muss er einen Semaphor beantragen. Wenn der Semaphor größer als 0 ist, bedeutet dies, dass die Ressource nicht belegt ist und der Semaphor um 1 reduziert werden kann. Dies bedeutet, dass die Ressource belegt ist und der Prozess warten muss. Wenn andere Prozesse Ressourcen freigeben, wird der Prozess angehalten, bis die Ressourcen freigegeben sind und das Semaphor größer als 0 ist.
In PHP können Sie die vom System V IPC-Modul bereitgestellten Funktionen zum Betrieb von Semaphoren verwenden. Der Beispielcode lautet wie folgt:
<?php $sem_key = ftok(__FILE__, 't'); // 生成一个唯一的键值 $sem_id = sem_get($sem_key); // 根据键值获取一个信号量 if (sem_acquire($sem_id)) { // 获取信号量 // 执行需要互斥的代码 sem_release($sem_id); // 释放信号量 } ?>
Im obigen Beispiel haben wir die Funktion ftok() verwendet, um einen eindeutigen Schlüsselwert zu generieren, und über die Funktion sem_get() ein Semaphor erhalten. Verwenden Sie dann die Funktion sem_acquire(), um das Semaphor abzurufen. Dies bedeutet, dass derzeit kein anderer Prozess die Ressource verwendet und Sie Code ausführen können, der einen gegenseitigen Ausschluss erfordert. Verwenden Sie nach der Ausführung die Funktion sem_release() Lassen Sie den Semaphor los.
Zu beachten ist, dass Sie bei der Verwendung von Semaphoren die Situation untergeordneter Prozesse berücksichtigen müssen, da die PHP-Skriptausführung Single-Threaded ist. Wenn mehrere untergeordnete Prozesse gleichzeitig dieselbe Ressource verwenden, muss das Semaphor initialisiert werden, um sicherzustellen, dass mehrere untergeordnete Prozesse dasselbe Semaphor verwenden. Zu diesem Zeitpunkt können Sie zuerst das Semaphor abrufen und den Anfangswert im übergeordneten Prozess festlegen und dann den untergeordneten Prozess auslagern. Der untergeordnete Prozess verwendet zunächst die Funktion sem_attach(), um das Semaphor abzurufen, bevor er die Ressource verwendet, und führt ihn dann aus Der Code, der nach erfolgreicher Übernahme einen gegenseitigen Ausschluss erfordert. Der Beispielcode lautet wie folgt:
<?php $sem_key = ftok(__FILE__, 't'); // 生成一个唯一的键值 $sem_id = sem_get($sem_key, 1, 0666, 1); // 获取一个信号量,设置初值为1 if (pcntl_fork() == 0) { // fork出一个子进程 $child_sem_id = sem_attach($sem_key); // 子进程获取信号量 if (sem_acquire($child_sem_id)) { // 子进程获取信号量成功 // 执行需要互斥的代码 sem_release($child_sem_id); // 释放信号量 } sem_remove($child_sem_id); // 子进程释放信号量 exit; } if (sem_acquire($sem_id)) { // 父进程获取信号量成功 // 执行需要互斥的代码 sem_release($sem_id); // 释放信号量 } sem_remove($sem_id); // 父进程释放信号量 ?>
Im obigen Beispiel haben wir die Funktion pcntl_fork() verwendet, um einen untergeordneten Prozess auszuteilen. Der untergeordnete Prozess ruft das im übergeordneten Prozess erstellte Semaphor über die Funktion sem_attach() ab und verwendet es. Nach der Verwendung muss die Funktion sem_remove() aufgerufen werden, um das Semaphor freizugeben.
2. Gemeinsamer Speicher
Geteilter Speicher bedeutet, dass mehrere Prozesse denselben Speicherbereich gemeinsam nutzen können und jeder Prozess wie auf den lokalen Speicher auf den Speicherbereich zugreifen kann. Shared Memory ähnelt Semaphoren darin, dass sie zur Kommunikation und Synchronisierung zwischen mehreren Prozessen verwendet werden. Der Unterschied zu Semaphoren besteht jedoch darin, dass Shared Memory nicht für gegenseitige Ausschlussoperationen, sondern für die gemeinsame Nutzung von Daten verwendet wird.
In PHP können Sie die vom System V IPC-Modul bereitgestellten Funktionen verwenden, um gemeinsam genutzten Speicher zu betreiben. Der Beispielcode lautet wie folgt:
<?php $shm_key = ftok(__FILE__, 't'); // 获取唯一的键值 $shm_id = shmop_open($shm_key, 'c', 0666, 1024); // 打开共享内存并设置大小为1024字节 if ($shm_id) { $data = 'hello world'; shmop_write($shm_id, $data, 0); // 向共享内存写入数据 $read_data = shmop_read($shm_id, 0, 11); // 从共享内存读取数据 echo $read_data; shmop_delete($shm_id); // 删除共享内存 } ?>
Im obigen Beispiel verwenden wir die Funktion ftok(), um einen eindeutigen Schlüsselwert zu erhalten, und verwenden dann die Funktion shmop_open(), um einen gemeinsam genutzten Speicher mit a zu öffnen Bei einer Größe von 1024 Byte schreibt die Funktion shmop_write() Daten in den gemeinsam genutzten Speicher, die Funktion shmop_read() liest Daten aus dem gemeinsam genutzten Speicher und verwendet schließlich die Funktion shmop_delete(), um den gemeinsam genutzten Speicher zu löschen.
Es ist zu beachten, dass bei der Verwendung von Shared Memory die Situation berücksichtigt werden muss, dass mehrere Prozesse gleichzeitig denselben Speicherbereich bearbeiten und es zu Dateninkonsistenzen kommen kann. Derzeit wird empfohlen, Semaphoren zur Steuerung von Lese- und Schreibvorgängen im gemeinsam genutzten Speicher zu verwenden, um sicherzustellen, dass nur ein Prozess gleichzeitig in den Speicherbereich liest und schreibt, um Dateninkonsistenzen zu vermeiden.
Zusammenfassung
Dieser Artikel stellt zwei grundlegende Kenntnisse im Zusammenhang mit der Interprozesskommunikation in PHP vor: Semaphor und Shared Memory, und stellt relevanten Beispielcode bereit. Bei der Mehrprozessprogrammierung oder gleichzeitigen Programmierung kann uns das Verständnis von Semaphoren und gemeinsam genutztem Speicher dabei helfen, Konflikte zwischen Prozessen besser zu vermeiden und einen Datenaustausch zu erreichen.
Das obige ist der detaillierte Inhalt vonErste Schritte mit PHP: Semaphoren und Shared Memory. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!