Мне нужно запустить php на веб-сайте на нашем 64-разрядном сервере Windows 2003, и хотя php предлагает 32-разрядные двоичные файлы для Windows, в настоящее время они не предлагают 64-разрядные.
Я не могу переключить IIS 6 на запуск 32-битных приложений, так как он останавливает работу всех остальных моих сайтов asp.net.
Я пытаюсь собрать php из исходного кода для 64-битной цели, следуя этому руководству: http://wiki.php.net/internals/windows/stepbystepbuild
Я использовал командное окно среды сборки Windows SDK для его создания и начал с ввода команды:
setenv /x64 /xp /release
..установить цель сборки "Ориентация на ОС Windows XP x64 RELEASE"
Я выдал строку конфигурации:
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-битных данных, может ли кто-нибудь предложить, как это преодолеть?
Ваш "_asm" относится к встроенному языку ассемблера, встроенному в код C.
«Встроенная сборка не поддерживается процессорами Itanium и x64», согласно http://msdn.microsoft.com/en-us/library/4ks26t93(VS.80).aspx.
Следовательно, вы не можете просто перекомпилировать его; вам придется переработать код, чтобы удалить встроенный код сборки и заменить его инструкциями на языке C. Это не только потребует много работы, но и, вероятно, приведет к отмене оптимизации производительности, реализованной с использованием встроенного кода сборки. Вероятно, есть способ использовать отдельный ассемблер для создания частей на языке ассемблера, а затем связать их с проектом, но это, очевидно, будет на несколько световых лет за пределами области наших системных администраторов.
Я подозреваю, что именно по этой причине не существует официальной 64-битной сборки PHP для Windows. Я слышал о неофициальный 64-битные сборки PHP для Windows, но они считаются нестабильными.
Думали ли вы о создании отдельного 32-битного пула приложений специально для PHP? Это позволит вам запускать PHP в 32-битном режиме совместимости без нарушения работы ваших 64-битных приложений ASP.NET.