У меня много устаревшего кода, в котором нет модульных тестов. По большей части они представляют собой автономные сценарии с автоматически загружаемыми классами, запускаемые путем непосредственного выполнения каждого отдельного файла .php.
Я хотел бы иметь какой-то метод для автоматизации запуска этих скриптов, проверяя, чтобы они выполнялись до конца без ошибок. Это не только обнаружит неисправный новый код, но и автоматически определит, какие сценарии выполняются с ошибками (без попытки анализа журналов ошибок).
Я видел php_check_syntax
но это устарело. Кажется предпочтительнее php -l
потому что он не просто задерживается — он выполняет сценарии и, похоже, фиксирует ошибки времени выполнения в переменной, которую затем можно прочитать. И это похоже на то, что я хотел бы сделать.
Есть ли замена для php_check_syntax
что поможет мне достичь этого?
Возможно создание оболочки, которая использует try
а также catch
(а также finally
) блоки будут работать.
Я принял ответ Рафаэля. Это был правильный путь по этому поводу. Я выкладываю полный сценарий, созданный из него здесь.
Он запускается из командной строки с помощью:
php scripttest.php "http://example.com/?param1=test"
и выйдет с кодом 9 при любых ошибках. Он подберет ошибки разбора, используя php -l
команда, а также исключения, использующие блок Try Catch. Он не обнаружит, если скрипт завершится рано. Это должно быть обнаружено путем проверки пустого вывода.
<?php
$url = $argv[1];
$parsed_url = parse_url($url);
if(!$url || $parsed_url == false){
echo "Provided url is empty or malformed.";
exit(9);
}
$docroot = "/Library/WebServer/Webs";
if ($parsed_url['scheme'] == "https") $docroot .= "/example.com-https";
elseif($parsed_url['scheme'] == "http") $docroot .= "/example.com";
else{
echo "Couldn't detect protocol.";
exit(9);
}
$filepath = $docroot.$parsed_url['path'];
if(is_dir($filepath)) $filepath .= 'index.php';
if(!file_exists($filepath)){
echo "Filepath doesn't exist.";
exit(9);
}
/**
* lint
*/
$success_str = "No syntax errors detected";
$output = array();
exec("php -l $filepath", $output);
if(!$output){
echo "linting exec produced no output.";
exit(9);
}
$success = (substr($output[0], 0, strlen($success_str)) === $success_str);
if(!$success){
echo join("\n", $output);
exit(9);
}/**
* run-time check
*/
$_REQUEST = parse_str ($parsed_url['query']);
try{
$finished = false;
$has_exception = false;
$exception = '';
ob_start(); // buffer all output
require $filepath; // execute script
ob_end_clean(); // wipe buffer
$finished = true;
}catch(Exception $e){
$has_exception = true;
$exception = $e->getMessage();
}
if($finished && !$has_exception){
echo "SUCCESS";
exit(0);
}else{
echo "Failed with exception $exception";
exit(9);
}