[Résolu] MAJ spip 4.4.20 Erreur d’exécution ../prive/squelettes/page.html

Bonjour,
J’ai le même souci sur plusieurs sites au passage de Spip 4.4.19 à 4.4.20 avec spip_loader 7.0.0.

Une page admin /ecrire/ presque toute blanche avec :

Erreur d’exécution …/prive/squelettes/page.html

Numéro Message squelette boucle Ligne
1 Erreur d’exécution …/prive/squelettes/page.html | =File […]/ecrire/public/composer.php(97) : eval()'d code Line 16 : Call to undefined function safe_export_env() / /

//OU//

Erreur d’exécution …/prive/squelettes/page.html

Numéro Message squelette boucle Ligne
1 Erreur d’exécution …/prive/squelettes/page.html | =File […]/tmp/cache/skel/html_6ae39ed8ddbf3175348e9a23f6a882ba.php Line 23 : Call to undefined function safe_export_env() / /

Dans /tmp/cache/skel/html_6ae39ed8ddbf3175348e9a23f6a882ba.php j’ai ce contenu

<?php

/*
 * Squelette : ../prive/squelettes/page.html
 * Date :      Wed, 12 Aug 2026 11:11:36 GMT
 * Compile :   Tue, 18 Aug 2026 13:09:15 GMT
 * Boucles :   
 */ 
//
// Fonction principale du squelette ../prive/squelettes/page.html
// Temps de compilation total: 0.253 ms
//

function html_6ae39ed8ddbf3175348e9a23f6a882ba($Cache, $Pile, $doublons = array(), $Numrows = array(), $SP = 0) {

	if (isset($Pile[0]["doublons"]) AND is_array($Pile[0]["doublons"]))
		$doublons = nettoyer_env_doublons($Pile[0]["doublons"]);

	$connect = '';
	$page = (
retablir_echappements_modeles('<'.'?php header(' . _q('Content-Security-Policy: frame-ancestors \'none\'') . '); ?'.'>') .

'<'.'?php echo recuperer_fond( ' . argumenter_squelette('prive/squelettes/structure') . ', array_merge('.safe_export_env($Pile[0]).',[\'type-page\' => ' . argumenter_squelette(retablir_echappements_modeles(interdire_scripts(entites_html(sinon(table_valeur($Pile[0]??[], (string)'type-page', null), (interdire_scripts(entites_html(table_valeur($Pile[0]??[], (string)'exec', null),true)))),true)))) . ',
	\'composition\' => ' . argumenter_squelette(retablir_echappements_modeles(interdire_scripts(entites_html(sinon(table_valeur($Pile[0]??[], (string)'composition', null), ''),true)))) . ',
	\'lang\' => ' . argumenter_squelette($GLOBALS["spip_lang"]) . ']), array("compil"=>array(\'../prive/squelettes/page.html\',\'html_6ae39ed8ddbf3175348e9a23f6a882ba\',\'\',2,$GLOBALS[\'spip_lang\'])), _request(\'connect\') ?? \'\');
?'.'>
');

	return analyse_resultat_skel('html_6ae39ed8ddbf3175348e9a23f6a882ba', $Cache, $page, '../prive/squelettes/page.html');
}

J’ai tenté plusieurs trucs, mais je ne trouve pas.
Pas de gros souci, j’ai mes sauvegardes.

Je suis sur hostinger en php 8.5. En extension php, j’ai activé sodium, yaml et apcu.

J’ai testé :

  • le vidage de cache a priori
  • le vidage de cache a postériori
  • de ne pas avoir de dossier squelettes
  • de ne rien avoir dans mes_options.php
  • de désactiver tous les plugins avant la MAJ
  • en désactivant apcu et yaml
  • repasser en php 8.3
  • sacrifier un animal

À part le sacrifice qui a modifié une variable php, rien de probant.

Hum. On dirait que ta maj n’a pas été complète. Tu as tente un nouveau coup DD loader?

Salut @maieul
J’ai essayé une dizaine de fois, sur divers sites avec les tests indiqués à la fin, mais rien n’y change.

  • Tu l’as sur différents sites ? ou un seul ?
  • Tu as bien la fonction dans ecrire/public/fonctions.php ?
  • Auquel cas possiblement il manque une inclusion quelque part (ou il faut qu’on déplace la fonction ailleurs (inc/utils par exemple en 4.4)
  • Mais je suis étonné que tu sois le seul à ce jour avec ce souci

Peut être un indice.
La seule page consultable dans /ecrire est
pouet.com/ecrire/?exec=admin_plugin&actualise=1

Avec comme indication en lieu du tableau des plugins :
Erreur d’exécution ../plugins-dist/svp/prive/squelettes/contenu/svp_admin_plugin.html

Après cela peut être un opcache qui colle ? Mais spip_loader essaie pourtant de traiter ces cas

Ces erreurs sont loggées dans tmp/log/debusquer.log notamment

Bingo @marcimat !

le souci était ecrire/public/fonctions.php que j’avais modifié.

J’avais pourtant tenté en renommant /squelettes pour exclure cette possibilité, mais en le renommant /squelettes_save, il a quand même dû être pris en compte, même si le squelette était plus visible… (Je suppose en ayant le même début ?).

J’avais mis dans /public/fonctions.php :

$bloc_ancre = $ancres[$ancre] = "<div id='" . $ancre . "' class='pagination_ancre'></div>";

au lieu de

$bloc_ancre = $ancres[$ancre] = "<a id='" . $ancre . "' class='pagination_ancre'></ a >";

pour valider le W3C, mais est-ce vraiment mieux ? Devrais-je proposer cela sur le GIT ?

Merci beaucoup pour vos réponses rapides et pertinentes !