[RESOLU] Cron ne fonctionne plus avec passage à PHP 8.2 OVH

Eléphanteau du PHP | 11 Messages

20 mai 2022, 11:58

Bonjour,

Pour un site hébergé chez OVH en Kimsuffit2015, nous utilisions un cron qui copiait tous les fichiers contenus dans un dossier vers un dossier backup et supprimait les dossiers source juste après. Ce cron fonctionnait bien avec la version PHP 7.0 legacy.

Voici (en partie) le code utilisé et qui fonctionnait jusqu'à présent (jusqu'à la mise à jour PHP 8.1 stable 64) :
// Identify directories
 $files = scandir("www/bk/imAKF/");
$source = "www/bk/imAKF";
$destination = "www/bk/imAKF_bck";
// Cycle through all source files
foreach ($files as $file) {	
if (in_array($file, array(".","..","index.html"))) continue;
	$i=$i+1;	
// If we copied this successfully, mark it for deletion
if (copy($source.$file, $destination.$file)) {
$ii = $ii+1;
unlink($source.$file);
}
}
echo 'Fichiers déplacés : ' . $i . ' - Fichiers virés : ' . $ii;
L'echo est utilisé juste pour les tests.

Depuis la mise à jour vers 8.1, la tâche rencontre une erreur et ne s'exécute plus, avec ce code erreur :
Array ( [0] => . [1] => .. [2] => 1645894038-name.jpg [3] => 1645894134-free .jpg [4] => 1645894158-LOWFR0501 .jpg [5] => 1650125669-CERISES.jpg [6] => 1652195033-CERISES.jpg [7] => 1652195141-CERISES.jpg [8] => 1653039031-DZDEZ.jpg [9] => index.html [10] => tmpc ) Array ( [0] => tmpc [1] => index.html [2] => 1653039031-DZDEZ.jpg [3] => 1652195141-CERISES.jpg [4] => 1652195033-CERISES.jpg [5] = > 1650125669-CERISES.jpg [6] => 1645894158-LOWFR0501 .jpg [7] => 1645894134-free.jpg [8] => 1645894038-name.jpg [9] => .. [10] => . )
Attention : Variable non définie $files dans /home/truefile/www/bk/cron_imAKF.php en ligne 25

Attention: l'argument foreach() doit être de type array|object, null donné dans/home/truefile/www/bk/cron_imAKF.php à la ligne 25
Fichiers déplacés : 0 - Fichiers virés : 0
Ne connaissant pas trop php8 et ses changements, qui peut m'aider à retrouver une tache cron fonctionnelle avec PHP 8.1 ?
Modifié en dernier par olill le 20 mai 2022, 12:35, modifié 2 fois.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

20 mai 2022, 12:04

Il va falloir que tu avances dans ton debugage car le message d'erreur est assez explicite :

Code : Tout sélectionner

Attention : Variable non définie $files dans /home/truefile/www/bk/cron_imAKF.php en ligne 25
Où cette variable est censé être définie ? Pourquoi ne l'est elle pas ?
Fais des var_dump() pour voir ce que contiennent tes variables aux étapes clés de ton traitement, et comprendre à quel endroit ça ne se passe pas comme prévu
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 11 Messages

20 mai 2022, 12:34

Effectivement, j'ai oublié la ligne
$files = scandir("www/bk/imAKF/");
dans mon code copié (je viens d'éditer)

Est-ce un changement du à PHP8 ou OVH, mais remplacer la ligne ci-dessus par
$files = scandir("imAKF/");
ainsi que
$source = "www/bk/imAKF/";
$destination = "www/bk/imAKF_bck/";
par
$source = "imAKF/";
$destination = "imAKF_bck/";
a solutionné le problème, le script refonctionne maintenant. #-o

(et accessoirement, le langage du cron était encore sur PHP 7.2 d'où une double erreur dans les logs).

Merci !

Avatar du membre
Mammouth du PHP | 1564 Messages

21 mai 2022, 16:46

Mettre des chemins absolut pour les cron, je vois qu'ils le sont mais je recommanderais l'utilisation de __DIR__ (ou avec dirname() pour remonter d'un ou plusieurs dossiers)