Maison > Article > développement back-end > Ce que vous ne savez peut-être pas sur PHP : la conception événementielle de PHP
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 :
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");
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");
$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);
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
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
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); ?>
, 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 chinoisCe 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!