Инструкция по сборке PHP под WinNT 4.0 с использованием MSVC
- СОФТ.
- ИНСТАЛЯЦИЯ.
- СБОРКА.
- Известные баги, которые шибко мешают работать и пути их лечения.
- Сборка модуля Php 4.03 betta для MS SQL 6.5 (mssql.dll).
СОФТ.
- Пакет CYGWIN утилиты bison и flex.
- Bindlib библиотека поддержки DNS Lookup.
- Number4 дополнения к математической части.
- Win32Build готовые библиотеки, необходимые для сборки.
- Mssql библиотеки для программинга под MS SQL 6.5.
- CVS клиент для CVS repository нужен для того, чтобы скачать исходный код PHP.
Также понадобятся файлы от MSVC++ 6.0 (только для пользователей MSVC++ 5.0)
- OLE - положить в VC\include. Необходимы для СОМ поддержки.
- HTTP - переименовать имеющиеся в *.hold, а новые положить в VC\include. Необходимы для сборки ISAPI фильтра.
ИНСТАЛЯЦИЯ.
Инсталируем пакет CYGWIN, например в каталог C:\Program Files\Cygnus, в NT надо завести переменную среды CYGWIN со значением %SystemDrive%\Program Files\cygnus\cygwin-b20
Делается это так: Идем в Start->Settings->Control Pannel запускаем ярлык System, выбираем карточку Environment на ней щелкаемся на окно System variables внизу две строки Variable и Value, в строке Variable пишем CYGWIN а в строке Value %SystemDrive%\Program Files\cygnus\cygwin-b20 И жмем Set а потом Apply.
Cоздаем от корня каталог Tmp на системном диске и точно так же добавляем переменную TMP со значением %SystemDrive%\Tmp. Добавляем в переменную path путь %SystemDrive%\Tmp
Жмем Apply и OK. После этого необходимо перегрузиться.
Разворачиваем архив win32build.zip в каталог, например C:\Win32build
Запускаем среду MSVC++ 5.0 идем в Tools->Options на карточку Directory и добавляем в разделы
- Bin
- Include
- Libraries
следующие пути соответственно:
- C:\Program Files\cygnus\cygwin-b20\H-i586-cygwin32\bin
- С:\Win32Build\include
- C:\Win32Build\lib
Разворачиваем Bindlib_w32.zip в каталог, например C:\Bindlib, ищем в нем файл проекта bindlib.dsp и собираем его из среды MSVC. В каталоге C:\Bindlib\Debug появится resolve.lib, ее надо переписать в каталог C:\Win32Build\Lib поверх старой.
Инсталируем клиента CVS (инструкция по использованию) и скачиваем исходный код PHP (php4, TSRM, ZEND), Напимер в каталоги C:\Php4, C:\Tsrm и C:\Zend, потом каталоги Tsrm и Zend перемещаем в каталог Php4.
Распаковываем number4.tar.gz в каталог C:\Number4 и кладем содержимое в C:\Php4.
СБОРКА.
Топаем в каталог C:\Php4\Tsrm и собираем TSRM.dsp, после сборки в каталоге C:\Php4\Tsrm\Debug появится Tsrm.lib, скопировать ее в каталог C:\Win32Build\Lib.
Переходим в каталог C:\Php4\Zend, открываем проект ZendTS.dsp и собираем его, после сборки в каталоге C:\Php4\Zend\Debug появится библиотека ZendTS.lib, копируем ее в каталог C:\Win32Build\Lib.
Переходим в каталог C:\Php4 и открываем проект php4ts.dsp. В нем 4 проекта сначала собираем php4ts (не забудьте установить активный проект Project->Set Active Project->php4ts).
После сборки в каталоге C:\Php4\Debug появится файл php4ts.lib, php4ts.dll, php.exe. Php4ts.lib опять копируем в C:\Win32Build\Lib. Эта библиотека нужна для сборки внешних модулей php, например для модуля поддержки mssql.
Делаем активным проект php4isapi и собираем его. В каталоге C:\php4\sapi\isapi\debug будет лежать php4isapi.dll – фильтр для IIS.
Известные баги, которые шибко мешают работать и пути их лечения.
1. Через элеметы формы не постятся данные размером более 4К, не аплоадятся файлы размером больше 4К. php4.exe процесс подвисает и снимается только рестартом IISа. (Отписал в репорт баг, но когда исправят непонятно, попытаюсь поправить сам).Решение: Обходится использованием php 3.12-3.14 для обработки файлов реакции форм. Медленнее, зато работает.
2. При выполнении динамического кода в котором происходит использование сериализованных переменных парсер выдает оштбку. Например:
<? $NotSer=Array(1,2,3,4,5,6); $Ser=serialize($NotSer); print $Ser; eval(“\$Tmp=unserialize(\$Ser);”); ?> Result: parser error on line 5 …..
Происходит это из-за того, что в четвертой версии символы {} используются для инкапсуляции переменных в строку, например $a=”Такой вот элемент {$NotSer[1]}”;
Но сериализованное представление массива тоже содержит символы {}.
В примере, описанном выше парсер пытается инкапсулировать выражение, которое на самом деле выражением то и не является и естественно валится с ошибкой.
Решение: Надо поправить в файле \php4\ext\standard\var.c код, заменив { на [ и } на ]. Ищем в файле подстроку %d:{ и заменяем ее на %d:[ (будет две замены), и меняем { на [, В строке if (**p != ':' || *((*p) + 1) != '{') замена { на [, для строк for ((*p) += 2; **p && **p != '}' && i > 0; i--) и return *((*p)++) == '}'; меняем } на ]. Потом пересобираем php4ts.dsp. После этого все нормально отрабатывает.
Сборка модуля Php 4.03 betta для MS SQL 6.5 (mssql.dll).
Распаковать mssql.zip. *.lib забрасываем в C:\Win32Build\Lib, а *.h в C:\Win32Build\Include.
Топаем в каталог C:\Php4\ext\mssql и открываем в среде MSVC проект mssql.dsp.
Идем в Project->Settings на карточке C/C++ в Additional include directories добавляем ..\..\Tsrm, в раздел Preprocessor добавляем COMPILE_DL,ZTS,MSSQL65,DBNTWIN32, а в раздел Object/Libraries modules на карточке Link добавляем php4ts.lib, ntwdblib.lib. Затем собираем проект. В каталоге C:\Php4\ext\mssql\Debug появится mssql.dll.
Оставить комментарий
Комментарии
на некоторых блогах уже есть инструкция для сборки РНР5, но еще сыровата.