Comment utiliser asynchrone PHP dans WordPress
Php exécute le Code en série, ce qui signifie qu’il fonctionne pièce par pièce. Cela peut poser des problèmes lorsque vous avez besoin d’effectuer beaucoup de traitement dans une session ou que vous dépendez d’un appel à une API externe. Dans cet article, je vais vous montrer comment résoudre ce problème en utilisant asynchrone PHP dans WordPress. Il n’est pas rare que le serveur configure une limite de temps d’arrêt de 30 secondes pour chaque requête, ce qui limite le temps qu’il faut à chaque session pour terminer son travail. Bien entendu, si ce traitement est nécessaire pour compléter la demande initiale, il est peu probable que l’utilisateur final reste 30 secondes.
Récemment, j’a i rencontré une situation où les besoins auxquels je dois faire face ne peuvent pas être gérés dans une seule demande. À cette fin, mon client a utilisé le module Lead pour activer trois demandes d’api externes, dont une pour des services lents et peu fiables. De plus, ils veulent que les visiteurs du site aient accès à la page de remerciement le plus rapidement possible. Parce que je sais que je dois attendre une demande d’API, il y aura une page de remerciement qui prendra 20 secondes pour charger ou expirer. En raison du manque de fiabilité de l’api distante, il est nécessaire de sauvegarder les données dans wordpress pour rediriger et enregistrer l’état des demandes d’api si nécessaire, de sorte que la charge de travail requise ne peut pas être réalisée en 30 secondes. De plus, il n’est pas possible d’enregistrer les données, de faire des demandes, de mettre à jour l’état de ces demandes et de rediriger l’utilisateur vers la page de remerciement tant que l’utilisateur n’est pas frustré par la lenteur du chargement de la page. La réponse est d’enregistrer les données, d’utiliser asynchrone Task Manager pour programmer les tâches, puis de rediriger l’utilisateur. Ensuite, chacune des trois requêtes API s’exécutera dans sa session respective et aura ses propres 30 secondes pour compl éter
Et n’affecte pas l’expérience utilisateur. Je peux également déplacer les données sauvegardées vers une tâche asynchrone, mais ce n’est pas nécessaire.
Plusieurs gestionnaires de tâches asynchrones sont spécialement conçus pour WordPress, mais le meilleur et le plus facile à utiliser est WP async Task, un gestionnaire de tâches open source développé par techcrunch et développé par 10up. Pour utiliser les tâches asynchrones WP, vous devez utiliser des crochets d’action. Cela peut se faire par crochet dans le noyau, par un autre plug – in, ou par do _ action (). Habituellement, lorsque le crochet apparaît, vous vous connectez directement au crochet pour effectuer un certain processus de concaténation. Avec WP async, le traitement sur ce crochet sera reporté à une session ultérieure. C’est très simple. Nous avons besoin d’un crochet, une classe avec une propriété et deux méthodes pour instancier la classe. Ensuite, nous devons accrocher le crochet généré par ce crochet. Le gestionnaire de tâches envoie une nouvelle demande post à WordPress et transmet ensuite les données du crochet original au nouveau crochet lors de la deuxième session, ce qui n’est généralement pas possible.
Question: Faites – le une fois ou ne faites rien. Dans la section suivante, je vous guiderai tout au long du processus. Mais d’abord, regardons le type de code que nous allons Modifier pour gérer cette opération: ajouter _ action (‘Save post’, ‘Josh send to API’);
Fonction Josh _ send to API ($ID) {
$what = get _ post Meta ($ID, \
$r = WP _ Safe Remote Post (ADD Query Arg (‘id’, $thing, ‘ http:\/\/apiexample.com\/ (‘)
Si (! Is _ WP Error ($r)
$Body = json \ u decode (wp \ u Remote \ u retirve \ u Body ($r));
Si (isset ($Body – > Key)
Mettre à jour _ post Meta ($ID, ‘API Response’, $Body – > Key);
Autres
Mettre à jour _ post Meta ($ID, ‘API Response,’ none ‘);
}
}
}
Le problème avec ce code est que le processus d’enregistrement des messages ne peut être terminé qu’une fois la demande à l’API distante terminée. Je vois.
La demande d’api distante prend plus de temps que le temps d’arrêt du serveur et ne peut pas être remplie. L’enregistrement des messages, l’envoi de données à l’API distante et l’enregistrement des résultats en tant que métamessages ne devraient pas être un processus prudent. Au lieu de cela, nous pouvons laisser le post enregistrer correctement, puis récupérer les données dans la deuxième session PHP et enregistrer la réponse comme méta – post. Il est très facile de le configurer en utilisant les tâches asynchrones WP, car tout le travail lourd est géré par la Bibliothèque elle – même. L’implémentation de cette bibliothèque nécessite une classe qui étend la classe de tâches WP _ async et fait trois choses simples.
Cette classe doit avoir une action de propriété protégée qui est le nom de l’action utilisée par cette tâche asynchrone. Dans ce cas, ce sera \
\/ * *
Action utilisée pour activer cette activité
* *
Chaîne variable
* \/
$action protégée = \
} ensuite, nous avons besoin d’une méthode de sécurité appelée \
Cette méthode passe un tableau de données contenant tous les paramètres du crochet. Si vous utilisez un crochet qui expose trois paramètres, le premier paramètre sera dans la clé 0, le second dans la clé 1, et ainsi de suite. Dans ce cas, nous avons juste besoin
Enregistrer _ Post le premier paramètre et l’ID du poste et l’envoyer à la session suivante. La méthode prepare _ Data forme les données post pour les sessions qui exécutent des tâches asynchrones. Tout le contenu requis pour cette session doit être retourné ou stocké dans la base de données prepare _ date. Voici les classes de mise à jour pour envoyer l’ID du message:
La classe Josh _ Task étend WP async Task {
\/ * *
Action utilisée pour activer cette activité
* *
Chaîne variable
* \/
$action protégée = \
\/ * *
Préparer les données post à envoyer à la session qui traite la tâche
* *
@ Param Array $Data Parameters from Hook
* *
Retourner le tableau
* \/
Fonction protégée prepare _ Data ($Data) {
Matrice de retour
« post _ id» = > $data [0]
);
}
} la troisième et dernière méthode de cette classe, run _ action, est une fonction protégée qui est utilisée pour exécuter une tâche. Cette méthode fonctionne dans une session autre que prepare _ date. Par conséquent, vous devez utiliser un post super global pour récupérer les données nécessaires à l’exécution de la tâche. Heureusement, les données post sont définies dans prepare _ data.
Dans cette méthode, nous validons le post _ ID dans le post et le définissons comme un entier, auquel cas nous l’utilisons pour activer une autre opération. Les auteurs de la tâche WP async recommandent d’utiliser WP _ async 3 comme préfixe. La classe Josh _ Task étend WP async Task {
\/ * *
Action utilisée pour activer cette activité
* *
Chaîne variable
* \/
$action protégée = \
\/ * *
Préparer les données post à envoyer à la session qui traite la tâche
* *
@ Param Array $Data Parameters from Hook
* *
Retourner le tableau
* \/
Fonction protégée prepare _ Data ($Data) {
Matrice de retour
« post _ id» = > $data [0]
);
}
\/ * *
Exécuter des tâches asynchrones
* *
Appelez send _ to API ()
* \/
Fonctions protégées
Run _ operation () {
Si (isset ($u post [‘post _ id’) & & 0 Action \
}
}
}
Maintenant que la classe est en place, nous pouvons tout rassembler en quelques étapes simples. La première étape consiste à créer une instance d’une classe sur un plugins _ chargé ou plus tard. De toute évidence, une bibliothèque de tâches asynchrones WP doit exister et contenir avant cela. Je recommande de l’installer via composer. Vous pouvez également l’installer en tant que plug – in, et je pense que c’est une mauvaise idée parce que les plug – ins peuvent être désactivés. La deuxième chose que nous devons faire est de lier la nouvelle action qui est lancée dans la classe au rappel original. Voici à quoi il ressemble:
Ajouter _ action (‘WP async Save post’, ‘Josh send to API’);
Fonction Josh _ send to API ($ID) {
$what = get _ post Meta ($ID, \
$r = WP _ Safe Remote Post (ADD Query Arg (‘id’, $thing, ‘ http:\/\/apiexample.com\/ (‘)
Si (! Is _ WP Error ($r)
$Body = json \ u decode (wp \ u Remote \ u retirve \ u Body ($r));
Si (isset ($Body – > Key)
Mettre à jour _ post Meta ($ID, ‘API Response’, $Body – > Key);
Autres
Mettre à jour _ post Meta ($ID, ‘API Response,’ none ‘);
}
}
J’espère que cet article vous aidera à comprendre pourquoi vous devez utiliser PHP asynchrone. Avec cet exemple pratique, vous devriez maintenant savoir comment le faire en utilisant le site WordPress normal. Même si PHP asynchrone utilise deux sessions, il est important d’utiliser PHP asynchrone parce que PHP 7 prendra en charge PHP asynchrone.