Compatibilité Jeedom / PHP 8.2 : warnings Deprecated dans le core

Bonjour à toute l’équipe,

Depuis la mise à jour vers PHP 8.2 (Debian 12), j’observe dans les logs Jeedom (cron_execution notamment) des warnings de type :

PHP Deprecated: preg_match_all(): Passing null to parameter #2 ($subject) of type string is deprecated

Ces messages semblent provenir du core (ex : jeeObject.class.php, eqLogic.class.php, scenario.class.php, cmd.class.php) et sont liés au fait que certaines fonctions reçoivent parfois des valeurs null.

Dans mon cas, cela apparaît surtout après redémarrage ou réinitialisation de certains plugins/scénarios, où certaines commandes peuvent temporairement ne pas avoir de valeur.

Je comprends que PHP 8.2 est plus strict sur la gestion des types, notamment null, ce qui rend visibles des comportements qui n’étaient pas remontés auparavant.

Est-ce qu’une adaptation officielle du core Jeedom est prévue (ou en cours) pour :

  • garantir la compatibilité complète PHP 8.2 / 8.3
  • sécuriser les appels internes (notamment preg_match_all, execCmd, etc.)
  • éviter les warnings “Deprecated” dans les logs système.

Je ne parle pas ici de bugs bloquants, mais plutôt de compatibilité et de propreté des logs en environnement PHP récent.

De mon coté j’ai pu utiliser un code scénario pour repérer les commandes obsolètes et ou sans valeurs et corrigés certaines, mais par exemple avec le plugin thermostat des commandes comme performances, coefficients, isolations, comme aucun valeur dans mon cas des message log warning apparaissent.
Le plugin Weather aussi à des commandes non utilisées sans valeurs comme Direction du vent +1, +2 etc et qui renvoient des warnings.

Merci pour votre travail sur Jeedom :+1: en espérant d’être dans la bonne section.

Salut,

Oui c’est la bonne section :wink:

Jeedom 4.5 est compatible debian 12 / php8
Mais effectivement il peut rester des cas (et ce n’est peut-être pas le seul)

Oui et non.

Le travail sur le core ce n’est pas une tâche définie avec un début et une fin, c’est du travail en continu.

Donc les cas remontés seront fixés au fur et à mesure avec la priorité adéquate.
Dans ce cas ci on peut raisonnablement vérifier cela pour la prochaine version, pas besoin de hotfix.

Bonjour

Merci de votre réponse.

De mon côté à par une paire de cde via des plugins sans valeurs, le reste fonctionne très bien.

Si cela intéresse j’ai 2 codes scénarios à exécuter manuellement qui m’ont permis de repérer mes commande obsolètes et de réduire énormément mes warnings. Mais attention cela teste les commandes physiquement donc ne pas oublier de tous vérifier, mais bon cela m’a bien aidé et augmente un peu la charge et peu prendre quelques minutes avant que l’exécution s’arrête.
Une fois la tache réalisée ne pas oublier de désactiver le scénario ou de le supprimer.
Utiliser un code à la fois pas les deux en mêmes temps.
Puis aller voir dans l’analyse des logs le log « debug_null »

1er code

foreach (cmd::all() as $cmd) {
    try {
        $value = $cmd->execCmd();

        if ($value === null || $value === '') {
            log::add('debug_null', 'warning',
                'Commande vide : ID=' . $cmd->getId() .
                ' Nom=' . $cmd->getHumanName()
            );
        }
    } catch (Exception $e) {
        log::add('debug_null', 'error',
            'Erreur cmd ID=' . $cmd->getId() . ' : ' . $e->getMessage()
        );
    }
}

2eme code

foreach (cmd::all() as $cmd) {

    try {
        // On log le type pour comprendre
        log::add('debug_null', 'info',
            'TEST -> ' . $cmd->getHumanName() .
            ' | Type=' . $cmd->getType() .
            ' | Sous-type=' . $cmd->getSubType()
        );

        // On ignore les actions
        if ($cmd->getType() != 'info') continue;

        $value = $cmd->getCache('value');

        if ($value === null || $value === '') {
            log::add('debug_null', 'warning',
                'VIDE -> ' . $cmd->getHumanName()
            );
        }

    } catch (Exception $e) {
        log::add('debug_null', 'error',
            'ERREUR -> ' . $cmd->getHumanName() .
            ' : ' . $e->getMessage()
        );
    }
}

