2012-04-10 11 views
6

Estoy intentando compilar la extensión imagemagick (imagick) para usar en un entorno no seguro para subprocesos en windows.Compilación de una extensión PHP como no segura para subprocesos

Estoy usando PHP 5.3.10 y he configurado Visual C++ express como mi entorno de compilación. El problema es que estoy usando una versión de PHP no segura para subprocesos como un módulo FCGI en Apache 2.2.

Por lo tanto, mi PHP se suministra con un php5.lib y no un php5ts.lib. Creo que esta es la razón por la que estoy recibiendo estos errores:

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

solamente he construido y compilado cosas en Linux, así que no estoy muy seguro de cómo hacer esto en un entorno de ventanas.

¿Cómo puedo compilar la extensión para que no sea segura para subprocesos?


he descargado el binario de PHP 5.3.10-hilo para obtener una copia de php5ts.lib. Pude entonces compilar la extensión.

que supongo que la fijación de la directiva ZTS preprocesador para cualquiera 1 o 0 causaría la extensión para compilar, ya sea para las hebras o no multi-hilo. (No estoy seguro de esto, así que si alguien me puede decir si esto es correcto o no, sería muy apreciado :) :)

Luego configuré una máquina virtual con Windows 7 e instalé la última versión de WAMP. La razón es que usó una versión de PHP en condiciones de subprocesos.

Coloqué el dll en la carpeta ext en la instalación de PHP y lo habilité en php.ini. Sin embargo, incluso después de haber utilizado la versión SC y SNC en WAMP, me sale:

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 

Pero la cosa es que sí existe c:/wamp/bin/php/php5.3.10/ext/imagick.dll', y sí he comprobado esto muchas veces.

Luego, degradé ImageMagick a 6.6.2-10-Q16, pero igual veo el mismo problema.

El mismo problema se produce en mi máquina dev ejecutando una versión nts de PHP 5.3.10 en Apache 2.2 (todo instalado manualmente).


Parece que podría estar equivocado con respecto a la ZTS preprocesador. Si configuro ZTS=0 y lo compilo, el uso de la función de dependencia en la DLL compilada todavía muestra que requiere php5ts.dll, que solo está presente en las versiones de PHP con seguridad de subprocesos.


lo hice más retoques con Dependency Walker y se encontró que tenía que estadísticamente las enlace a msvc100d.dll. Luego eliminé ZTS en la definición del preprocesador y pude compilar usando php5.lib en lugar de php5ts.dll. Creo que esto debería conseguirme un dll no ts.

Sin embargo, cuando se carga la extensión, todavía estoy recibiendo:

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

y los errores de la dependencia 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. 

Instalado Visual C++ Express 2008 y compilado usando v90 plataforma conjunto de herramientas , pero aún enfrenta los mismos problemas.

Algún consejo apreciado :)


solución encontrada! Ver mi respuesta

+0

pregunta de serverfault.com. – Raptor

Respuesta

5

¡Gracias! Espero que esto pueda ayudar a aquellos que compilan extensiones de php en Windows en el futuro. Lo que he hecho se basa en: https://wiki.php.net/internals/windows/stepbystepbuild

Nota: Leí una respuesta en este sitio que dice que la compilación de las extensiones de PHP por sí misma en Windows no es compatible. A partir de mis experimentos de ayer, parece que también hay mucho trabajo, así que estoy usando el proceso de compilación de PHP.

