


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!

Les raisons de la défaillance de la phpsession comprennent les erreurs de configuration, les problèmes de cookies et l'expiration de session. 1. Erreur de configuration: vérifiez et définissez la session correcte.save_path. 2.Cookie Problème: assurez-vous que le cookie est correctement réglé. 3.Session Expire: Ajustez la valeur de session.gc_maxlifetime pour prolonger le temps de session.

Les méthodes pour déboguer les problèmes de session en PHP incluent: 1. Vérifiez si la session est démarrée correctement; 2. Vérifiez la livraison de l'ID de session; 3. Vérifiez le stockage et la lecture des données de session; 4. Vérifiez la configuration du serveur. En sortissant l'ID de session et les données, en affichant le contenu du fichier de session, etc., vous pouvez diagnostiquer et résoudre efficacement les problèmes liés à la session.

Plusieurs appels vers session_start () se traduiront par des messages d'avertissement et d'éventuels remplacements de données. 1) PHP émettra un avertissement, ce qui incite la session à démarrer. 2) Il peut provoquer un écrasement inattendu des données de session. 3) Utilisez session_status () pour vérifier l'état de la session pour éviter les appels répétés.

La configuration du cycle de vie de session dans PHP peut être réalisée en définissant session.gc_maxlifetime et session.cookie_lifetime. 1) Session.gc_maxlifetime contrôle le temps de survie des données de session côté serveur, 2) Session.cookie_lifetime contrôle le cycle de vie des cookies des clients. Lorsqu'il est réglé sur 0, le cookie expire lorsque le navigateur est fermé.

Les principaux avantages de l'utilisation des sessions de stockage de la base de données incluent la persistance, l'évolutivité et la sécurité. 1. Persistance: Même si le serveur redémarre, les données de session peuvent rester inchangées. 2. Évolutivité: applicable aux systèmes distribués, garantissant que les données de session sont synchronisées entre plusieurs serveurs. 3. Sécurité: La base de données fournit un stockage crypté pour protéger les informations sensibles.

L'implémentation de traitement personnalisé de session dans PHP peut être effectué en implémentant l'interface SessionHandlerInterface. Les étapes spécifiques incluent: 1) la création d'une classe qui implémente SessionHandlerInterface, telles que CustomSessionHandler; 2) réécrire des méthodes dans l'interface (telles que l'ouverture, la fermeture, la lecture, l'écriture, la détruire, GC) pour définir le cycle de vie et la méthode de stockage des données de session; 3) Enregistrez un processeur de session personnalisé dans un script PHP et démarrez la session. Cela permet de stocker des données dans des supports tels que MySQL et Redis pour améliorer les performances, la sécurité et l'évolutivité.

SessionID est un mécanisme utilisé dans les applications Web pour suivre l'état de la session utilisateur. 1. Il s'agit d'une chaîne générée aléatoire utilisée pour maintenir les informations d'identité de l'utilisateur lors de plusieurs interactions entre l'utilisateur et le serveur. 2. Le serveur génère et l'envoie au client via des cookies ou des paramètres d'URL pour aider à identifier et à associer ces demandes dans plusieurs demandes de l'utilisateur. 3. La génération utilise généralement des algorithmes aléatoires pour assurer l'unicité et l'imprévisibilité. 4. Dans le développement réel, les bases de données en mémoire telles que Redis peuvent être utilisées pour stocker les données de session pour améliorer les performances et la sécurité.

La gestion des séances dans des environnements sans état tels que les API peut être réalisée en utilisant JWT ou des cookies. 1. JWT convient à l'état sans état et à l'évolutivité, mais il est de grande taille en ce qui concerne les mégadonnées. 2.La cookies est plus traditionnel et facile à mettre en œuvre, mais ils doivent être configurés avec prudence pour assurer la sécurité.


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

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Version Mac de WebStorm
Outils de développement JavaScript utiles

DVWA
Damn Vulnerable Web App (DVWA) est une application Web PHP/MySQL très vulnérable. Ses principaux objectifs sont d'aider les professionnels de la sécurité à tester leurs compétences et leurs outils dans un environnement juridique, d'aider les développeurs Web à mieux comprendre le processus de sécurisation des applications Web et d'aider les enseignants/étudiants à enseigner/apprendre dans un environnement de classe. Application Web sécurité. L'objectif de DVWA est de mettre en pratique certaines des vulnérabilités Web les plus courantes via une interface simple et directe, avec différents degrés de difficulté. Veuillez noter que ce logiciel

SublimeText3 version anglaise
Recommandé : version Win, prend en charge les invites de code !

Version crackée d'EditPlus en chinois
Petite taille, coloration syntaxique, ne prend pas en charge la fonction d'invite de code

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