Maison > Article > développement back-end > Que faire si le verrouillage du fichier PHP est bloqué
Qu'est-ce qu'une impasse ?
Tous ceux qui ont étudié les systèmes d'exploitation connaissent le concept de multi-threading. L'accès aux ressources publiques dans plusieurs threads nécessite le verrouillage des ressources. Une fois l'accès terminé, relâchez le verrou. Si le verrou n'est pas libéré, le thread suivant ne pourra jamais acquérir le verrou de ressource lorsqu'il s'agira d'acquérir la ressource, le thread est donc dans une impasse. Alors CGI est-il une impasse causée par l’accès multithread aux ressources publiques ? La réponse est NON.
1. CGI est un processus monothread et peut être vu via ps. (Le statut du processus Sl est un processus multithread).
2. Même s'il est multithread, le blocage se produit lorsque la fonction time de la glibc est appelée pendant le processus d'arrêt de PHP, et n'est pas provoqué par le module PHP . Les fonctions liées au temps dans la glibc sont thread-safe et ne provoqueront pas de blocage.
Quelle est la cause de l'impasse ?
En analysant le mécanisme de blocage sous Linux, nous avons découvert qu'en plus du multi-threading, les fonctions de traitement du signal peuvent également provoquer un blocage. Alors, l’impasse cgi est-elle due à la gestion du signal ? Avant cela, permettez-moi de présenter une réflexion.
Réentrance de fonction et sécurité du signal
La réentrée de fonction signifie que peu importe le nombre de fois que la fonction est saisie, la fonction peut s'exécuter normalement et renvoyer des résultats. Alors, les fonctions thread-safe sont-elles réentrantes ? La réponse est NON. Les fonctions thread-safe acquièrent des verrous globaux lors du premier accès aux ressources publiques. Si la fonction n'a pas été exécutée et que le verrouillage n'a pas été déverrouillé, le processus est interrompu. Ensuite, dans la fonction de gestion des interruptions, accéder à nouveau à la fonction provoquera un blocage.
Alors, à quels types de fonctions peut-on accéder dans la fonction de gestion des interruptions ?
En plus des fonctions qui n'utilisent pas de verrous globaux, certains appels système sécurisés peuvent également être utilisés. L’appel de toute autre fonction non sécurisée aura des conséquences imprévisibles (telles qu’un blocage). Voir le signal de l'homme pour plus de détails. Avant d'analyser les causes du blocage, examinons d'abord le processus d'exécution de cgi et analysons s'il existe une possibilité de blocage.
Flux d'exécution PHP-CGI
La fonction time de la Glibc utilise un verrou global pour assurer la sécurité des threads de la fonction, mais ne garantit pas la sécurité du signal. Après une analyse précédente, nous avons initialement soupçonné que le blocage était dû au fait que le processus PHP-CGI recevait un signal puis exécutait une fonction non sécurisée pour le signal dans le descripteur de signal. Avant que le processus principal ne soit interrompu, il exécute la fonction time dans la glibc. Avant que le verrou acquis par la fonction ne soit libéré, le processus d'interruption est entré. Pendant le processus d'interruption, la fonction temporelle de la glibc est accessible. Cela a abouti à une impasse.
Le processus d'exécution de PHP-CGI est tel qu'illustré dans la figure ci-dessous :
Solution :
Supprimez ou simplifiez la fonction hook enregistrée par qalarm lors de l'arrêt. Évitez les appels de fonctions dangereux.
Le contenu ci-dessus est à titre de référence uniquement !
Tutoriel recommandé : Tutoriel vidéo PHP
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!