Весь рабочий процесс с ними происходит следующим образом. Вы скачиваете в одну папку все необходимые версии 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
Надеюсь они будут вам полезны. Мне уже сэкономили кучу времени 🙂
ссылка на оригинал статьи http://habrahabr.ru/post/169311/
Добавить комментарий