当通过Apache调用脚本时,带有PHP 5.4的XHP不会影响解析器


XHP with PHP 5.4 not affecting the parser when script is called via Apache

我最近从源代码构建了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运行时不工作(甚至不解析)?

一个可能的原因是PHP版本的差异,尤其是因为您是从源代码构建XHP。在安装了多个PHP版本的共享主机上,我也遇到过类似的奇怪行为。将Apache报告的PHP版本(查看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而不是从web工作的——我的所有服务器都有apc.enable_CLI=0,所以apc不会干扰来自CLI的XHP。