2012-04-10 22 views
6

Próbuję skompilować rozszerzenie imagemagick (imagick) do użytku w środowisku bezpiecznym dla wątków w systemie Windows.Kompilowanie rozszerzenia PHP jako nie-wątku

Używam PHP 5.3.10 i skonfigurowałem Visual C++ express jako moje środowisko kompilujące. Problem polega na tym, że używam nie-wątkowej wersji PHP jako modułu FCGI w Apache 2.2.

W ten sposób mój PHP jest dostarczany z php5.lib, a nie z php5ts.lib. Wierzę, że to jest powód, dlaczego ja się tych błędów:

imagick.obj : error LNK2019: unresolved external symbol __imp__tsrm_mutex_alloc referenced in function _zm_startup_imagick 

Mam tylko kiedykolwiek zbudowano i zebrane rzeczy na Linux, więc nie jestem zbyt pewien, jak to zrobić w środowisku Windows.

Jak mogę skompilować rozszerzenie, aby nie było bezpieczne dla wątków?


Pobrałem binarne zabezpieczenie wątków w PHP 5.3.10, aby uzyskać kopię pliku php5ts.lib. Byłem wtedy w stanie skompilować rozszerzenie.

Jestem zgadywania, że ​​ustawienie dyrektywy preprocesora ZTS albo 1 lub 0 spowodowałoby rozszerzenie skompilować zarówno jako THREADSAFE lub braku THREADSAFE. (Nie jestem tego pewien, więc gdyby ktoś mógł dać mi znać, czy to prawda, czy nie, byłoby to bardzo cenne.))

Następnie skonfigurowałem maszynę wirtualną z systemem Windows 7 i zainstalowałem najnowszą wersję WAMP. Powodem jest to, że używał PHP z wątkami bezpieczeństwa.

Umieściłem bibliotekę dll w folderze ext w instalacji PHP i włączyłem ją w php.ini. Jednak nawet po próbie zarówno TS NTS wersję w WAMP, chciałbym uzyskać:

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 

Ale chodzi o to, że c:/wamp/bin/php/php5.3.10/ext/imagick.dll' istnieje, i tak mam zaznaczone to wiele razy.

Następnie zmodernizowałem ImageMagick do wersji 6.6.2-10-Q16, ale nadal widzę ten sam problem.

Ten sam problem występuje na moim komputerze dev, który pracuje z wersją PHP 5.3.10 na Apache 2.2 (wszystkie zainstalowane ręcznie).


Wygląda na to, że mogę się mylić w stosunku do preprocesora ZTS. Jeśli ustawię ZTS=0 i skompiluję, użycie zależności w kompilowanej bibliotece dll nadal pokazuje, że wymaga ona php5ts.dll, która jest obecna tylko w wersjach PHP obsługujących wątki.


Zrobiłem więcej majsterkowania z zależność walker i stwierdziłem, że musiałem statystycznie link do msvc100d.dll. Następnie usunąłem ZTS w definicji preprocesora i udało mi się skompilować przy użyciu php5.lib zamiast php5ts.dll. Myślę, że to powinno dostać mi nie-ts dll.

Jednak podczas ładowania rozszerzenia, ja wciąż się:

PHP Warning: PHP Startup: Invalid library (maybe not a PHP library) 'imagick.dll' in Unknown on line 0 

i błędów z Dependency 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. 

Zainstalowane Visual C++ wyrazić 2008 i skompilowany przy użyciu platformy toolkit V90 , ale wciąż boryka się z tymi samymi problemami.

Wszelkie wskazówki mile widziane :)


Rozwiązanie znalezione! Zobacz moją odpowiedź.

+0

pytanie serverfault.com. – Raptor

Odpowiedz

5

Got it! Mam nadzieję, że pomoże to w przyszłości osobom przygotowującym rozszerzenia PHP w oknach. To, co zrobiłem, opiera się na: https://wiki.php.net/internals/windows/stepbystepbuild

Uwaga: Na tej stronie czytałem odpowiedź, która mówiła, że ​​samodzielne kompilowanie rozszerzeń PHP w systemie Windows jest nieobsługiwane. Opierając się na moich wczorajszych eksperymentach, wydaje się, że jest to również dużo pracy, więc używam procesu budowania PHP.

