AntonKuzmin
Всем доброго времени суток. На днях понадобилось проверить работоспособность 4 вариантов кода на разных версиях PHP (в сумме около 20). Причём изначально было понятно что 4 экземплярами дело не ограничится - в будущем подобных тестов предвидится больше. Вручную всё это делать очень утомительно, поэтому было написано 2 скрипта, которыми я бы хотел с вами поделиться.
Весь рабочий процесс с ними происходит следующим образом. Вы скачиваете в одну папку все необходимые версии PHP, распаковывайте их и собираете. Нужно чтоб получилась следующая структура:
/some_dir/.
/some_dir/php-5.1.6
/some_dir/php-5.2.17
/some_dir/php-5.3.1
/some_dir/...
Где php-5.1.6, php-5.2.17 и т. д. - директории с соответствующими версиями интерпретатора. Далее туда же кладёте 2 скрипта. Первый - run.php
<?php
# Строка, выводимая при успешном выполнении теста.
# Должна совпадать с аналогичной строкой из test.php.
define('TEST_DONE_STR', 'TEST DONE');
define('TEST_PATH', dirname(__FILE__));
define('CLI_PATH', 'sapi/cli/php');
# Ищем директории PHP в текущей папке
$dirs = array();
foreach(scandir('./') as $item) {
if(preg_match("#^php-#", $item) AND is_dir($item)) {
if(file_exists($item . "/sapi/cli/php"))
$dirs[] = $item;
else
print "$item - php-cli not found\n";
}
}
# В каждой из них запускаем test.php
foreach($dirs as $dir) {
$output = array();
exec(TEST_PATH . "/$dir/" . CLI_PATH . " " . TEST_PATH . "/test.php", $output);
print "$dir - " . (implode("", $output) == TEST_DONE_STR ? "OK" : "FAILED") . "\n";
}
Как видно из исходников, он сперва обнаружает соседствующие с ним директории PHP по сигнатуре "php-", а затем с помощью cli/php каждой из них выполняет скрипт test.php. Если после выполнения тестового скрипта в stdout падает строчка из константы "TEST_DONE_STR" - тест пройден и run.php выведет "php-*.*.* - OK". В ином случае - "php-*.*.* - FAILED".
test.php должен содержать код, который вам необходимо проверить. Он может быть в любом виде. Главное, чтоб в случае успешной отработки выводилась вышеописанная строка. Для примера выкладываю содержимое одного из моих тестов:
<?php
# Строка, выводимая при успешном выполнении теста.
# Должна совпадать с аналогичной строкой из run.php.
define('TEST_DONE_STR', 'TEST DONE');
# Код теста
ob_start();
include("/etc/passwd/../passwd");
$result = ob_get_contents();
ob_end_clean();
# Проверяем верно ли завершился тест
if(substr_count($result, 'root:'))
print TEST_DONE_STR;
Пример вывода run.php:
user@comp:~/php$ php run.php
php-4.3.1 - php-cli not found
php-5.2.16 - php-cli not found
php-5.2.17-suhosin - php-cli not found
php-4.3.10 - OK
php-4.4.9 - OK
php-5.0.5 - OK
php-5.1.6 - OK
php-5.1.6-suhosin - FAILED
php-5.2.0 - OK
php-5.2.17 - OK
php-5.2.2 - OK
php-5.2.3 - OK
php-5.2.4 - OK
php-5.2.9 - OK
php-5.3.0 - FAILED
php-5.3.1 - FAILED
php-5.3.10 - FAILED
php-5.3.20 - FAILED
php-5.3.5 - FAILED
Ссылки по теме