Heim > Artikel > Backend-Entwicklung > Was Sie vielleicht nicht über PHP wissen – das ereignisgesteuerte Design von PHP
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:
int ftok ( string pathname, string proj ) //ftok将一个路径名pathname和一个项目名(必须为一个字符), 转化成一个整形的用来使用系统V IPC的key
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");
$mesg_key = ftok(__FILE__, 'm'); $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
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
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__, 's'); $shm_id = shmop_open($shm_key, 'c', 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['id'] += 1; }else{ $share_array = array('id' => 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-WebsiteDas 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!