Bref à utiliser avec des pincettes et avec un peu de temps devant soit (pour moi environ 30mn).

Attendant une prochaine version je vous dit encore merci pour le taf.

Bonjour

Pour info, j’ai maintenant les remontées infos des batteries de mes capteur de température qui ne remontaient plus, je ne sais pas si c’est une cause à effet des codes scénario que j’ai utilisé. :smiley:

tu n’aurais pas un peu plus de log sur ?

PHP Deprecated: preg_match_all(): Passing null to parameter #2 ($subject) of type string is deprecated

y a pas la trace ou des numéros de lignes?

car pour l’instant je ne trouve pas de cas évident… et je ne reproduis pas

Bonjour

Voici les trois qui reviennent mais je c’est que c’est lié à des commandes qui ont aucune valeur ou null ou «  » comme plugin thermostat et Weather …

0194|PHP Deprecated:  preg_match_all(): Passing null to parameter #2 ($subject) of type string is deprecated in /var/www/html/core/class/eqLogic.class.php on line 484
0195|PHP Deprecated:  preg_match_all(): Passing null to parameter #2 ($subject) of type string is deprecated in /var/www/html/core/class/scenario.class.php on line 671
0196|PHP Deprecated:  preg_match_all(): Passing null to parameter #2 ($subject) of type string is deprecated in /var/www/html/core/class/jeeObject.class.php on line 137

je ne suis pas convaincu que ca vient d’une commande info vide… surtout que l’erreur se produit dans les toHumanReadable() et que cette fonction n’est pas utilisée pour le contenu du commande
et comme les 3 arrivent en même temps si j’ai bien compris, ca veut dire que ca vient de jeedom::toHumanReadable() … on remonte la piste

le problème c’est que là c’est large, y a beaucoup d’appel.
vu que c’est largement utilisé, ca semble plus être un problème lié à l’installation, il doit y avoir un scénario, un design ou une vue ou autre mal configuré
pas impossible que ca soit un scénario avec un champ vide qlq part par exemple ou avec un erreur sur l’utilisation des trigger (ca a changé avec la 4.5…)
peut-être croiser avec les occurrences dans les logs (si un log toutes les 5 min, c’est p-e un scénario qui tourne toute les 5 minutes etc)

toujours pas plus d’info? plus de logs? y a quoi avant et après ces lignes?
je demande car on a d’abord reçu un log tout seul, puis un 2eme avec un numéro de ligne… on sait jamais qu’on ai la trace complète ensuite :wink:

Vérifies les commandes orphelines, menu analyse>équipements

Oups oui j’avais oublié 2 commandes que j’avais supprimer hier, merci, j’ai vider les log et dès que j’en n’aurais d’autres je les posteraient.
Merci

Bonjour

Maintenant il me reste plus que ces messages dans log cron execution.

 0000|PHP Deprecated:  preg_match_all(): Passing null to parameter #2 ($subject) of type string is deprecated in /var/www/html/core/class/cmd.class.php on line 2499
