Maison  >  Article  >  développement back-end  >  Ce que vous ne savez peut-être pas sur PHP : la conception événementielle de PHP

Ce que vous ne savez peut-être pas sur PHP : la conception événementielle de PHP

angryTom
angryTomavant
2019-10-15 11:20:132021parcourir

Récemment, je travaillais sur un projet qui nécessitait l'utilisation de PHP asynchrone. Lorsque je parcourais le code source de PHP, j'ai trouvé trois modules inutilisés, sysvsem, sysvshm et sysvmsg. Après quelques recherches, j'en ai beaucoup bénéficié.

Il existe une famille de fonctions en PHP, qui sont des packages de la famille de fonctions V IPC d'UNIX.

Ils sont rarement utilisés, mais ils sont puissants. Les utiliser judicieusement peut vous permettre d’obtenir deux fois le résultat avec la moitié de l’effort.

Ils comprennent :

Sémaphores

Mémoire partagée

Messagerie inter-processus ( IPC)

Sur cette base, il nous est tout à fait possible d'empaqueter PHP dans un système piloté par messages.

Mais, d'abord, nous devons introduire quelques bases importantes :

1. ftok

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

2. Ticks vient de PHP 4.0. Il n'a été ajouté à PHP qu'au début de 3. C'est un événement qui se produit chaque fois que l'interpréteur exécute N instructions de bas niveau dans le segment de code de déclaration. La valeur de N est spécifiée avec ticks=N dans la partie directive de declare.

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

Ceci est fondamentalement équivalent à :

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

message Je vais maintenant utiliser un exemple pour illustrer comment implémenter la communication par message PHP avec Ticks.

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

Dans cet exemple, ajoutez d'abord notre processus d'exécution PHP à une file d'attente de messages obtenue par la clé générée par ftok.

Ensuite, via Ticks, interrogez la file d'attente des messages une fois toutes les deux instructions.

Ensuite l'envoi du message est simulé.

Accédez à ce script dans le navigateur, et le résultat est le suivant :

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

En voyant cela, tout le monde a déjà une idée sur la façon de simuler PHP en tant que pilote d'événement ? Ne vous inquiétez pas, nous continuerons à nous améliorer.

3. Sémaphore

Tout le monde devrait être familier avec le concept de sémaphore. Grâce aux sémaphores, la communication de processus, la compétition, etc. peuvent être réalisées. Je ne rentrerai pas dans les détails, mais listerai simplement l’ensemble des fonctions sémaphores fournies en PHP.

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

Pour des informations spécifiques, vous pouvez lire le manuel PHP.

4. Partage de mémoire

PHP sysvshm fournit une solution de partage de mémoire : sysvshm, qui est dans la même série que sysvsem et sysvmsg, mais ici, je ne l'ai pas utilisé, j'ai utilisé The shmop série de fonctions, combinées avec 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);
 
?>

, exécutez cet exemple et actualisez en continu. Nous pouvons voir que l'index augmente.

La simple utilisation de ce shmop peut compléter les fonctions de partage de données entre les scripts PHP : ainsi que la mise en cache, le comptage, etc.

Pour plus de connaissances sur PHP, veuillez visiter le

Site Web PHP chinois

 !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer

Articles Liés

Voir plus