


Comment utiliser pcntl et libevent en PHP pour implémenter la fonction Timer
La fonction Timer est implémentée en PHP, et le multi-threading PHP est utilisé au milieu. Cet article donne une explication de pcntl.
PHP utilise pcntl et libevent pour implémenter la fonction Timer. Regardons d'abord l'exemple pcntl (thread PHP) expliqué ci-dessous.
<?php function newChild($func_name) { echo "enter newChild\n"; $args = func_get_args(); unset($args[0]); $pid = pcntl_fork(); if ($pid == 0) { function_exists($func_name) and exit(call_user_func_array($func_name, $args)) or exit(-1); } else if($pid == -1) { echo "Couldn't create child process"; } else { return $pid; } } (PS:^_^不错的php开发交流群:256271784,验证:csl,有兴趣的话可以加入进来一起讨论) function on_timer() { echo "timer called\n"; } /** * @param $func string, function name * @param $timeouts int, microtimes for time delay */ function timer($func, $timeouts){ echo "enter timer\n"; $base = event_base_new(); $event = event_new(); event_set($event, 0, EV_TIMEOUT, $func); event_base_set($event, $base); event_add($event, $timeouts); event_base_loop($base); } $pid = newChild("timer", "on_timer", 5000000); if ($pid > 0) { echo "master process exit\n"; }
PHP étend pcntl pour implémenter le "multi-threading" (processus)
pcntl et ticks
les ticks sont définis via la syntaxe declare(ticks = n) {statement} La syntaxe de déclaration ne peut actuellement accepter que. ticks. La signification de ticks = n qu'il a défini est que lorsque N instructions de bas niveau sont exécutées dans le bloc d'instructions spécifié par declare, cet événement peut être enregistré via register_tick_function($function_name).
Le mécanisme de signal. de pcntl est basé sur le mécanisme ticks implémenté. Par conséquent, lorsque nous utilisons des fonctions liées au signal dans la famille de fonctions pcntl, nous devons ajouter la structure syntaxique declare(ticks = n) devant.
int pcntl_alarm(int $ secondes):
$secondes secondes processus en arrière Envoyez un signal SIGALRM, et chaque appel à la méthode pcntl_alarm annulera l'horloge précédemment définie.
void pcntl_exec(string $path[, array $args[, array $env] ]):
Exécuter un programme dans l'espace de processus actuel.
$path : doit être un fichier exécutable binaire ou un chemin de fichier de script avec des informations d'en-tête de script valides (#!/usr/local/bin/php) .
$args : Caractères à passer au programme Liste des paramètres String (forme tableau)
$envs : variable d'environnement. Passer à la variable d'environnement du programme à exécuter sous forme de tableau (clé => formulaire de valeur).
int pcntl_for k (void):
Créer un processus enfant, qui est différent du processus parent uniquement en PID (numéro de processus) et PPID (numéro de processus parent
Renvoie le créé). pid du processus enfant lorsque le thread parent s'exécute et renvoie 0 lorsque le thread enfant s'exécute. Créer Lorsque le processus enfant échoue, -1 sera renvoyé dans le contexte du processus parent et une erreur php sera déclenchée
Pour comprendre le fork. ici, vous devez savoir : pcntl_fork crée un nœud de branche, ce qui équivaut à une marque. Une fois le processus parent terminé, le processus enfant démarrera à partir de l'exécution se poursuit à la marque, ce qui signifie que le code après pcntl_fork est exécuté deux fois par le processus parent et le processus enfant respectivement, et les valeurs de retour obtenues par les deux processus lors de l'exécution sont différentes, par conséquent, les processus parent et enfant peuvent être séparés pour exécuter des codes différents .
int pcntl_getpriority([int $. pid = getmypid()[, int $process_identifier = PRIO_PROCESS]]) :
Obtenir la priorité du processus correspondant au $pid donné La valeur par défaut est obtenue via getmypid() La valeur est le processus actuel. $pid : S'il n'est pas spécifié, la valeur par défaut est le processus actuel.
$process_identifier : L'un des PRIO_PGRP, PRIO_USER, PRIO_PROCESS, la valeur par défaut est PRIO_PROCESS Parmi eux, PRIO_PGRP fait référence à la priorité d'obtention du groupe de processus, PRIO_USER fait référence à. obtenir la priorité du processus utilisateur, PRIO_PROCESS fait référence à l'obtention de la priorité d'un processus spécifique.
Renvoie la priorité du processus, ou renvoie false lorsqu'une erreur se produit. Plus la valeur est petite, plus la priorité est élevée
bool. pcntl_setpriority(int $priority[ , int $pid = getmypid()[, int $process_identifier = PRIO_PROCESS]] :
Définissez la priorité du processus.
$priority : valeur de priorité, comprise entre -20 et 20, la priorité par défaut est 0 . Plus la valeur est petite, plus la priorité est élevée
$pid : S'il n'est pas spécifié, il fait référence au processus actuel
$process_identifier : La signification est la même que celle de pcntl_getpriority. .
Renvoie TRUE si le réglage réussit, et FALSE s'il échoue
bool pcntl_signal_dispatch(void):
Appelez le gestionnaire du signal à venir installé via pcntl_signal().
L'appel renvoie TRUE. en cas de succès, false en cas d'échec.
php 5.3.3 ajouté
bool pcntl_signal(int $signo, callback $handler[, bool $restart_syscalls = true]):
Installer un nouveau gestionnaire de signal $handler pour le signal spécifié $signo.
Le dernier paramètre n'a aucune signification.
bool pcntl_sigprocmask (int $how, array $set[, array &$oldset]) :
Ajouter, supprimer ou définir le signal de verrouillage, le le comportement spécifique dépend du paramètre $how
$how : SIG_BLOCK est utilisé pour ajouter le signal au signal de verrouillage actuel. Parmi les signaux de verrouillage actuels, SIG_UNBLOCK est utilisé pour supprimer le signal du signal de verrouillage actuel et SIG_SETMASK est utilisé pour remplacer le verrouillage actuel. signal avec une liste de signaux donnée.
$set : Une liste de signaux à ajouter, supprimer ou définir.
$oldset : utilisé pour renvoyer l'ancien signal de verrouillage à l'appelant.
Renvoie TRUE en cas de succès, FAUX en cas d'échec.
int pcntl_sigtimedwait(array $set[, array &$siginfo[, int $seconds = 0[, int $nanoseconds = 0]]]):
pcntl_sigtimedwait fait en fait la même chose que pcntl_sigwaitinfo( ), mais pcntl_sigtimedwait a deux paramètres améliorés supplémentaires $seconds et $nanoseconds, ce qui permet au script de rester plus longtemps. Il y a une limite supérieure au lieu d'une attente illimitée
$set : liste des signaux qui doivent être attendus
. $siginfo : Utilisé pour renvoyer des informations à l'appelant sur les signaux à attendre. Pour le contenu des informations, voir pcntl_sigwaitinfo
$seconds : Timeout Le nombre de secondes
$nanoseconds : Le nombre de nanosecondes pour le timeout
. Après succès, pcntl_sigtimedwiat() renvoie le numéro de signal
int pcntl_sigwaitinfo(array $set[, array &$siginfo]) :
Pending current Le script est exécuté jusqu'à ce qu'un signal dans $set soit reçu si l'un des. les signaux sont sur le point d'arriver (comme être verrouillé par pcntl_sigprocmask), alors pcntl_sigwaitinfo retournera immédiatement
$set : liste des signaux en attente
$siginfo : Utilisé pour renvoyer à l'appelant les informations du signal qui l'attend. Les informations comprennent le contenu suivant :
1. Tous les signaux ont les trois informations suivantes :
a) signo : numéro de signal
b) errno : numéro d'erreur
c) code : code du signal
2. Informations spécifiques au signal SIGCHLD
a) statut : valeur ou signal de sortie
b) utime : temps de consommation de l'utilisateur
c) stime : temps de consommation du système
d) pid : identifiant du processus d'envoi
e) uid : identifiant utilisateur réel du processus d'envoi
3 Informations appartenant à SIGILL, SIGFPE, SIGSEGV, SIGBUS
a) addr : emplacement mémoire où le défaut s'est produit4. Informations uniques SIGPOLL :
a) band : événement de bande, signifiant inconnu
b) fd : descripteur de fichier
La fonction s'exécute avec succès et renvoie le numéro de signal
int pcntl_wait(int &$status [ , int *options = 0]):
Suspendez le processus en cours jusqu'à ce qu'un processus enfant se termine ou jusqu'à ce qu'un signal nécessite la fin du processus en cours ou qu'une fonction de gestion du signal soit appelée si le processus enfant s'est terminé lorsqu'il est appelé (. communément appelé processus zombie), cette fonction reviendra immédiatement et toutes les ressources système seront libérées
$status est utilisé pour enregistrer les informations d'état du processus enfant, qui sont générées par les fonctions suivantes : pcntl_wifexited, pcntl_wifstopped. , pcntl_wifsignaled, pcntl_wexitstatus, pcntl_wtermsig, pcntl_wstopsig .
$options : Si votre système autorise wait3 (la plupart des systèmes de type BSD), vous pouvez fournir un paramètre d'options facultatif. Si ce paramètre n'est pas fourni, wait utilisera l'appel système. Si le système n'autorise pas wait3 , à condition que ce paramètre n'ait aucun effet, la valeur de $options peut être 0 ou les deux constantes WNOHANG et WUNTRACED
La fonction renvoie le PID du processus enfant sortant, ou -1 en cas d'erreur. , ou si WNOHANG est fourni en option (wait3 système indisponible) et qu'il n'y a pas de processus enfant valide, renvoie 0
Processus zombie : étant donné que le processus parent est après fork, il est impossible de prédire quand le processus enfant se terminera, donc dans Afin de laisser certaines informations au processus parent, le processus enfant partira. La structure de données suivante appelée zombie attend une opération d'attente initiée par le processus parent pour récupérer son cadavre. Le processus enfant est appelé processus zombie pendant la période entre les deux. fin du processus enfant (fin logique) et récupération de son cadavre par le processus parent. Après la fin, tous les processus enfants seront remis à Init. Par conséquent, si le processus parent se termine, les processus zombies seront recyclés. , si le processus parent ne se termine jamais, ces processus zombies occuperont toujours le numéro de processus. Si le numéro de processus système est épuisé, cela entraînera l'impossibilité de démarrer un nouveau processus. Par conséquent, le moyen le plus sûr est de le faire. collecter les cadavres des processus enfants générés par lui-même dans le processus parent.
int pcntl_waitpid(int $pid, int &$status[, int $options = 0 ]):
Suspendre le processus en cours jusqu'à ce que le processus enfant avec le $pid donné se termine, ou le processus actuel reçoit un signal de sortie, ou reçoit un signal ige pour appeler un gestionnaire de signal.
Si $pid est donné Le processus enfant correspondant s'est terminé (état zombie) lors de l'appel de cette fonction, la fonction revient immédiatement et toutes les ressources système sont libérées.
$pid : le numéro de processus, inférieur à -1 indique qu'il attend tout processus enfant dans le groupe de processus, le numéro du groupe de processus est la valeur absolue de $pid. . Égal à -1 signifie attendre n'importe quelle Cité interdite, cohérent avec le comportement de la fonction pcntl_wait. Égal à 0 signifie attendre un processus enfant dans le même groupe que le processus appelant, et supérieur à 0 signifie qu'il s'agit d'un processus spécifique.
$status : utilisé pour renvoyer l'état du processus enfant à partir de la fonction. Ces informations d'état sont générées par les fonctions suivantes : pcntl_wifexited, pcntl_wifstopped, pcntl_wifsignaled, pcntl_wexitstatus, pcntl_wtermsig, pcntl_wstopsig.
$options : a la même signification que $options
int pcntl_wexitstat us (int $status) de pcntl_wait :
Renvoie le code de retour d'un processus enfant interrompu. Cette fonction n'est utile que lorsque la fonction pcntl_wifexited renvoie TRUE.
Le paramètre $status est les informations d'état générées. par pcntl_waitpid.
bool pcntl_wifexited(int $status):
Vérifiez si l'état donné indique que le processus enfant s'est terminé normalement.
bool pcntl_wifsignaled(int $status):
Vérifiez si l'état donné indique que le processus enfant s'est arrêté suite à la réception d'un certain signal.
bool pcntl_wifstopped(int $status):
Vérifiez si $status peut indiquer que le processus enfant est actuellement arrêté. Cette fonction génère uniquement $status lorsqu'elle agit sur WUNTRACED. utilisé par la fonction pcntl_waitpid comme valeur du paramètre $options. Il est uniquement valide.
int pcntl_wstopsig(int $status):
Renvoie le numéro du signal qui arrête le processus enfant en analysant $status. La fonction n'est valide que lorsque pcntl_wifsignaled renvoie VRAI.
int pcntl_wtermsig(int $status):
Renvoie le numéro de signal qui interrompt le processus. Cette fonction n'est valide que lorsque pcntl_wifsignaled renvoie VRAI.
Analyse des différences entre ceil, floor, round, intval des fonctions d'arrondi PHP
Comment utiliser curl en PHP pour simuler le téléchargement et la réception de fichiers
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!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Vous pouvez vérifier quelles extensions sont utilisées par PHP en affichant le résultat de la fonction phpinfo(), en utilisant les outils de ligne de commande et en vérifiant le fichier de configuration PHP. 1. Affichez le résultat de la fonction phpinfo(), créez un script PHP simple, enregistrez ce script sous phpinfo.php et téléchargez-le sur votre serveur Web. Accédez à ce fichier dans le navigateur et utilisez la fonction de recherche du navigateur. Recherchez simplement le mot-clé. "extension" ou "extension_loaded" dans la page pour trouver des informations sur l'extension.

