web-dev-qa-db-fra.com

exécuter une tâche périodique sans entraver le chargement de la page?

J'ai un plugin qui permet aux utilisateurs de télécharger des pièces jointes via AJAX dans la zone d'administration. J'essaie plus tard de pousser ces fichiers vers DropBox via leur REST API . Cela presque fonctionne. Le problème concerne la tâche WP _configurée qui empêche la page de se chargerjusqu'à ce que Push to DropBox se termine(ce qui peut prendre jusqu'à 30 minutes pour les fichiers plus volumineux). .

J'ai examiné des questions similaires ( ici et ici ), mais cela implique que ces tâches périodiques empêchent effectivement le chargement de la page pendant le déroulement de la tâche.

Est-il possible de le configurer pour que les chargements de page ne soient pas affectés par les exécutions de tâches périodiques? Peut-être que je ne le fais pas correctement.

Voici les extraits pertinents de mon plugin:

function __construct() {

    add_action( 'wp_ajax_my_admin_upload_attachment', array( $this, 'my_admin_upload_attachment') );
    add_action('my_Push_to_dropbox', array($this,'Push_to_dropbox'));

} // end constructor

function my_admin_upload_attachment() {
    /* upload and save file locally, update post meta */
    /* schedule the files to be uploaded to DropBox */
    wp_schedule_single_event(time()+5, 'my_Push_to_dropbox');
    /* return success JSON */
}

function Push_to_dropbox() {
    $this->log('Push_to_dropbox - started.');
    //$this->do_Push_to_dropbox();
    @ignore_user_abort(true); // this does not help: 'finished' message still never prints
    set_time_limit(0);
    sleep(30); // this mimicks the long-running upload task
    $this->log('Push_to_dropbox - finished.');
}

EDIT:remove define('ALTERNATE_WP_CRON', true); de wp-config.php, les pages se chargent sans délai, mais la tâche périodique est interrompue par des rafraîchissements successifs: le message 'terminé' ci-dessus ne s'imprime pas dans le journal.

4
montrealist

Les tâches périodiques n'affectent pas directement le chargement de la page en dehors du délai d'attente de 0.01s (bien sûr, elles affectent le chargement du serveur, elles peuvent donc avoir un impact sur le chargement de la page indirectement ).

Mon intuition est que votre PHP config est le problème. Les tâches périodiques fonctionnent comme n'importe quelle autre requête Web et sont soumises au paramètre max_execution_time INI de PHP. Si cette option est définie sur, par exemple, 90 secondes, la demande mourra et vos fichiers ne seront pas synchronisés. Vous pouvez tester cela en définissant sleep sur un nombre inférieur à votre max_execution_time et voir si elle se termine.

Si tel est le cas, vous pouvez essayer d'ajouter:

ini_set( 'max_execution_time', 0 );

au sommet de votre fonction Push_to_dropbox(). Ce n'est pas une bonne solution, car cela ne fonctionnera pas sur tous les hôtes, mais c'est un début.

2
Matthew Boynes

Selon le WP Plugin Handbook "Toutes les tâches dont l'exécution est planifiée seront exécutées lors du chargement de cette page." Ainsi, il ralentira toujours le chargement de la page et ne devrait pas être utilisé pour remplacer directement un CRON (ou une tâche planifiée) réel pour des tâches volumineuses que l'utilisateur ne devrait pas attendre.

Une meilleure solution consiste à configurer une tâche WP pour déclencher une tâche asynchrone qui effectuera le travail en arrière-plan - le plus facilement avec une bibliothèque telle que celle-ci . De cette façon, l'utilisateur n'aura pas à attendre la fin du processus et le processus ne sera pas tué s'il se déconnecte.

Vous pouvez également utiliser un service tel que AWS Lambda ou CronJob.org pour lancer le processus.

1
Justin Waulters