Heim  >  Artikel  >  Backend-Entwicklung  >  Was Sie vielleicht nicht über PHP wissen – das ereignisgesteuerte Design von PHP

Was Sie vielleicht nicht über PHP wissen – das ereignisgesteuerte Design von PHP

angryTom
angryTomnach vorne
2019-10-15 11:20:132025Durchsuche

Kürzlich habe ich an einem Projekt gearbeitet, das die Verwendung von asynchronem PHP erforderte. Als ich den PHP-Quellcode durchsuchte, fand ich drei unbenutzte Module, sysvsem, sysvshm und sysvmsg.

Es gibt eine solche Funktionsfamilie in PHP, bei der es sich um Pakete der V IPC-Funktionsfamilie von UNIX handelt.

Sie werden selten verwendet, aber sie sind wirksam. Wenn Sie sie klug einsetzen, können Sie mit halbem Aufwand das Doppelte des Ergebnisses erzielen.

Dazu gehören:

Semaphoren

Shared Memory

Inter-Process Messaging ( IPC)

Auf dieser Grundlage ist es für uns durchaus möglich, PHP in ein nachrichtengesteuertes System zu packen.

Aber zuerst müssen wir ein paar wichtige Grundlagen vorstellen:

1. ftok

int ftok ( string pathname, string proj )
//ftok将一个路径名pathname和一个项目名(必须为一个字符), 转化成一个整形的用来使用系统V IPC的key

Ticks ist aus PHP 4.0. Es wurde erst Anfang 3 zu PHP hinzugefügt. Es handelt sich um ein Ereignis, das jedes Mal auftritt, wenn der Interpreter N Low-Level-Anweisungen im Deklarationscodesegment ausführt. Der Wert von N wird mit ticks=N im Direktiventeil von „declare“ angegeben.

function getStatus($arg){
 print_r connection_status();
 
 debug_print_backtrace();
 
}
reigster_tick_function("getStatus", true);
 
declare(ticks=1){
 
 for($i =1; $i<999; $i++){
 
 echo "hello";
 
 }
 
}

unregister_tick_function("getStatus");

Dies entspricht im Grunde der Nachricht

function getStatus($arg){
 print_r connection_status();
 
 debug_print_backtrace();
 
}
 
reigster_tick_function("getStatus", true);
 
declare(ticks=1){
 
 for($i =1; $i<999; $i++){
 
 echo "hello"; getStatus(true);
 
 }
 
}
unregister_tick_function("getStatus");

. Ich werde nun anhand eines Beispiels veranschaulichen, wie die PHP-Nachrichtenkommunikation mit Ticks implementiert wird.