La mejor manera es utilizar el proceso de compilación de PHP.

  1. instalar Visual C++ Express 2008 (cualquier versión funcionará, pero Express es gratis) y Windows SDK 6.1 (nota de que queremos que la versión 6.1 no nada más antigua o más reciente).

  2. Instale SVN client tools si no lo ha hecho y reinicie para que su variable PATH surta efecto.

  3. Obtenga PHP SDK binary tools y extráigalo a C:\php-sdk.

  4. Inicie CMD Shell en Microsoft Windows SDK v6.1 en su menú de inicio y ejecute cd C:\php-sdk.

  5. Ejecute setenv /x86 /xp /release esto crea una versión de 32 bits. Puede usar /x64 para crear una versión de 64 bits (no lo he intentado).

  6. plazo bin\phpsdk_setvars.bat

  7. plazo bin\phpsdk_buildtree.bat php53dev

  8. Descargar el PHP source code y extraerlo a C:\php-sdk\php53dev\vc9\x86 modo que usted termina con C:\php-sdk\php53dev\vc9\x86\php5.3-xyz

  9. Descarga la última deps y extraer todo para C:\php-sdk\php53dev\vc9\x86. Es posible que se le solicite que sobrescriba las carpetas existentes, así que presione sí.

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

  11. Mira la última versión de su extensión desde el repositorio SVN: svn co http://svn.php.net/repository/pecl/imagick/trunk pecl/imagick estoy comprobando a cabo imagick aquí.

  12. Instale cualquier dependencia. En mi caso, necesito instalar ImageMagick, así que descargué el último windows binary recomendado. Tendrá que reiniciar después de la instalación para actualizar su variable PATH, pero puede hacerlo después de haber compilado. Asegúrese de instalar los encabezados C/C++ e incluye también.

  13. Copie los contenidos del directorio includes del directorio de instalación de ImageMagick al C:\php-sdk\php53dev\vc9\x86\deps\include.

  14. Copiar los contenidos del directorio lib desde el directorio de instalación de ImageMagick a C:\php-sdk\php53dev\vc9\x86\deps\lib

  15. Ahora, vamos a construir: ejecutar cd C:\php-sdk\php53dev\vc9\x86\php5.3-xyz continuación buildconf continuación configure --help. Mira la ayuda correctamente. Le mostrará todas las banderas de configuración y cualquier extensión disponible para habilitar. En mi caso, ya he añadido imagick, que tenía una opción llamada --with-imagick

  16. Ejecutar config: configure --enable-cli --with-imagick=shared --disable-zts Si usted quiere construir un binario uso no seguro para subprocesos --disable-zts, retirar de otro modo que el indicador de configuración. No estoy seguro de por qué, pero a veces las extensiones usan el indicador --with-myextension y, a veces, --enable-myextension, por lo tanto, marque configure --help para ver qué indicador usar. Si agrega =shared después del indicador de extensión, se compilará como una DLL separada, que es lo que queremos.

  17. Compilar: ejecutar nmake luego nmake snap.

  18. Hecho :) Compruebe C:\php-sdk\php53dev\vc9\x86\php-5.3.10\Release (no seguro para subprocesos) o C:\php-sdk\php53dev\vc9\x86\php-5.3.10\Release_TS (seguro para subprocesos). Tus binarios compilados deberían estar allí. Las extensiones compiladas (pecl) deben estar en un archivo ZIP similar al pecl-5.3.10-nts-Win32-VC9-x86.zip. Abra este archivo y extraiga la DLL extensio a su carpeta ext en su instalación de PHP.

  19. Habilite la extensión PHP y reinicie su servidor web. Ejecute phpinfo() y verifique que la extensión esté habilitada.

  20. Si la extensión no funciona correctamente, asegúrese de reiniciar para actualizar su variable PATH. En mi caso, necesito tener el directorio de instalación imagemagick en mi variable PATH.

  21. ???

  22. ¡Ganar!

+0

Quiero agradecerle por tomarse el tiempo para escribir esta hermosa pieza de instrucciones. ¡De mucha ayuda! –

0

¿Hay alguna razón que deba compilar? ¿Por qué no descargar? Por lo general, es mucho más simple/más rápido en Windows.

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

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

+0

Probé las compilaciones de Valokuva.org, pero no funcionaron en mi servidor o WAMP instalados manualmente. Los binarios de sk89q.com tampoco funcionaron. Es por eso que quiero compilar 3.1.0b1 contra la última versión de imagemagick. – F21

+0

Quise decir 3.1.0rc1 no 3.1.0b1. – F21

Cuestiones relacionadas