Недавно я собрал XHP 1.5 из исходного кода и установил его на существующий веб-сервер. Веб-сервер работает под управлением PHP 5.4.32, Apache 2.2.15 вызывает PHP с использованием mod_php (не fastcgi), CentOS 6.5. Весь наш существующий код PHP (который не зависит от нового синтаксиса XHP) по-прежнему прекрасно работает, включая другие расширения, такие как Imagick, curl и JSON.
Использование тестового файла на основе Установка XHP тестовое задание:
<?php
echo "XHP!\n";
exit;
echo <a/>;
?>
Это работает, как и ожидалось, при запуске из командной строки. (Он печатает XHP!, Затем завершает работу. Он не приводит к сбою синтаксического анализатора, но также не отображается, поскольку мы не загружаем зависимости.)
Когда я получаю этот скрипт через Apache, я получаю ошибку
Parse error: syntax error, unexpected '<' in /var/www/html/bloom/play.php on line 4
Получение phpinfo () через Apache показывает, что XHP загружен, extension_loaded («xhp») через Apache возвращает true.
Что может быть причиной того, что XHP работает из командной строки, но не работает (даже не анализирует) при запуске через Apache?
Одной из возможных причин является различие в версиях PHP, тем более что вы создаете XHP из исходного кода. Я столкнулся с похожим странным поведением на общем хосте, на котором установлено несколько версий PHP. Сравните версию PHP, сообщаемую Apache (посмотрите на вывод phpinfo ()), с версией, которую вы используете в командной строке. php -v
, Если есть разница, это может быть одним из объяснений проблемы, с которой вы столкнулись.
Изучив более подробную информацию о том, чем мой рабочий сервер (не работает), отличается от моих тестовых серверов (работает), я обнаружил, что на всех серверах установлен APC 3.1.15, но на производстве кэш кода операции APC был отключен в /etc/php.d/apc.ini
:
# BAD NEWS
apc.enable_opcode_cache=0
Как оказалось, это не то, что мы хотели по несвязанным причинам производительности.
Включение кэша кода операции APC, изменив эту строку в /etc/php.d/apc.ini
и перезапуск Apache заставил XHP немедленно начать работать:
# WORKING
apc.enable_opcode_cache=1
Я также смог решить проблему, полностью удалив APC (хотя в моем приложении это не практично).
Это также объясняет, почему он работает из CLI, а не из Интернета — все мои серверы имеют apc.enable_cli = 0, поэтому APC не будет мешать XHP из CLI.