0001|PHP Warning:  file_get_contents(/tmp/jeedom/cache/c2NlbmFyaW9JbnN0YW5jZUF0dHIyMDY6OlAzQkYwajRDNXNmVkdaWVI=): Failed to open stream: No such file or directory in /var/www/html/core/class/cache.class.php on line 332
0002|PHP Warning:  unlink(/tmp/jeedom/cache/c2NlbmFyaW9JbnN0YW5jZUF0dHIyMDY6OlAzQkYwajRDNXNmVkdaWVI=): No such file or directory in /var/www/html/core/class/cache.class.php on line 334
0003|PHP Warning:  file_get_contents(/tmp/jeedom/cache/c2NlbmFyaW9JbnN0YW5jZUF0dHIyMDc6Omp4eTF1YThuQmNNbTlLd0Q=): Failed to open stream: No such file or directory in /var/www/html/core/class/cache.class.php on line 332
0004|PHP Warning:  unlink(/tmp/jeedom/cache/c2NlbmFyaW9JbnN0YW5jZUF0dHIyMDc6Omp4eTF1YThuQmNNbTlLd0Q=): No such file or directory in /var/www/html/core/class/cache.class.php on line 334
0005|PHP Warning:  file_get_contents(/tmp/jeedom/cache/c2NlbmFyaW9JbnN0YW5jZUF0dHIyMDQ6OkdRVnZ6Z3hIVkx6b01zcVg=): Failed to open stream: No such file or directory in /var/www/html/core/class/cache.class.php on line 332
0006|PHP Warning:  unlink(/tmp/jeedom/cache/c2NlbmFyaW9JbnN0YW5jZUF0dHIyMDQ6OkdRVnZ6Z3hIVkx6b01zcVg=): No such file or directory in /var/www/html/core/class/cache.class.php on line 334
0007|PHP Warning:  file_get_contents(/tmp/jeedom/cache/c2NlbmFyaW9JbnN0YW5jZUF0dHIyMDQ6Ok9Ta3NCZldhNnlkZ1gzQm8=): Failed to open stream: No such file or directory in /var/www/html/core/class/cache.class.php on line 332
0008|PHP Warning:  unlink(/tmp/jeedom/cache/c2NlbmFyaW9JbnN0YW5jZUF0dHIyMDQ6Ok9Ta3NCZldhNnlkZ1gzQm8=): No such file or directory in /var/www/html/core/class/cache.class.php on line 334
0009|PHP Warning:  file_get_contents(/tmp/jeedom/cache/c2NlbmFyaW9JbnN0YW5jZUF0dHIyMDc6OllOanYzSVkwU2lnODVYWFE=): Failed to open stream: No such file or directory in /var/www/html/core/class/cache.class.php on line 332
0010|PHP Warning:  unlink(/tmp/jeedom/cache/c2NlbmFyaW9JbnN0YW5jZUF0dHIyMDc6OllOanYzSVkwU2lnODVYWFE=): No such file or directory in /var/www/html/core/class/cache.class.php on line 334

Et ceci dans scénario execution

0000|PHP Deprecated:  preg_match_all(): Passing null to parameter #2 ($subject) of type string is deprecated in /var/www/html/core/class/cmd.class.php on line 2499
0001|PHP Deprecated:  preg_match_all(): Passing null to parameter #2 ($subject) of type string is deprecated in /var/www/html/core/class/cmd.class.php on line 2499
0002|PHP Warning:  Undefined array key "exclude" in /var/www/html/plugins/cloudsyncpro/3rparty/Rclone-API-PHP/src/Rclone/Clients/RCApiClient.php on line 79
0003|PHP Warning:  Undefined array key "exclude" in /var/www/html/plugins/cloudsyncpro/3rparty/Rclone-API-PHP/src/Rclone/Clients/RCApiClient.php on line 79
0004|PHP Deprecated:  preg_match_all(): Passing null to parameter #2 ($subject) of type string is deprecated in /var/www/html/core/class/cmd.class.php on line 2499
0005|PHP Deprecated:  preg_match_all(): Passing null to parameter #2 ($subject) of type string is deprecated in /var/www/html/core/class/cmd.class.php on line 2499
0006|PHP Deprecated:  preg_match_all(): Passing null to parameter #2 ($subject) of type string is deprecated in /var/www/html/core/class/cmd.class.php on line 2499
0007|PHP Deprecated:  preg_match_all(): Passing null to parameter #2 ($subject) of type string is deprecated in /var/www/html/core/class/cmd.class.php on line 2499

Je n’ai plus cde orpheline, et tous fonctionne bien.

Déjà j’ai beaucoup moins de message depuis que j’ai fait ce qui est cité dans mon 2eme message.

Merci

Bonjour

Je me suis répondu à moi même :face_with_hand_over_mouth: voir mon dernier
message ici

Merci

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.