Компиляция расширения 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 процесс.

  1. установите Visual C++ Express 2008 (любая версия будет делать, но express бесплатно) и Windows SDK 6.1 (обратите внимание, что мы хотим, чтобы версия 6.1 не была старше или новее).

  2. установить SVN клиентские инструменты если вы этого не сделали и перезагрузите для своего PATH переменная вступит в силу.

  3. скачать PHP SDK бинарные инструменты и извлеките его к C:\php-sdk.

  4. начать CMD Shell под Microsoft Windows SDK v6.1 в меню Пуск и запустить cd C:\php-sdk.

  5. выполнить setenv /x86 /xp /release это создает 32-разрядный выпуск. Вы можете использовать /x64 для создания 64-разрядной версии (я не пробовал это).

  6. выполнить bin\phpsdk_setvars.bat

  7. выполнить bin\phpsdk_buildtree.bat php53dev

  8. скачать исходный код PHP и извлечь его в C:\php-sdk\php53dev\vc9\x86 так что вы в конечном итоге с C:\php-sdk\php53dev\vc9\x86\php5.3-xyz

  9. скачать последнюю дэпс и извлечь все C:\php-sdk\php53dev\vc9\x86. Может потребоваться перезаписать все существующие папки, поэтому нажмите кнопку Да.

  10. выполнить cd C:\php-sdk\php53dev\vc9\x86

  11. Проверьте последнюю версию вашего расширения из репозитория svn:svn co http://svn.php.net/repository/pecl/imagick/trunk pecl/imagick Я проверяю imagick здесь.

  12. установите все зависимости. В моем случае, мне нужно установить ImageMagick, поэтому я загрузил последние рекомендуемые двоичный файл windows. Вам нужно будет перезапустить после установки, чтобы обновить свой PATH переменная, но вы можете сделать это после компиляции. Убедитесь,что вы установили заголовки C/C++ и includes.

  13. скопируйте содержимое includes каталог из каталога установки ImageMagick в C:\php-sdk\php53dev\vc9\x86\deps\include.

  14. скопируйте содержимое от ImageMagick установить каталог в C:\php-sdk\php53dev\vc9\x86\deps\lib

  15. теперь давайте построим: run cd C:\php-sdk\php53dev\vc9\x86\php5.3-xyz затем buildconf затем configure --help. Посмотрите на помощь должным образом. Он покажет вам все флаги конфигурации и любые доступные расширения для включения. В моем случае, поскольку я добавил imagick, у меня была опция --with-imagick

  16. запустите config: configure --enable-cli --with-imagick=shared --disable-zts если вы хотите создать не потокобезопасное двоичное использование --disable-zts, в противном случае снимите этот флаг конфигурации. Не знаю почему, но иногда расширения используют --with-myextension флаг и иногда --enable-myextension, так что проверьте configure --help для использования флага. Если добавить =shared после флага расширения он будет скомпилирован как отдельная DLL, которая si то, что мы хотим.

  17. Compile: run nmake затем nmake snap.

  18. Готово :) Проверить 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.

  19. включите расширение PHP и перезапустите веб-сервер. Запустить phpinfo() и убедитесь, что расширение включено.

  20. если расширение не работает должным образом, убедитесь, что вы перезагрузите компьютер, чтобы обновить свой PATH переменной. В моем случае мне нужно иметь каталог установки imagemagick в моем PATH переменная.

  21. ???

  22. профит!


есть ли причина, по которой вам нужно скомпилировать? Почему не скачать? Обычно это намного проще/быстрее в Windows.

VC6:http://www.sk89q.com/2010/03/vc6-windows-binaries-for-imagick-2-3-0/

VC9: http://valokuva.org/builds/