PHP тест на фатальную ошибку - PullRequest
7 голосов
/ 15 ноября 2011

Это немного длинно, но я решил, что все равно спрошу.У меня есть приложение, которое имеет редактирование кода через Интернет, как вы найдете на Github, используя редактор ACE.Проблема в том, что можно редактировать код, который находится внутри самого приложения.

Мне удалось обнаружить ошибки синтаксического анализа перед сохранением файла, что прекрасно работает, но если пользователь создает ошибку времени выполнения, такую ​​какMyClass extends NonExistentClass, файл проходит проверку синтаксического анализа, но сохраняет в файловую систему, убивая приложение.

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

Ответы [ 3 ]

2 голосов
/ 15 ноября 2011

Возможно, полезно: php -f <file> вернет ненулевой код завершения, если есть ошибка во время выполнения.

2 голосов
/ 15 ноября 2011

Возможно использовать register_shutdown_function для создания объекта JSON, содержащего информацию о фатальной ошибке. Затем используйте вызов AJAX для проверки файла; проанализировать возвращенное значение из вызова, чтобы увидеть, если есть ошибка. (Очевидно, что вы также можете запустить файл PHP и проанализировать объект JSON без использования AJAX, просто подумав, что будет лучшим с точки зрения UX) *

function my_shutdown() {
    $error = error_get_last();
    if( $error['type'] == 1 ) {
        echo json_encode($error);
    }
}
register_shutdown_function('my_shutdown');

Будет выводить что-то вроде

{"type":1,"message":"Fatal error message","line":1}

Добавьте это к началу тестового файла, затем:

$.post('/test.php', function(data) {
    var json = $.parseJSON(data);
    if( json.type == 1 ) {
        // Don't allow test file to save?
    }
});
0 голосов
/ 15 ноября 2011

возможно, запустив код в отдельном файле первым и приложив какой-то фиксированный код внизу, чтобы проверить, оценивает ли он?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...