PHP включает файлы с ошибками разбора

У меня есть динамически созданный PHP-файл, который включен (через include) в другой PHP-скрипт. Когда первый (по какой-то непонятной причине) генерируется с помощью синтаксических разборов, вызывает основной синтаксический анализ ошибки, прекращающий выполнение.

Есть ли способ обнаружить ошибки синтаксического анализа при включении файла, чтобы я мог динамически обновлять этот файл?

Solutions Collecting From Web of "PHP включает файлы с ошибками разбора"

Вы можете запустить версию командной строки PHP для проверки синтаксиса:

php -l filename 

Если вам нужно проверить синтаксис из PHP-скрипта, используйте функцию exec() для вызова программы командной строки.

См. Также устаревшую функцию php_check_syntax()

SYNTAX.php? Filename.php

WHERE SYNTAX.php:

 <?php error_reporting(E_ALL); ini_set('display_errors','On'); include($_SERVER['QUERY_STRING']); ?> 

Вы можете выполнить (используя exec () или аналогичный) php -l file.php и посмотреть результат. Было бы медленным, я бы подумал, что это нужно делать с каждым включением.

Не было бы лучше исправить все, что заставляет вас генерировать файлы PHP, которые иногда недействительны?

У меня есть сценарий, который будет проходить через мое дерево кода и искать синтаксические ошибки. Его не очень продвинутый, но основы его

  $cmd="php -l " . $basedir . $dir . "/" . $file; $s=exec($cmd,$k); if( strstr($s,"No syntax errors detected") ) { include($basedir.$dir."/".$file); } 

Это запустит php -l в скрипте, который вы собираетесь включить, и если нет ошибок, он загружает его.

Выполняя shell_exec (), вы можете видеть вывод, как если бы вы выполнили этот файл через командную строку. Вы можете просто увидеть, есть ли ошибка здесь.

 <?php if (strpos(shell_exec('php -l file.php'), 'Syntax Error')) { die('An error!'); } 

Если вы можете гарантировать, что вы всегда генерируете правильно анализируемый код (который должен быть легко достигнут при правильном экранировании и т. Д.), Тогда единственный способ, которым это может пойти не так, – это когда процесс записи файла прерывается (например, отключение питания, выход состояния памяти, убитого процесса и т. д.). В этом случае у вас будет частичный файл.

Вы можете защитить от этой частичной записи, добавив подпись в конце файла и проверив ее присутствие перед вызовом include ().

Например, если вы пишете <?php $complete=1; ?> <?php $complete=1; ?> в конце, вы можете проверить его наличие позже:

 $contents = file_get_contents($path); if (strpos($contents, '<?php $complete=1; ?>')) { include($path); } в $contents = file_get_contents($path); if (strpos($contents, '<?php $complete=1; ?>')) { include($path); } 

Вы можете сделать file_get_contents а затем отсканировать его, чтобы увидеть, есть ли какие-либо ошибки синтаксического анализа.

 $contents = file_get_contents($path); if (stripos($contents, 'Parse error:') !== 0) { // There was a parse error. } else { // There were no parse errors. }