PHP realiza código de código, lo que significa que una cosa se hace tras otra.Esto puede ser problemático cuando tiene que procesar mucho en una sola sesión o si confía en las llamadas a API externas.En este artículo, le mostraré cómo usar PHP Asincron en WordPress para resolver este problema.No es inusual que un servidor se configure con un límite de tiempo de espera de 30 segundos para cada demanda, lo que limita el tiempo que cada sesión tiene que hacer su trabajo.Por supuesto, si se requiere este procesamiento para completar una solicitud de front-end, el usuario final permanecerá durante 30 segundos.
Recientemente tuve una situación en la que los requisitos que tuve que abordar no se pudieron resolver en una solicitud. Para esto, mi cliente usó un formulario de cliente potencial para activar tres solicitudes de API externas, una de las cuales era un servicio lento e incierto. Además, querían llevar al visitante del sitio a la página de gratitud lo antes posible. Debido a que sabía que tenía que esperar la solicitud de API, era una página de Acción de Gracias que dura 20 segundos para cargar o un tiempo de espera. Debido a que la falta de confiabilidad de la API remota hizo necesario guardar los datos en WordPress, de modo que pudiera devolverse si es necesario y registrar el estado de las solicitudes de la API, la cantidad requerida de trabajo no podría realizarse en 30 segundos. sesión. Además, no había forma de guardar los datos, hacer solicitudes, actualizar el estado de esas solicitudes y luego redirigir al usuario a la página de gratitud antes de que se sienta frustrado por el tiempo de carga lento. La respuesta fue guardar los datos, programar tareas con un administrador de actividades asíncrono y luego redirigir al usuario. Luego, cada una de las tres solicitudes de API se ejecutaría en su propia sesión individual, tendrá sus propios 30 segundos para completar y no afectará la experiencia del usuario. Probablemente podría haber movido y guardado los datos en una tarea asíncrona, pero no era necesario.
Existen varias actividades asíncronas especialmente diseñadas para WordPress, pero una de las mejores y más fáciles de usar es WP-Async-Task, un gerente de actividades desarrollado y desarrollado de 10UP. Cómo funciona para usar WP-Async-Task, debe usar un gancho de acción. Esto podría ser con un gancho en el núcleo, otro complemento o por do_action (). Normalmente, se conectaría directamente a ese gancho para hacer un proceso, en serie, cuando ese gancho ocurra. Con WP-Async, el procesamiento en ese gancho se pospone para una sesión posterior. De hecho, es bastante simple de hacer. Necesitamos un gancho, una clase con una propiedad y dos métodos para instantarse en esa clase. Y luego tenemos que aferrarnos a un gancho generado por ese gancho. El administrador de actividades hace una nueva solicitud de publicación a WordPress y luego envía datos del gancho original a su nuevo gancho en la segunda sesión, que no es algo que pueda hacer normalmente. Problema: todo a la vez o nada en la siguiente sección, lo haré. guiarte a través de la prueba. Pero primero, veamos el tipo de código que modificamos para trabajar con él: add_action (‘rescue_post’, ‘josh_send_to_api’);
Función josh_send_to_api ($ id) {
$ Thing = get_post_meta ($ id, ‘something’, true);
$ r = wp_safe_remote_post (add_query_arg (‘id, $ thing,’ http://apiexample.com/ ‘));
If (! Is_wp_error ($ r)) {
$ body = json_decode (wp_remote_retirve_body ($ r)));
if (isset ($ body-> key)) {
update_post_meta ($ id, ‘api_response’, $ body-> key);
} de lo contrario {
update_post_meta ($ id, ‘api_response’, ‘none’);
}
}
}
El problema con este código es que el proceso de guardar una publicación se completará hasta que se complete la solicitud a la API remota. Si la solicitud a la API remota lleva más tiempo que el vencimiento del servidor, entonces no se completará. Guardar la publicación, enviar los datos a la API remota y registrar el resultado como meta post no debe ser un proceso discreto. En cambio, podemos permitir que la publicación se guarde normalmente y luego, en una segunda sesión de PHP, recupere esos datos y registre la respuesta como meta post. Configurar el uso de una tarea WP-Async es bastante simple, porque todas las tareas pesadas son administradas por la biblioteca misma. La implementación de la biblioteca requiere una clase que extienda la clase wp_async_task y haga tres cosas simples. Esta clase debe tener una acción de propiedad protegida, que es el nombre de la acción que usa esta tarea asíncrona. En este caso, será “Rescue_Post”. Debo recordar que, por mi experiencia, descubrí que conectar más tareas a un gancho no es confiable. En cambio, creé tres ganchos que se ejecutan uno tras otro y uso uno para cada una de mis tres solicitudes de API.
Para mantener las cosas simples, se quedemos en “Save_Post”. Comencemos la clase con esto: la clase Josh_Task expande wp_async_task {
/**

* Acción para usar para activar esta tarea
*
* @Var String
*/
protegido $ action = ‘rescue_post’;
} Lo siguiente que necesitamos es un método protegido llamado “prepare_data”, que usaremos para preparar los datos. Es importante saber sobre este método es que se ejecuta durante la sesión que desencadena la carga asíncrona, no la que la procesa. Es importante recordar esto, porque todos los globales y superglobales en la sesión actual están disponibles para usted como datos que se transmitirán a la próxima sesión. Este método recibirá una serie de datos que contienen todos los parámetros de gancho. Si usa un gancho que expone tres parámetros, el primero estará en la tecla cero, la segunda en la clave y así sucesivamente. En este ejemplo, solo tenemos que tomar el primer parámetro en save_post y publicar ID y enviarlo a la siguiente sesión. El método de preparación ha formado los datos post para la sesión que ejecuta la carga asíncrona. Lo que queramos en esa sesión debe devolverse a la preparación_data o almacenarse en la base de datos. Aquí está la clase actualizada para enviar la ID de publicación: la clase Josh_task extiende wp_async_task {
/**
* Acción para usar para activar esta tarea
*
* @Var String
*/
protegido $ action = ‘rescue_post’;
/**
* Prepare los datos de la publicación para enviarlos a la sesión procesando la tarea
*
* @param array $ data params de gancho
*
* @return matrix
*/
Función protegida prepare_data ($ data) {
Devuelve matriz (
‘post_id’ => $ data [0]
);
}
}
El tercer y último método de esta clase, “run_action” es una función protegida que se usa para ejecutar el embarazo. Este método se ejecuta en una sesión diferente de la preparación_data. Como resultado, dentro de él, debe usar la publicación superglobal para tomar los datos que necesita para ejecutar la carga. Afortunadamente, los datos de la publicación son los configurados en la preparación_data. En este método, validamos ese post_id en la publicación y se establece y es un entero y, de ser así, lo usamos para activar otra acción. Los autores wp-async-task sugieren el uso de wp_async_ as prefix.class josh_task extiende wp_async_task {
/**
* Acción para usar para activar esta tarea
*
* @Var String
*/
protegido $ action = ‘rescue_post’;
/**
* Prepare los datos de la publicación para enviarlos a la sesión procesando la tarea
*
* @param array $ data params de gancho
*
* @return matrix
*/
Función protegida prepare_data ($ data) {
Devuelve matriz (
‘post_id’ => $ data [0]
);
}
/**
* Enrolle la carga asincrónica
*
* Send_to_pi llamadas ()
*/
Run_action () función protegida {
if (isset ($ _post [‘post_id’]) && 0 acción”, $ _post [‘post_id’], get_post ($ _post [‘post_id’));
}
}
}
Conéctelo ahora que la clase está en su lugar, podemos reunir todo esto en algunos pasos simples. El primer paso está en Plugins_Loaded o más tarde para cortejar la clase. Obviamente, la biblioteca WP-Async-Task debe estar presente e incluida antes de este punto. Recomiendo instalarlo a través del compositor. También puede instalarlo como un complemento, lo cual creo que es una muy mala idea, porque los complementos pueden desactivarse. Lo segundo que debemos hacer es conectar nuestra nueva acción, que se activa dentro de la clase, a nuestra llamada original. Así es como se ve: add_action (‘wp_async_save_post’, ‘josh_send_to_api’);
Función josh_send_to_api ($ id) {
$ Thing = get_post_meta ($ id, ‘something’, true);
$ r = wp_safe_remote_post (add_query_arg (‘id, $ thing,’ http://apiexample.com/ ‘));
If (! Is_wp_error ($ r)) {
$ body = json_decode (wp_remote_retirve_body ($ r)));
if (isset ($ body-> key)) {
update_post_meta ($ id, ‘api_response’, $ body-> key);
} de lo contrario {
update_post_meta ($ id, ‘api_response’, ‘none’);
}
}
} Assocron Espero que este artículo lo ayude a comprender por qué es posible que necesite usar PHP de manera asincrónica. Con el ejemplo práctico, ahora debe comprender cómo hacerlo utilizando un sitio regular de WordPress. Es importante humedecer los pies con PHP asincrónico, incluso si se utilizan dos sesiones asíncronas de PHP, ya que PHP7 admitirá Php Asincron.
Cómo usar PHP Asincron en WordPress
Tags Cómo usar PHP Asincron en WordPress
homefinance blog