Najlepszym sposobem jest użycie procesu budowania PHP.

  1. zainstalować Visual C++ Express, 2008 (dowolna wersja będzie zrobić, ale wyrażają to za darmo) i Windows SDK 6.1 (zauważ, że chcemy wersję 6.1 nic nie starsze lub nowsze).

  2. Zainstaluj, jeśli jeszcze tego nie zrobiłeś, SVN client tools i uruchom ponownie, aby zmienna PATH zadziałała.

  3. Uzyskaj PHP SDK binary tools i wyodrębnij go do C:\php-sdk.

  4. Uruchom CMD Shell pod Microsoft Windows SDK v6.1 w swoim menu startowym i uruchom cd C:\php-sdk.

  5. Uruchamia setenv /x86 /xp /release w ten sposób tworzy wersję 32-bitową. Możesz użyć wersji /x64 do zbudowania wersji 64-bitowej (nie próbowałem tego).

  6. run bin\phpsdk_setvars.bat

  7. run bin\phpsdk_buildtree.bat php53dev

  8. Pobierz PHP source code i rozpakować go do C:\php-sdk\php53dev\vc9\x86 tak aby skończyć z C:\php-sdk\php53dev\vc9\x86\php5.3-xyz

  9. Pobierz najnowszą deps i wydobyć wszystko C:\php-sdk\php53dev\vc9\x86. Możesz zostać poproszony o zastąpienie istniejących folderów, więc naciśnij Tak.

  10. run cd C:\php-sdk\php53dev\vc9\x86

  11. Zapoznaj się z najnowszą wersją swojego rozszerzenia z repozytorium SVN: svn co http://svn.php.net/repository/pecl/imagick/trunk pecl/imagick jestem sprawdzanie Imagick tutaj.

  12. Zainstaluj dowolne zależności. W moim przypadku muszę zainstalować ImageMagick, więc pobrałem najnowszą rekomendowaną wersję windows binary. Będziesz musiał ponownie uruchomić po instalacji, aby zaktualizować zmienną PATH, ale możesz to zrobić po kompilacji. Upewnij się, że instalujesz również nagłówki C/C++.

  13. Skopiuj zawartość katalogu instalacyjnego ImageMagick do C:\php-sdk\php53dev\vc9\x86\deps\include.

  14. Skopiuj zawartość katalogu lib z ImageMagick katalogu instalacyjnego do C:\php-sdk\php53dev\vc9\x86\deps\lib

  15. Teraz zbudujmy: uruchom cd C:\php-sdk\php53dev\vc9\x86\php5.3-xyz następnie buildconf następnie configure --help. Popatrz na pomoc prawidłowo. Pokaże ci wszystkie flagi konfiguracji i wszystkie dostępne rozszerzenia do włączenia. W moim przypadku, ponieważ dodałem Imagick miałem opcję o nazwie --with-imagick

  16. Run config: configure --enable-cli --with-imagick=shared --disable-zts Jeśli chcesz zbudować binarny używania non-wątek bezpieczny --disable-zts, inaczej usunąć tę flagę konfiguracji. Nie jestem pewien dlaczego, ale czasami rozszerzenia używają flagi --with-myextension, a czasami --enable-myextension, więc sprawdź flagę, która ma być używana. Jeśli dodasz =shared po flagę rozszerzenia, zostanie ona skompilowana jako osobna biblioteka DLL, która jest tym, czego chcemy.

  17. Skompiluj: uruchom nmake, a następnie nmake snap.

  18. Gotowe :) Sprawdź C:\php-sdk\php53dev\vc9\x86\php-5.3.10\Release (nie wątek bezpieczne) lub C:\php-sdk\php53dev\vc9\x86\php-5.3.10\Release_TS (wątek bezpieczne). Twoje skompilowane pliki binarne powinny tam być. Skompilowane rozszerzenia (pecl) powinny znajdować się w pliku ZIP podobnym do pecl-5.3.10-nts-Win32-VC9-x86.zip. Otwórz ten plik i wypakuj extensio DLL do swojego folderu ext w swojej instalacji PHP.

  19. Włącz rozszerzenie PHP i uruchom ponownie serwer WWW. Uruchom phpinfo() i sprawdź, czy rozszerzenie jest włączone.

  20. Jeśli rozszerzenie nie działa poprawnie, należy ponownie uruchomić komputer, aby zaktualizować zmienną PATH. W moim przypadku muszę mieć katalog instalacyjny imagemagick w mojej zmiennej PATH.

  21. ???

  22. Zysk!

+0

Chcę Ci podziękować za poświęcenie czasu na pisanie tej pięknej instrukcji. Naprawdę pomocny! –

0

Czy istnieje powód, dla którego należy skompilować? Dlaczego nie pobrać? Zwykle jest znacznie prostsze/szybsze w systemie Windows.

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

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

+0

Próbowałem kompilacji z Valokuva.org, ale nie działały one na moim ręcznie zainstalowanym serwerze lub WAMP. Pliki binarne ze sk89q.com również nie działały. Dlatego chcę skompilować 3.1.0b1 do najnowszej wersji imagemagick. – F21

+0

Miałem na myśli 3.1.0rc1, a nie 3.1.0b1. – F21