Comment utiliser PHP pour étendre PDO afin de se connecter à la base de données Oracle Introduction : PHP est un langage de programmation côté serveur très populaire et Oracle est un système de gestion de base de données relationnelle couramment utilisé. Cet article explique comment utiliser l'extension PHP PDO (PHPDataObjects) pour se connecter à la base de données Oracle. 1. Installez l'extension PDO_OCI. Pour vous connecter à la base de données Oracle, vous devez d'abord installer l'extension PDO_OCI. Voici les étapes pour installer l'extension PDO_OCI : Assurez-vous

Comment utiliser PHP pour étendre la fonction de génération de rapports de SuiteCRM SuiteCRM est un puissant système CRM open source qui fournit de riches fonctions pour aider les entreprises à gérer les relations clients. L'une des fonctions importantes est la génération de rapports. L'utilisation de rapports peut aider les entreprises à mieux comprendre leur situation commerciale et à prendre les bonnes décisions. Cet article expliquera comment utiliser PHP pour étendre la fonction de génération de rapports de SuiteCRM et fournira des exemples de code pertinents. Avant de commencer, vous devez vous assurer que SuiteCRM est installé.

Lors du développement avec PHP, nous devrons peut-être utiliser certaines extensions PHP. Ces extensions peuvent nous fournir plus de fonctions et d'outils, rendant notre travail de développement plus efficace et plus pratique. Mais avant d’utiliser ces extensions, nous devons d’abord les installer. Cet article vous expliquera comment installer les extensions PHP. 1. Qu'est-ce qu'une extension PHP ? Les extensions PHP font référence à des composants qui fournissent des fonctionnalités et des services supplémentaires au langage de programmation PHP. Ces composants peuvent être installés et utilisés via le mécanisme d'extension de PHP. L'extension PHP peut nous aider avec