$mesg_key = ftok(__FILE__, &#39;m&#39;);
$mesg_id = msg_get_queue($mesg_key, 0666);
 
function fetchMessage($mesg_id){
 
 if(!is_resource($mesg_id)){
 
 print_r("Mesg Queue is not Ready");
 
 }
 
 if(msg_receive($mesg_id, 0, $mesg_type, 1024, $mesg, false, MSG_IPC_NOWAIT)){
 
 print_r("Process got a new incoming MSG: $mesg ");
 
 }
 
}
 
register_tick_function("fetchMessage", $mesg_id);
 
declare(ticks=2){
 
 $i = 0;
 
 while(++$i < 100){
 
 if($i%5 == 0){
 
 msg_send($mesg_id, 1, "Hi: Now Index is :". $i);
 }
 }
}
 
//msg_remove_queue($mesg_id);

In diesem Beispiel fügen wir zunächst unseren PHP-Ausführungsprozess zu einer Nachrichtenwarteschlange hinzu, die durch den von ftok generierten Schlüssel abgerufen wird.

Fragen Sie dann über Ticks alle zwei Anweisungen die Nachrichtenwarteschlange ab.

Dann wird der Nachrichtenversand simuliert.

Greifen Sie im Browser auf dieses Skript zu und das Ergebnis sieht wie folgt aus:

Process got a new incoming MSG: s:19:"Hi: Now Index is :5";
Process got a new incoming MSG: s:20:"Hi: Now Index is :10";
Process got a new incoming MSG: s:20:"Hi: Now Index is :15";
Process got a new incoming MSG: s:20:"Hi: Now Index is :20";
Process got a new incoming MSG: s:20:"Hi: Now Index is :25";
Process got a new incoming MSG: s:20:"Hi: Now Index is :30";
Process got a new incoming MSG: s:20:"Hi: Now Index is :35";
Process got a new incoming MSG: s:20:"Hi: Now Index is :40";
Process got a new incoming MSG: s:20:"Hi: Now Index is :45";
Process got a new incoming MSG: s:20:"Hi: Now Index is :50";
Process got a new incoming MSG: s:20:"Hi: Now Index is :55";
Process got a new incoming MSG: s:20:"Hi: Now Index is :60";
Process got a new incoming MSG: s:20:"Hi: Now Index is :65";
Process got a new incoming MSG: s:20:"Hi: Now Index is :70";
Process got a new incoming MSG: s:20:"Hi: Now Index is :75";
Process got a new incoming MSG: s:20:"Hi: Now Index is :80";
Process got a new incoming MSG: s:20:"Hi: Now Index is :85";
Process got a new incoming MSG: s:20:"Hi: Now Index is :90";
Process got a new incoming MSG: s:20:"Hi: Now Index is :95";

Wenn man das sieht, hat jeder schon eine Vorstellung davon, wie man PHP als Ereignistreiber simulieren kann? Machen Sie sich keine Sorgen, wir werden uns weiter verbessern.

3. Semaphor

Jeder sollte mit dem Konzept des Semaphors vertraut sein. Durch Semaphore können Prozesskommunikation, Wettbewerb usw. erreicht werden. Ich werde nicht noch einmal auf Details eingehen, sondern lediglich die Menge der in PHP bereitgestellten Semaphorfunktionen auflisten.

sem_acquire -- Acquire a semaphore
sem_get -- Get a semaphore id
sem_release -- Release a semaphore
sem_remove -- Remove a semaphore

Für spezifische Informationen können Sie das PHP-Handbuch lesen.

4. Speicherfreigabe

PHP sysvshm bietet eine Speicherfreigabelösung: sysvshm, die zur gleichen Reihe wie sysvsem und sysvmsg gehört, aber hier habe ich sie nicht verwendet, sondern den shmop Eine Reihe von Funktionen, kombiniert mit TIcks

function memoryUsage(){
 printf("%s: %s<br/>", date("H:i:s", $now), memory_get_usage());
 
 //var_dump(debug_backtrace());
 
 //var_dump(__FUNCTION__);
 
 //debug_print_backtrace();
 
}
 
register_tick_function("memoryUsage");
 
declare(ticks=1){
 
$shm_key = ftok(__FILE__, &#39;s&#39;);
 
$shm_id = shmop_open($shm_key, &#39;c&#39;, 0644, 100);
 
}
 
printf("Size of Shared Memory is: %s<br/>", shmop_size($shm_id));
 
$shm_text = shmop_read($shm_id, 0, 100);
 
eval($shm_text);
 
if(!empty($share_array)){
 
 var_dump($share_array);
 
 $share_array[&#39;id&#39;] += 1;
 
}else{
 
 $share_array = array(&#39;id&#39; => 1);
 
}
 
$out_put_str = "$share_array = " . var_export($share_array, true) .";";
 
$out_put_str = str_pad($out_put_str, 100, " ", STR_PAD_RIGHT);
 
shmop_write($shm_id, $out_put_str, 0);
 
?>

, führen Sie dieses Beispiel aus und aktualisieren Sie es kontinuierlich. Wir können sehen, dass der Index zunimmt.

Allein die Verwendung dieses Shmop kann die Funktionen zum Teilen von Daten zwischen PHP-Skripten sowie zum Beispiel Caching, Zählen usw. vervollständigen.

Weitere PHP-bezogene Kenntnisse finden Sie auf der

PHP-Chinese-Website

!

Das obige ist der detaillierte Inhalt vonWas Sie vielleicht nicht über PHP wissen – das ereignisgesteuerte Design von PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:www.laruence.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen

In Verbindung stehende Artikel

Mehr sehen