首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将PHP扩展编译为非线程安全的

将PHP扩展编译为非线程安全的
EN

Stack Overflow用户
提问于 2012-04-10 07:06:17
回答 2查看 6.7K关注 0票数 6

我正在尝试编译imagemagick (imagick)扩展,以便在windows上的非线程安全环境中使用。

我正在使用PHP5.3.10,并已将Visual设置为我的编译环境。问题是,我在Apache2.2中使用一个非线程安全的PHP版本作为FCGI模块。

因此,我的PHP是由php5.lib而不是php5ts.lib提供的。我相信这就是我犯这些错误的原因:

代码语言:javascript
复制
imagick.obj : error LNK2019: unresolved external symbol __imp__tsrm_mutex_alloc referenced in function _zm_startup_imagick

我只在linux上构建和编译过东西,所以我不太确定如何在windows环境中实现这一点。

如何编译扩展,使其非线程安全?

我下载了PHP5.3.10的threadsafe二进制文件以获得php5ts.lib的副本。那时,我能够编译这个扩展。

我猜想,将ZTS预处理器指令设置为10将导致扩展编译为线程安全或非线程安全。(对此不太确定,所以如果有人能让我知道这是否正确,我将不胜感激。*)

然后,我设置了一个运行Windows 7的虚拟机,并安装了最新版本的WAMP。原因是它使用了PHP的线程安全版本。

我将dll放在PHP安装的ext文件夹中,并在php.ini中启用它。然而,即使在WAMP中同时尝试ts和nts版本之后,我也会得到:

代码语言:javascript
复制
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,但仍然看到了同样的问题.

同样的问题发生在我在Apache2.2上运行nts版本的PHP 5.3.10的dev机器上(全部手动安装)。

看来我对ZTS预处理器的看法可能是错的。如果我设置了ZTS=0并编译,那么在编译后的dll上使用dependency仍然会显示它需要php5ts.dll,它只存在于present版本中。

我对依赖者做了更多的修改,发现我必须在统计上链接到msvc100d.dll。然后,我在预处理器定义中删除了ZTS,并能够使用php5.lib而不是php5ts.dll进行编译。我觉得这应该能给我一个非ts的dll。

但是,在加载扩展时,我仍然得到:

代码语言:javascript
复制
PHP Warning:  PHP Startup: Invalid library (maybe not a PHP library) 'imagick.dll' in Unknown on line 0

以及依赖遍历器中的错误:

代码语言:javascript
复制
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++ Exchange2008,并使用平台工具包v90编译,但仍然面临相同的问题。

任何小费,请欣赏:)

找到解决方案了!看看我的答案,

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-11 01:45:41

明白了!我希望这能帮助那些将来在windows上编译php扩展的人。我所做的是基于:https://wiki.php.net/internals/windows/stepbystepbuild

注意:我在这个网站上读到了一个答案,上面说不支持在windows上单独编译PHP扩展。根据我昨天的实验,这似乎也是很多工作,所以我正在使用PHP构建过程。

最好的方法是使用PHP构建过程。

  1. 安装2008 (任何版本都可以,但快递是免费的)和WindowsSDK6.1(请注意,我们希望6.1版本,而不是任何旧的或更新的)。
  2. 如果还没有安装SVN客户端工具,请重新启动PATH变量才能生效。
  3. 获取PHP二进制工具并将其解压缩到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. 下载最新的deps并将所有内容解压缩到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++报头,并且还包括在内。
  13. includes目录的内容从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. 运行配置:configure --enable-cli --with-imagick=shared --disable-zts如果您想要构建一个非线程安全的二进制文件使用--disable-zts,否则删除该配置标志。我不知道为什么,但有时扩展使用--with-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)应该在类似于pecl-5.3.10-nts-Win32-VC9-x86.zip的ZIP文件中。打开此文件并将扩展性DLL解压缩到ext安装中的您的文件夹中。
  19. 启用PHP扩展并重新启动and服务器。运行phpinfo()并检查是否启用了扩展。
  20. 如果扩展不能正常工作,请确保重新启动以更新PATH变量。在我的例子中,我需要在我的PATH变量中拥有imagemagick目录。
  21. ???
  22. 利润!
票数 6
EN

Stack Overflow用户

发布于 2012-04-10 16:22:43

有什么需要编译的原因吗?为什么不下载呢?在Windows上,它通常要简单得多/快得多。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10084493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档