Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-ereignisgesteuertes Design

PHP-ereignisgesteuertes Design

不言
不言Original
2018-04-09 17:39:351689Durchsuche

In diesem Artikel wird hauptsächlich das ereignisgesteuerte PHP-Design vorgestellt. Jetzt können Freunde in Not darauf zurückgreifen.

Dieser Artikel beschreibt das ereignisgesteuerte PHP-Design mit Beispielen. Teilen Sie es als Referenz mit allen. Die Details lauten wie folgt:

Ich habe kürzlich an einem Projekt gearbeitet, das die Verwendung von asynchronem PHP erforderte. Als ich den PHP-Quellcode durchgesehen habe, habe ich drei unbenutzte Module gefunden , sysvsem, sysvshm, sysvmsg, Nach einiger Recherche habe ich sehr davon profitiert.

Es gibt eine solche Funktionsfamilie in PHP. Es handelt sich um Pakete der v ipc-Funktionsfamilie von Unix.
Sie werden selten verwendet, sind aber wirkungsvoll. Wenn Sie sie klug einsetzen, können Sie mit halbem Aufwand das Doppelte des Ergebnisses erzielen.

Dazu gehören:

Semaphoren
Gemeinsamer Speicher
Inter-Process Messaging (IPC)

Auf dieser Grundlage ist es vollständig Es ist uns möglich, PHP in ein nachrichtengesteuertes System zu packen.

Aber zunächst müssen wir ein paar wichtige Grundlagen vorstellen:

1. ftok

int ftok ( string pathname, string proj )

ftok wandelt einen Pfadnamen und einen Projektnamen (muss aus einem Zeichen bestehen) in einen ganzzahligen Schlüssel um, der zur Verwendung von System v ipc verwendet wird

2. Ticks

Ticks wurden erst ab PHP 4.0.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 Wesentlichen:

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");

Nachricht, Ich werde nun anhand eines Beispiels veranschaulichen, wie man Ticks kombiniert, um die PHP-Nachrichtenkommunikation zu implementieren.

$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);

Fügen Sie in diesem Beispiel zunächst unseren PHP-Ausführungsprozess zur Nachrichtenwarteschlange hinzu, die durch den von ftok generierten Schlüssel erhalten wird.

Fragen Sie dann alle zwei Anweisungen durch Häkchen die Nachrichtenwarteschlange ab.

Dann wird der Nachrichtenversand simuliert.

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

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";

Haben Sie das gesehen? Jeder hat es bereits herausgefunden Wie simuliert man PHP? Haben Sie bereits ein ereignisgesteuertes Konzept? Machen Sie sich keine Sorgen, wir werden uns weiter verbessern.

2. 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 einfach den in PHP bereitgestellten Semaphor-Funktionssatz auflisten

sem_acquire – Semaphor erwerben
sem_get – Semaphor-ID abrufen
sem_release – Geben Sie ein Semaphor frei
sem_remove – Entfernen Sie ein Semaphor

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

3. Speicherfreigabe

php sysvshm bietet eine Speicherfreigabelösung: sysvshm, die zur gleichen Reihe wie sysvsem und sysvmsg gehört, aber hier nicht ohne Dabei habe ich die Shmop-Funktionsreihe in Kombination mit Ticks

function memoryusage(){
 printf("%s: %s<br/>", date("h:i:s",time()), 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);
?>

verwendet, um dieses Beispiel auszuführen und kontinuierlich zu aktualisieren. Wir können sehen, dass der Index vorhanden ist zunehmend.

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

Verwandte Empfehlungen:

Implementierung des PHP-Ereignismechanismus

Detaillierte Analyse: Über PHP-ereignisgesteuerte Probleme_PHP-Tutorial

Das obige ist der detaillierte Inhalt vonPHP-ereignisgesteuertes Design. 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