PHP est un langage de script côté serveur populaire capable de gérer le contenu dynamique des pages Web. L'extension geoip pour PHP vous permet d'obtenir des informations sur la localisation de l'utilisateur en PHP. Dans cet article, nous verrons comment utiliser l’extension geoip de PHP. Qu'est-ce que l'extension GeoIP pour PHP ? L'extension geoip pour PHP est une extension gratuite et open source qui vous permet d'obtenir des données sur les adresses IP et les informations de localisation. Cette extension peut être utilisée avec la base de données GeoIP, une base de données développée par MaxMin

Pagoda Panel est un panneau de gestion de serveur open source tout en fournissant aux opérateurs de sites Web une gestion pratique de sites Web, de bases de données, de certificats SSL et d'autres services, il fournit également de puissantes fonctions d'extension PHP et de gestion de versions PHP, ce qui facilite la gestion du serveur. efficace. 1. Extension PHP L'extension PHP est un module utilisé pour améliorer les fonctions PHP. En installant des extensions PHP, davantage de fonctions et de services peuvent être implémentés, tels que : accélérateur : l'accélérateur peut améliorer considérablement les performances de PHP et réduire la charge du service en mettant en cache les scripts PHP.

Erreurs courantes et solutions en cas d'échec de fork dans PHPPCNTL Lorsque vous utilisez l'extension PHPPCNTL pour la gestion des processus, vous rencontrez souvent le problème de l'échec de fork. Fork est une méthode de création d'un processus enfant. Dans certains cas, l'opération fork peut échouer en raison de certaines erreurs. Cet article présentera quelques erreurs courantes de défaillance de fork et les solutions correspondantes, et fournira des exemples de code spécifiques pour aider les lecteurs à mieux comprendre et gérer ces problèmes. 1. Message d'erreur possible en cas de mémoire insuffisante : Can

Le développement d'extensions PHP est l'art de créer des fonctionnalités personnalisées, d'étendre les fonctionnalités de base de PHP et de créer des applications plus puissantes. Il ouvre de nouvelles possibilités dans le monde PHP, permettant aux développeurs de transcender les limitations fondamentales du langage. Cet article vous fera découvrir le développement d'extensions PHP, vous fournissant des connaissances complètes et des conseils pratiques, des concepts de base aux techniques avancées. Bases du développement d'extensions PHP Avant de commencer le développement d'extensions PHP, vous devez comprendre certains concepts de base. Que sont les extensions PHP ? Une extension PHP est une bibliothèque de liens dynamiques (DLL) qui étend les fonctionnalités de base de PHP et fournit de nouveaux types de données, fonctions et classes. Avantages des extensions PHP Les extensions PHP présentent de nombreux avantages, notamment : l'évolutivité, la flexibilité, l'optimisation des performances et la réutilisation du code. PHP
