2

我最近从源代码构建了 XHP 1.5,并将其安装在现有的 Web 服务器上。Web 服务器运行 PHP 5.4.32,Apache 2.2.15 使用 mod_php(不是 fastcgi)调用 PHP,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 

通过 Apache 获取 phpinfo() 表明 XHP 已加载,通过 Apache 的 extension_loaded("xhp") 返回 true。

什么可能导致 XHP 从命令行工作,但在通过 Apache 运行时无法工作(甚至无法解析)?

4

2 回答 2

0

一个可能的原因是 PHP 的版本不同,特别是因为您是从源代码构建 XHP。我在安装了多个 PHP 版本的共享主机上遇到了类似的奇怪行为。将 Apache 报告的 PHP 版本(查看 phpinfo() 输出)与您在命令行中使用的版本进行比较php -v。如果存在差异,那可能是您遇到的问题的一种解释。

于 2014-09-22T19:24:30.067 回答
0

在详细了解我的生产服务器(不工作)与我的测试服务器(工作)有何不同后,我发现所有服务器都安装了 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 而不是 Web 工作——我所有的服务器都有 apc.enable_cli=0,所以 APC 不会从 CLI 干扰 XHP。

于 2014-09-29T20:57:49.683 回答