"PHP Warning: Cannot modify header information" récurrentes
Sur une machine Windows + IIS 6, avec des SPIP 3.0.17 + Sarka 3.2.28.
On subit à longueur de journée des erreurs :
[13-Jan-2015 10:29:07 Europe/Paris] PHP Warning: Cannot modify header information - headers already sent by (output started at D:\wwwwww\yyyyyyy\ecrire\public.php:154) in D:\ wwwwww\yyyyyyy \ecrire\inc\headers.php on line 152
Après une analyse du code et des essais en production, j'ai identifié que ces erreurs proviennent toutes (quel que soit le site SPIP sur les 180 actuellement en production) de l'écriture du fichier " tmp/cache/chemin.txt" qui termine le calcul de la page. Ci-dessous un debug_backtrace() :
Array ( [0] => Array ( [file] => D:\wwwwww\yyyyyyy\ecrire\inc\flock.php [line] => 233 [function] => http_status [args] => Array ( [0] => 401 ) ) [1] => Array ( [file] => D:\wwwwww\yyyyyyy\ecrire\inc\flock.php [line] => 193 [function] => raler_fichier [args] => Array ( [0] => tmp/cache/chemin.txt ) ) [2] => Array ( [file] => D:\wwwwww\yyyyyyy\ecrire\inc\utils.php [line] => 1032 [function] => ecrire_fichier [args] => Array ( [0] => tmp/cache/chemin.txt [1] => a:2:{s:32:"6f0bd1a59e3585679ea73508e8a166ba"... ) ) [3] => Array ( [file] => D:\wwwwww\yyyyyyy\ecrire\public.php [line] => 184 [function] => save_path_cache [args] => Array ( ) ) [4] => Array ( [file] => D:\wwwwww\yyyyyyy\spip.php [line] => 24 [args] => Array ( [0] => D:\wwwwww\yyyyyyy\ecrire\public.php ) [function] => include ) )
Ayant placé ce code dans la fonction " http_status " :
if(headers_sent()) { // APmodif debug mode $f=$_SERVER['DOCUMENT_ROOT'].'\\debug_header.txt'; $out=date('******************[d/m/Y H:i:s]')."\r\n"; $out.='PHP_SELF='.$_SERVER['PHP_SELF']."\r\n"; $out.='QUERY_STRING='.$_SERVER['QUERY_STRING']."\r\n"; $out.='-----ob_get_contents---------------------------------------------'."\r\n".ob_get_contents()."\r\n". '-----headers_list------------------------------------------------'."\r\n"; $out.=print_r(headers_list(),true)."\r\n". '-----------------------------------------------------------------'."\r\n"; $out.='STATUS_STRING='.$status_string[$status]."\r\n"; $out.='*****FIN*********************************************************'."\r\n"; file_put_contents($f,$out,FILE_APPEND); file_put_contents($_SERVER['DOCUMENT_ROOT'].'\\debug_backtrace.txt',print_r(debug_backtrace(),true)); } else { if ($php_cgi) header("Status: ".$status_string[$status]); else header("HTTP/1.0 ".$status_string[$status]); }
Un extrait de "debug_header.txt" :
******************[14/01/2015 08:40:53] PHP_SELF=/yyyyyyy/spip.php QUERY_STRING=page=style.css -----ob_get_contents--------------------------------------------- -----headers_list------------------------------------------------ Array ( [0] => X-Powered-By: PHP/5.4.35 [1] => Composed-By: SPIP ` www.spip.net [2] => X-Spip-Cache: 7776000 [3] => Content-Type: text/css; charset=iso-8859-15 [4] => Vary: Accept-Encoding [5] => Last-Modified: Wed, 14 Jan 2015 07:40:52 GMT ) ----------------------------------------------------------------- STATUS_STRING=401 Unauthorized *****FIN*********************************************************
Cette analyse montre que ces erreurs passent toutes par l'appel de la fonction "raler_fichier" dans " ecrire_fichier" du fichier "flock.php" :
if (!$ignorer_echec) { include_spip('inc/autoriser'); if (autoriser('chargerftp')) raler_fichier($fichier); spip_unlink($fichier); }
Maintenant les questions :
- Pourquoi seuls les administrateurs affichent cette erreur qui en plus arrête le processus par un "exit" dans "raler_fichier", donc les codes suivant ne sont pas exécuter (suppression et log SPIP) ? Sans compter que l'on ne voit rien car la plupart du temps elle arrive dans un fichier de CSS !!!
- Pourquoi supprimer un fichier qui n'est pas obligatoirement en erreur car c'est probablement un problème de LOCK (deux processus en même temps) ?
- Peut-on désactivé cette portion de code sans risque de problème ?
Pour la part, je prends sur moi de supprimer cette portion de code.