Получить реальную среду выполнения PHP программно

У меня есть скрипт, который должен понять, работает ли он под HHVM или под стандартным движком Zend.

Использование zend_version() выводит разные теги версии — 2.5 для PHP5 и 2.4.99 для мастера HHVM на текущий момент, и я вообще не чувствую себя в безопасности, используя этот метод из-за потенциального дублирования.

Использование phpversion() просто дает мне поддерживаемую версию PHP, опять же, я не считаю это безопасным из-за потенциального дублирования.

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


person csvan    schedule 15.07.2014    source источник
comment
Самый безопасный способ - вообще не проверять это. Спросите себя, зачем вам нужна эта проверка, и найдите другой способ, например, проверив, доступны ли некоторые функции, которые вы хотите использовать (function_exists, package_exists).   -  person GolezTrol    schedule 15.07.2014
comment
Я знаю, но в данном случае это необходимо, поскольку Zend и HHVM реализуют одну и ту же функциональность взаимоисключающими способами, в результате чего код, работающий под HHVM, ломается под php5. Подробнее об этой проблеме см. в этой заявке: github.com/facebook/hhvm/issues/1391< /а>   -  person csvan    schedule 15.07.2014
comment
... и отрицательные голоса без какой-либо мотивации. Спасибо, что очерняете сообщество.   -  person csvan    schedule 15.07.2014
comment
Проверьте, что возвращает php_sapi_name().   -  person Marek    schedule 15.07.2014
comment
Пожалуйста, не голосуйте молча. Я не вижу ничего плохого в этом вопросе. Пожалуйста, хотя бы объясните, почему вы проголосовали против.   -  person Quasdunk    schedule 15.07.2014
comment
@Marek - он просто дает «ncli» для обоих при запуске из терминала.   -  person csvan    schedule 15.07.2014
comment
@Quasdunk - этот вопрос действительно решает конкретную проблему различия между HHVM и Zend, что я и искал. Было бы неплохо иметь возможность найти общий подход, работающий и для других потенциальных сред выполнения, но если нет, я был бы рад либо принять и ответить от вас, либо пометить это как дубликат.   -  person csvan    schedule 15.07.2014


Ответы (1)


Я мог бы предложить тестирование самого фактического поведения, а не платформы, которую вы используете. Даже если вы можете определить, используете ли вы PHP или HHVM, вам в конечном итоге потребуется знать точную версию, как только PHP или HHVM исправит/изменит это поведение. Вы можете использовать, например. код в этого комментария GitHub и сравните его вывод, чтобы проверить, какой тип поведения, которое демонстрирует ваша платформа.

Это код, который может различать поведение:

<?php
function start_elem($parser,$name,$attribs) {
   echo "<$name>";
}
function end_elem($parser,$name)
{
   echo "</$name>";
}

$parser=xml_parser_create();
xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);
xml_set_element_handler($parser,"start_elem","end_elem");
$buf = '<F>';
echo xml_parse($parser,$buf,strlen($buf)==0);

В качестве альтернативы вы также можете просто использовать ответ на этот вопрос, что указывает на то, что HHVM определяет HHVM_VERSION, а PHP (очевидно) нет, поэтому вы можете использовать это для определения времени выполнения.

person CmdrMoozy    schedule 15.07.2014
comment
+1 за упоминание HHVM_VERSION, что является правильным ответом на вопрос. - person Radu Murzea; 18.07.2014