我需要在我们的 Windows 2003 64 位服务器上的网站中运行 php,虽然 php 为 Windows 提供了 32 位二进制文件,但目前不提供 64 位二进制文件。
我无法切换 IIS 6 来运行 32 位应用程序,因为它会停止我所有其他 asp.net 站点的工作。
我正在尝试按照本指南从源代码为 64 位目标构建 php:http://wiki.php.net/internals/windows/stepbystepbuild
我使用 Windows SDK 构建环境命令窗口来构建它,并通过发出以下命令开始:
setenv /x64 /xp /release
..将构建目标设置为“针对 Windows XP x64 版本”
我发出了以下配置行:
configure --disable-all --enable-cli --enable-isapi
这导致构建失败(如果我省略--enable-isapi,它可以很好地构建,但我不想这样做):
Microsoft (R) Program Maintenance Utility Version 9.00.30729.01
Copyright (C) Microsoft Corporation. All rights reserved.
SAPI sapi\cli build complete
cl : Command line warning D9035 : option 'Wp64' has been deprecated and will be removed in a future release
php5isapi.c
c:\php-sdk\php53dev\vc9\x64\php5.3\zend\zend_execute.h(234) : warning C4267: 'function' : conversion from 'size_t' to 'int', possibl
oss of data
sapi\isapi\php5isapi.c(286) : warning C4267: '=' : conversion from 'size_t' to 'int', possible loss of data
sapi\isapi\php5isapi.c(300) : warning C4267: '=' : conversion from 'size_t' to 'DWORD', possible loss of data
sapi\isapi\php5isapi.c(789) : warning C4267: '=' : conversion from 'size_t' to 'DWORD', possible loss of data
sapi\isapi\php5isapi.c(791) : warning C4267: '=' : conversion from 'size_t' to 'DWORD', possible loss of data
sapi\isapi\php5isapi.c(863) : warning C4267: 'function' : conversion from 'size_t' to 'uint', possible loss of data
sapi\isapi\php5isapi.c(885) : error C4235: nonstandard extension used : '_asm' keyword not supported on this architecture
sapi\isapi\php5isapi.c(885) : error C2065: 'mov' : undeclared identifier
sapi\isapi\php5isapi.c(885) : error C2146: syntax error : missing ';' before identifier 'lpPage'
sapi\isapi\php5isapi.c(885) : error C2065: 'esp' : undeclared identifier
sapi\isapi\php5isapi.c(905) : warning C4267: 'function' : conversion from 'size_t' to 'int', possible loss of data
sapi\isapi\php5isapi.c(908) : warning C4267: 'function' : conversion from 'size_t' to 'int', possible loss of data
sapi\isapi\php5isapi.c(912) : warning C4267: 'function' : conversion from 'size_t' to 'int', possible loss of data
NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio 9.0\VC\Bin\x86_amd64\cl.exe"' : return code '0x2'
Stop.
这看起来像问题:“使用了非标准扩展:此架构不支持‘_asm’关键字”。我怀疑我没有做足够的工作来告诉构建过程提供 64 位输出,有人可以建议如何克服这个问题吗?
答案1
您的“_asm”是指嵌入在 C 代码中的内联汇编语言。
“Itanium 和 x64 处理器不支持内联汇编”,http://msdn.microsoft.com/en-us/library/4ks26t93(VS.80).aspx。
因此,您不能简单地重新编译它;您必须重新编写代码以删除内联汇编代码并将其替换为 C 语言指令。这不仅需要大量工作,而且可能会取消使用内联汇编代码实现的性能优化。可能有一种方法可以使用单独的汇编程序来构建汇编语言部分,然后将它们链接到项目中,但这显然超出了我们的系统管理员范围。
我怀疑这就是为什么没有官方的 64 位 Windows PHP 版本的原因。我听说过非官方64 位 Windows 版本的 PHP,但它们被认为不稳定。
您是否考虑过专门为 PHP 设置一个单独的 32 位应用程序池?这样您就可以在 32 位兼容模式下运行 PHP,而不会破坏 64 位 ASP.NET 应用程序。