J'ai quelques événements programmés dans mon site WordPress. Pour cela, j'utilise un travail cron, il a donc créé une option dans la table wp_options
.
Après quelques jours, mon site devient lent. Lorsque je vérifie ma base de données, elle contient plus de 2 Mo de données dans le champ cron, je pense donc à la nettoyer maintenant. Cela affectera-t-il les opérations cron de mon site?
Je suppose que tout est à propos des entrées dans la table. En raison des entrées floues, mon site est en train de ralentir. Voici mon code.
wp_schedule_event(time(), 'daily', 'kv_daily_post_expire_check');
function kv_daily_post_expire_check() {
$the_query = get_posts( 'post_type=job&post_status=publish' );
foreach($the_query as $single_post) {
$id=$single_post->ID;
$ad_close_date=get_post_meta($id, 'ad_close_date', true );
if($ad_close_date!=''){
$today=date("Y-m-d");
$ad_less_close_date=$ad_close_date-3;
if($ad_close_date<$today){
$update_post = array(
'ID' => $id,
'post_status' => 'expired',
'post_type' => 'job' );
wp_update_post($update_post);
}
else if($ad_less_close_date==$today){
$update_post = array(
'ID' => $id,
'post_status' => 'expired',
'post_type' => 'job' );
//wp_update_post($update_post);
kv_author_post_expiring_soon($id,3);
}
}
}
}
et voici les données qui sont là dans ma table de base de données.
a:7:{i:1447098349;a:3:{s:16:"wp_version_check";a:1:{s:32:"40cd750bba9870f18aada2478b24840a";a:3:{s:8:"schedule";s:10:"twicedaily";s:4:"args";a:0:{}s:8:"interval";i:43200;}}s:17:"wp_update_plugins";a:1:{s:32:"40cd750bba9870f18aada2478b24840a";a:3:{s:8:"schedule";s:10:"twicedaily";s:4:"args";a:0:{}s:8:"interval";i:43200;}}s:16:"wp_update_themes";a:1:{s:32:"40cd750bba9870f18aada2478b24840a";a:3:{s:8:"schedule";s:10:"twicedaily";s:4:"args";a:0:{}s:8:"interval";i:43200;}}}i:1447099020;a:1:{s:20:"wp_maybe_auto_update";a:1:{s:32:"40cd750bba9870f18aada2478b24840a";a:3:{s:8:"schedule";s:10:"twicedaily";s:4:"args";a:0:{}s:8:"interval";i:43200;}}}i:1447141549;a:1:{s:26:"kv_daily_post_expire_check";a:1:{s:32:"40cd750bba9870f18aada2478b24840a";a:3:{s:8:"schedule";s:5:"daily";s:4:"args";a:0:{}s:8:"interval";i:86400;}}}i:1447141669;a:1:{s:26:"kv_daily_post_expire_check";a:1:{s:32:"40cd750bba9870f18aada2478b24840a";a:3:{s:8:"schedule";s:5:"daily";s:4:"args";a:0:{}s:8:"interval";i:86400;}}}i:1447141790;a:1:{s:26:"kv_daily_post_expire_check";a:1:{s:32:"40cd750bba9870f18aada2478b24840a";a:3:{s:8:"schedule";s:5:"daily";s:4:"args";a:0:{}s:8:"interval";i:86400;}}}i:1447141909;a:1:{s:26:"kv_daily_post_expire_check";a:1:{s:32:"40cd750bba9870f18aada2478b24840a";a:3:{s:8:"schedule";s:5:"daily";s:4:"args";a:0:{}s:8:"interval";i:86400;}}}s:7:"version";i:2;}
Merci pour tous vos commentaires. J'ai trouvé la solution par moi-même.
La raison en est le crochet d'action, nous devons l'utiliser comme ceci. sinon, la fonction sera appelée chaque page que nous chargeons. voici donc le code que j'ai utilisé pour le résoudre.
add_action( 'switch_theme', 'kv_event_scheduler' );
function kv_event_scheduler() {
wp_schedule_event(time(), 'daily', 'kv_daily_post_expire_check');
}
Ici, la fonction ne sera accrochée qu'une fois, après le changement de thème. Donc, il ne sera accroché qu’une fois. que le cron travaillera quotidiennement une fois.
de plus, le nettoyage de la valeur de l'option cron affectera la fonctionnalité. mais vous n'avez pas besoin de craindre pour cela. Une fois que vous modifiez cette fonction comme ci-dessous, des entrées seront automatiquement créées.
add_action( 'after_setup_theme', 'kv_event_scheduler' );
function kv_event_scheduler() {
wp_schedule_event(time(), 'daily', 'kv_daily_post_expire_check');
}
une fois que vous avez sauvegardé cette actualisation d'une page, changez le "after_setup_theme" en "switch_theme", vos entrées seront créées automatiquement.
J'espère que celui-ci aidera quelqu'un qui a collé sur le même problème. si ma solution a aidé quelqu'un à voter.
Si vous voulez un moyen rapide de faire une boucle programmatique pour tout ce que vous avez dans la rangée cron
de wp_options et que vous avez accès à la base de données du site directement (dans un environnement de développement local ou sur un hôte Web), vous pouvez exécuter quelque chose comme ceci via la commande ligne:
mysql $YOUR_DB_NAME -e "SELECT option_value FROM wp_options WHERE option_name='cron';" | php -r '$cronArray = unserialize(file_get_contents("php://stdin")); foreach ($cronArray as $timestamp => $data) { echo $timestamp." --> ".date("c",$timestamp)."\n"; print_r($data); }'
J’estime que voir cette information en dehors de tout autre contexte peut parfois être très illustratif. La ligne ci-dessus vous donnera une sortie comme celle-ci qui peut ensuite être examinée:
1446749050 --> 2015-11-05T18:44:10+00:00
Array
(
[wp_version_check] => Array
(
[40cd750bba9870f18aada2478b24840a] => Array
(
[schedule] => twicedaily
[args] => Array
(
)
[interval] => 43200
)
)
)
1446751800 --> 2015-11-05T19:30:00+00:00
Array
(
[wp_maybe_auto_update] => Array
[...]
wp-cli est également une excellente option pour afficher et éditer ce type de données:
$ wp option delete cron
Success: Deleted 'cron' option.
$ wp option get cron
array (
1447092802 =>
array (
'wp_version_check' =>
array (
'40cd750bba9870f18aada2478b24840a' =>
array (
'schedule' => 'twicedaily',
'args' =>
array (
),
'interval' => 43200,
),
),
'wp_update_plugins' =>
[...]
Il est important de garder à l'esprit que la ligne cron
est l'une des lignes à chargement automatique de WordPress. Cela signifie que les données de cette ligne doivent être extraites de la base de données et traitées par WordPress à à chaque chargement de page . Vous avez donc certainement raison de vouloir garder la taille de cette ligne aussi basse que possible. Comme @ mrbobbybryant mentionné, il existe également des plug-ins qui vous permettent de visualiser et d'éditer ce qui se trouve dans cette ligne via WordPress directement.
Lorsque vous tentez de déterminer ce qui devrait ou ne devrait pas faire partie de ces données, je vous recommanderais de rechercher de nombreuses entrées d'un type ou tout autre élément qui semble ne pas y appartenir. Une fois que ces éléments sont identifiés, vous pouvez revenir en arrière et trouver le code dont ils sont originaires et modifier le mode de fonctionnement du cron.
De plus, même si cela ne devrait pas être un facteur si vous êtes à jour sur votre version de WordPress, il convient de mentionner qu’un bogue pouvait entraîner une augmentation considérable de la taille des lignes cron
dans WordPress 4.3: # 33423 - Arguments commutés dans wp_batch_split_terms Cron Job dans la section 4.3 .
Lorsque votre tableau Cron est bourré de plusieurs tâches, il y a de fortes chances que vous ayez oublié de vérifier s'il y a déjà une tâche inachevée dans la file d'attente ou que la configuration est incorrecte. Le tableau config s'habitue pour identifier une tâche dans la file d'attente. Sens si vous par exemple Si vous avez une faute de frappe ou une autre différence entre les contrôles wp_next_schedule()
et wp_schedule_event()
, le contrôle aboutira et vous vous retrouverez facilement avec la tâche ajoutée à maintes reprises. Assurez-vous de vérifier cela. Mieux vaut simplement utiliser une variable à la fois pour le crochet et pour la configuration afin de ne pas commettre cette erreur.
add_action( 'wp_loaded', function()
{
$hook = 'your_custom_event';
$task = new YourCronHandler();
// Config: An Array of arrays
$config = [ ( include __DIR__.'/config.php' ), ];
add_action( $hook, $task );
// Make sure to not run during installation or if there's already a task added
if (
! defined( 'WP_INSTALLING' )
&& ! wp_next_scheduled( $hook, $config )
) {
wp_schedule_event(
time(),
'thirtymin',
$hook,
$config
);
}
} );
Ensuite, construisez simplement votre gestionnaire:
class YourCronHandler
{
public function __invoke( Array $config = [] )
{
// Bootstrap your process here
}
}
La configuration peut facilement être séparée en un fichier autonome. Cela aidera à rendre les choses plus faciles à lire et au cas où, même réutilisables.
<?php
return [
'foo' => 'bar',
];
Note: Lorsque votre travail cron est en cours d'exécution, WP ajoute automatiquement un verrou cron à la base de données, de sorte que vous n'avez pas à vous soucier des équilibreurs de charge et des serveurs différents qui l'exécutent exécutent plusieurs fois la même tâche. Cela ne peut pas être votre problème, mais dans de tels cas, il est préférable de désactiver cron dans votre wp-config.php
et de simplement déclencher cron manuellement à partir de votre onglet cron sur un seul serveur.
Pour compléter l'exemple ci-dessus
Au cas où vous auriez besoin d'un intervalle différent, c'est assez simple:
add_filter( 'cron_schedules', function( Array $schedules = [] )
{
return $schedules + [
'thirtymin' => [
'interval' => HOUR_IN_SECONDS / 2,
'display' => 'Every Thirty Minutes'
],
];
} );
Vous devriez vérifier ce plugin de développeur. Cela vous donne un contrôle précis lorsque vous travaillez avec cron. https://wordpress.org/plugins/wp-crontrol/
Je repenserais également vos processus cron. On dirait que vous aurez peut-être besoin d'un nettoyage post-cron intégré à votre code. Mais je ne fais que spéculer ici.