Jeanluc Posté 9 Mai 2008 Posté 9 Mai 2008 Bonjour, J'ai une application qui provoque une erreur de segmentation et un core dump, plusieurs fois par jour. Après diverses recherches, le problème est ici: <?phpecho 'Je teste les cas de core dump.<br />' . "\n";// Lire la sourceif ( $fd = _AT_fopen ('/path_to_file/html1-jl.html', 'rt') ) { $io_content = ''; for ($i=0; !feof ($fd); $i++) { $io_content .= rtrim(fgets($fd, 4096)); } fclose ($fd);}// Enlever les commentaires$io_content = preg_replace ('/\<\!\-\-([^-]|\-[^-]|\-\-[^>])*\-\-\>/', '', $io_content);// Ecrire la source sans commentairesif ( $fd3 = _AT_fopen ('/path_to_file/html2-jl.html', 'wt') ) { fwrite ($fd3, $io_content); fclose ($fd3);}echo 'Fin du test.<br />' . "\n";?> Pour la plupart des fichiers sources, aucun problème. Par contre, pour certains fichiers sources qui contiennent plusieurs commentaires multilignes, "Fin du test." n'est jamais affiché à cause d'une erreur de segmentation. Le problème est parfaitement reproductible. Serait-ce un bug php ou voyez-vous une erreur dans mon code ? Avez-vous des suggestions pour contourner le problème ? Jean-Luc
Kioob Posté 9 Mai 2008 Posté 9 Mai 2008 Hello, après un coup d'oeil très rapide, il y a quelques trucs qui me gênent : 1) ta boucle for est une approche assez curieuse je trouve, $i ne te servant pas du tout. Un simple "while" serait plus clair. 2) tu as quasiment tout échapé dans ton expression régulière, c'est très indigeste. Surtout que la quasi totalité des caractères que tu as échapé n'en ont pas besoin. D'ailleurs le flag de "gourmandise" me semble faux pour ton expression. 3) le mode d'ouverture de fichiers "t" je n'ai jamais été un grand fan. je préfère ouvrir en binaire ('b'), et faire les éventuels traitements moi même Mais sinon en PHP rien ne justifie un "core dump" ou un "segmentation fault".
Jeanluc Posté 9 Mai 2008 Auteur Posté 9 Mai 2008 Merci pour ta réponse, Kioob. D'accord avec tes remarques. Pour info: 1. La boucle for était dans le programme d'origine dont j'ai enlevé 90% pour cerner le problème. Le $i servait à quelque chose dans le programme d'origine. 2. J'ai aussi essayé avec $io_content = preg_replace ('/\<\!--([^-]|-[^-]|--[^>])*-->/', '', $io_content); et j'obtiens le même résultat. Je viens de faire des essais en remplaçant le preg_replace par $io_content = remove_tag ('<!--', '-->', $io_content); où remove_tag est une fonction que j'ai écrite sans utiliser de regex et le problème a disparu aussitôt. Jean-Luc
Kioob Posté 9 Mai 2008 Posté 9 Mai 2008 D'acc, donc le soucis venait bien de preg_replace (ou son utilisation). Sinon pour l'expression régulière, j'aurais utilisé simplement : '#<!--.*-->#sU', non ?
Jeanluc Posté 9 Mai 2008 Auteur Posté 9 Mai 2008 Nettement plus élégant ! Merci encore. Jean-Luc P.S. et cela élimine aussi la "segmentation fault"
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant