Компиляция расширения PHP как не потокобезопасного
я пытаюсь скомпилировать расширение imagemagick (imagick) для использования в не потокобезопасной среде в windows.
я использую PHP 5.3.10 и настроил Visual C++ express в качестве среды компиляции. Проблема в том, что я использую не потокобезопасную версию PHP в качестве модуля FCGI в Apache 2.2.
таким образом, мой PHP поставляется с php5.lib, а не php5ts.lib. Я считаю, что это причина, по которой я получаю эти ошибки:
imagick.obj : error LNK2019: unresolved external symbol __imp__tsrm_mutex_alloc referenced in function _zm_startup_imagick
I только когда-либо построенные и скомпилированные вещи на linux, поэтому я не слишком уверен, как это сделать в среде windows.
как я могу скомпилировать расширение, чтобы оно не было потокобезопасным?
я загрузил threadsafe двоичный файл PHP 5.3.10, чтобы получить копию php5ts.движение за освобождение. Затем я смог скомпилировать расширение.
я предполагаю, что установка ZTS директива препроцессора, либо 1 или 0 приведет к компиляции расширения как либо threadsafe, либо non-thread-safe. (Не слишком уверен в этом, поэтому, если кто-то может дать мне знать, правильно это или нет, это было бы очень ценно. :))
затем я настроил виртуальную машину под управлением Windows 7 и установил последнюю версию WAMP. Причина в том, что он использовал потокобезопасную версию PHP.
я поместил dll в папку ext в установке PHP и включил его в php.ini. Однако, даже после попытки версии ts и nts в WAMP, я получит:
PHP Warning: PHP Startup: Unable to load dynamic library 'c:/wamp/bin/php/php5.3.10/ext/imagick.dll' - The specified module could not be found.
in Unknown on line 0
но дело в том, что c:/wamp/bin/php/php5.3.10/ext/imagick.dll' существует, и да я проверял это много раз.
затем я понизил ImageMagick до 6.6.2-10-Q16, но по-прежнему вижу ту же проблему.
та же проблема возникает на моей машине dev под управлением nts версии PHP 5.3.10 на Apache 2.2 (все установлены вручную).
похоже, я могу ошибаться в отношении ZTS препроцессора. Если я установлю ZTS=0 и скомпилировать, используя зависимость walker от скомпилированной dll по-прежнему показывает, что она требует php5ts.dll который присутствует только в threadsafe версиях PHP.
я больше возился с зависимостью walker и обнаружил, что мне нужно статистически связать с msvc100d.dll - ... Затем я удалил ZTS в определении препроцессора и смог скомпилировать с помощью php5.lib вместо php5ts.dll. Я думаю, что это должно получить мне dll non-ts.
однако при загрузке расширения я все еще получаю:
PHP Warning: PHP Startup: Invalid library (maybe not a PHP library) 'imagick.dll' in Unknown on line 0
и ошибки из зависимостей walker:
Error: At least one module has an unresolved import due to a missing export function in an implicitly dependent module.
Error: Modules with different CPU types were found.
Warning: At least one delay-load dependency module was not found.
Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module.
установлен visual c++ express 2008 и скомпилирован с помощью platform toolkit v90, но по-прежнему сталкивается с теми же проблемами.
любые советы оценил :)
Решение Найдено! Смотрите мой ответ.
2 ответов
понял! Я надеюсь, что это может помочь тем, кто компилирует расширения php в windows в будущем. То, что я сделал, основано на:https://wiki.php.net/internals/windows/stepbystepbuild
Примечание: я прочитал ответ на этом сайте, который сказал, что компиляция расширений PHP сама по себе в windows не поддерживается. Основываясь на моих экспериментах вчера, кажется, что это тоже много работы, поэтому я использую процесс сборки PHP.
лучший способ-использовать сборку PHP процесс.
установите Visual C++ Express 2008 (любая версия будет делать, но express бесплатно) и Windows SDK 6.1 (обратите внимание, что мы хотим, чтобы версия 6.1 не была старше или новее).
установить SVN клиентские инструменты если вы этого не сделали и перезагрузите для своего
PATHпеременная вступит в силу.скачать PHP SDK бинарные инструменты и извлеките его к
C:\php-sdk.начать
CMD ShellподMicrosoft Windows SDK v6.1в меню Пуск и запуститьcd C:\php-sdk.выполнить
setenv /x86 /xp /releaseэто создает 32-разрядный выпуск. Вы можете использовать/x64для создания 64-разрядной версии (я не пробовал это).выполнить
bin\phpsdk_setvars.batвыполнить
bin\phpsdk_buildtree.bat php53devскачать исходный код PHP и извлечь его в
C:\php-sdk\php53dev\vc9\x86так что вы в конечном итоге сC:\php-sdk\php53dev\vc9\x86\php5.3-xyzскачать последнюю дэпс и извлечь все
C:\php-sdk\php53dev\vc9\x86. Может потребоваться перезаписать все существующие папки, поэтому нажмите кнопку Да.выполнить
cd C:\php-sdk\php53dev\vc9\x86Проверьте последнюю версию вашего расширения из репозитория svn:
svn co http://svn.php.net/repository/pecl/imagick/trunk pecl/imagickЯ проверяю imagick здесь.установите все зависимости. В моем случае, мне нужно установить ImageMagick, поэтому я загрузил последние рекомендуемые двоичный файл windows. Вам нужно будет перезапустить после установки, чтобы обновить свой
PATHпеременная, но вы можете сделать это после компиляции. Убедитесь,что вы установили заголовки C/C++ и includes.скопируйте содержимое
includesкаталог из каталога установки ImageMagick вC:\php-sdk\php53dev\vc9\x86\deps\include.скопируйте содержимое от ImageMagick установить каталог в
C:\php-sdk\php53dev\vc9\x86\deps\libтеперь давайте построим: run
cd C:\php-sdk\php53dev\vc9\x86\php5.3-xyzзатемbuildconfзатемconfigure --help. Посмотрите на помощь должным образом. Он покажет вам все флаги конфигурации и любые доступные расширения для включения. В моем случае, поскольку я добавил imagick, у меня была опция--with-imagickзапустите config:
configure --enable-cli --with-imagick=shared --disable-ztsесли вы хотите создать не потокобезопасное двоичное использование--disable-zts, в противном случае снимите этот флаг конфигурации. Не знаю почему, но иногда расширения используют--with-myextensionфлаг и иногда--enable-myextension, так что проверьтеconfigure --helpдля использования флага. Если добавить=sharedпосле флага расширения он будет скомпилирован как отдельная DLL, которая si то, что мы хотим.Compile: run
nmakeзатемnmake snap.Готово :) Проверить
C:\php-sdk\php53dev\vc9\x86\php-5.3.10\Release(не-потокобезопасный) илиC:\php-sdk\php53dev\vc9\x86\php-5.3.10\Release_TS(потокобезопасным). Ваши скомпилированные двоичные файлы должны быть там. Скомпилированные расширения (pecl) должны быть в ZIP-файле similiar кpecl-5.3.10-nts-Win32-VC9-x86.zip. Откройте этот файл и извлеките DLL extensio на свойextпапка в вашей установке PHP.включите расширение PHP и перезапустите веб-сервер. Запустить
phpinfo()и убедитесь, что расширение включено.если расширение не работает должным образом, убедитесь, что вы перезагрузите компьютер, чтобы обновить свой
PATHпеременной. В моем случае мне нужно иметь каталог установки imagemagick в моемPATHпеременная.???
профит!
есть ли причина, по которой вам нужно скомпилировать? Почему не скачать? Обычно это намного проще/быстрее в Windows.
VC6:http://www.sk89q.com/2010/03/vc6-windows-binaries-for-imagick-2-3-0/