Компиляция расширения PHP как не потокобезопасное

Я пытаюсь скомпилировать расширение imagemagick (imagick) для использования в среде, отличной от потоковой среды, в окнах.

Я использую 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 

Я только когда-либо создавал и компилировал вещи в Linux, поэтому не слишком уверен, как это сделать в среде Windows.

Как я могу скомпилировать расширение так, чтобы он не был потокобезопасным?


Я загрузил файловую бинарность PHP 5.3.10, чтобы получить копию php5ts.lib. Затем я смог скомпилировать расширение.

Я предполагаю, что установка директивы препроцессора ZTS на 1 или 0 приведет к тому, что расширение будет компилироваться как потокобезопасное или не потокобезопасное. (Не слишком уверен в этом, поэтому, если кто-то может сообщить мне, если это правильно или нет, это было бы очень признательно. :))

Затем я настроил виртуальную машину под управлением 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 и скомпилировал, использование зависимого ходок на скомпилированной dll все еще показывает, что для него требуется php5ts.dll который присутствует только в потокобезопасных версиях PHP.


Я больше потрудился с зависимым ходоком и обнаружил, что мне приходится статистически ссылаться на 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 

И ошибки от хождения зависимостей:

 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. 

Установлен визуальный c ++ express 2008 и скомпилирован с использованием инструментария платформы v90, но все еще стоит перед теми же проблемами.

Любые советы оценили 🙂


Решение найдено! См. Мой ответ.

Понял! Надеюсь, что это поможет в компиляции php-расширений в Windows в будущем. То, что я сделал, основано на: https://wiki.php.net/internals/windows/stepbystepbuild

Примечание. Я прочитал ответ на этом сайте, в котором говорится, что компиляция PHP-расширений сама по себе в окнах не поддерживается. Основываясь на моих экспериментах вчера, это, похоже, тоже много работает, поэтому я использую процесс сборки PHP.

Лучший способ – использовать процесс сборки PHP.

  1. Установите Visual C ++ Express 2008 (любая версия будет работать, но экспресс является бесплатной) и 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. run 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 Я просматриваю здесь изображение.

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

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

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

  15. Теперь давайте построим: запустите 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 двоичное использование --disable-zts , в противном случае удалите этот флаг конфигурации. Я не уверен, почему, но иногда расширения используют флаг --with-myextension а иногда --enable-myextension , поэтому --enable-myextension флажок configure --help для использования флага. Если вы добавите =shared после флага расширения, он будет скомпилирован как отдельная DLL, что мы хотим.

  17. Скомпилируйте: запустите 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-файле, аналогичном pecl-5.3.10-nts-Win32-VC9-x86.zip . Откройте этот файл и извлеките extensio DLL в свою папку 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/