LINUX:MediaWiki - Tâche de fond
But
En marge de l'interface Web, MediaWiki doit effectuer diverses tâches directement au niveau du système.
Chaque fois qu'une modification est effectuée, une page créé,... une ou plusieurs tâches sont mises en file d'attente. J'ai remarqué que l'extension "Semantic MediaWiki" crée de très nombreuses tâches qui peuvent se monter à plusieurs centaines d'actions.
Cette files d'actions doivent être exécutées afin de vider cette queue.
Il y a divers manières d'y arriver selon votre contexte.
LocalSettings.php
La première solution consiste à considérer la variable "$wgJobRunRate". Sa valeur doit être supérieure ou égale à zéro. Par défaut, cette valeur vaut "1". Cette variable désigne le nombre de tâches qui seront effectuées à chaque chargement de pages via l'interface Web. Si cette variable vaut "0", la file d'attente des tâches ne se videra pas. Si le nombre de "clics" est insuffisant, la file va grandir. Il faut donc adapter ce paramètre en fonction dans le fichier "LocalSettings.php".
Interactif
Alternativement il est possible de la vider en ligne de commande en mode console Linux.
Dans le logiciel MediaWiki, il existe un répertoire "maintenance". Ce dernier rassemble un ensemble d'outils. L'un d'eux nous intéresse. Il s'agit du script "runJobs.php".
Voici la commande à exécuter:
php81 /web/wiki.39/maintenance/runJobs.php --maxtime=3600
Crontab
Cette commande précédente peut être lancée à intervalle régulier via le Crontab.
Voici un exemple de ligne ajoutée dans le fichier "/etc/crontab" qui la lance tous les quarts d'heure:
0,15,30,45 * * * * apache /usr/bin/php81 /web/wiki.39/maintenance/runJobs.php --maxtime=3600 > /var/log/mediawiki/runJobs.log
N'oubliez pas de créer le répertoire "var/log/mediawiki" et d'adapter les droits d'accès et de propriété à l'utilisateur "apache".
Systemd
Une solution alternative consiste à créer un service spécifique géré par Systemd.
En premier lieu, on crée un script que l'on nommera "mwjobrunner.bat" que l'on place dans le répertoire "/usr/local/bin":
#!/bin/bash # Put the MediaWiki installation path on the line below MW_INSTALL_PATH="/web/wiki.39" RUN_JOBS="$MW_INSTALL_PATH/maintenance/runJobs.php --maxtime=3600" echo Starting job service... # Wait a minute after the server starts up to give other processes time to get started sleep 60 echo Started. while true; do # Job types that need to be run ASAP no matter how many of them are in the queue # Those jobs should be very "cheap" to run php81 $RUN_JOBS --type="enotifNotify" # Everything else, limit the number of jobs on each batch # The --wait parameter will pause the execution here until new jobs are added, # to avoid running the loop without anything to do php81 $RUN_JOBS --wait --maxjobs=20 # Wait some seconds to let the CPU do other things, like handling web requests, etc echo Waiting for 10 seconds... sleep 10 done
On adapte les droits d'accès:
chmod 755 /usr/local/bin/mwjobrunner.bat
Ensuite on crée le service que l'on nommera "mw-jobqueue.service" que l'on place dans le répertoire "/etc/systemd/system":
[Unit] Description=MediaWiki Job runner [Service] ExecStart=/usr/local/bin/mwjobrunner.bat Nice=10 ProtectSystem=full User=apache OOMScoreAdjust=200 StandardOutput=journal [Install] WantedBy=multi-user.target
Il reste à l'activer:
systemctl daemon-reload systemctl enable mw-jobqueue.service systemctl start mw-jobqueue.service
On peut par la suite suivre les messages envoyés par notre script:
systemctl status mw-jobqueue.service