我已通过以下http://php.net/manual/en/pthreads.installation.php安装了pthread 从 http://windows.php.net/downloads/pecl/releases/pthreads/
我的php信息: - 的phpinfo();
PHP版本5.6.30 编译器:MSVC11(Visual C ++ 2012) 架构:x86 线程安全:已启用
但错误仍然存在..
php -m输出#
php -m PHP警告:PHP启动:pthreads:无法编译模块 with module API = 20121212 PHP使用模块API编译= 20131226这些 选项需要在第0行的Unknown中匹配警告:PHP启动: pthreads:无法使用模块API = 20121212 PHP编译的ini模块 使用模块API = 20131226编译这些选项需要匹配 第0行未知[PHP模块] bcmath bz2日历核心ctype卷曲 date dom ereg exif fileinfo filter ftp gd gettext hash iconv json libxml mbstring mcrypt mhash mysql mysqli mysqlnd odbc
答案 0 :(得分:2)
pthreads对于Web服务器环境(source)不安全: -
我没有在Web服务器环境中禁用pthread来惹恼你;一世 这样做是为了保证你的安全,并且不会改变这个决定。
PHP和Apache不提供正确使用所需的API 安全
如果我明天修补Apache和PHP以包含一些额外的钩子 为了使其安全,你永远无法做到 它规模。
线程不是Apache worker mpm服务器的实用程序,它们是 软件架构的一部分;进入并开始 该体系结构中的其他线程是鲁莽和破坏 该架构能够按原样扩展和运行 意图。
在Apache中使用pthreads是没有意义的,我让它保持工作 在以前的版本中试图降低进入门槛 (每个人都对网络服务器感到满意)。这是一个错误,我的 错误;当你尝试做某事时,线程并不简单 本来就很复杂的简单,你只是让它变得愚蠢。
允许在没有能力的情况下在Apache内部启动线程 使PHP或Apache正确地意识到架构的变化 是辱骂,非常愚蠢。
另一个注意事项,apache2默认以mpm_prefork模式运行,这意味着 - 所以说 - “嘿apache2,请为我分叉多个子进程,但每个用一个线程”
答案 1 :(得分:0)
虽然Hassan Ahmed的回复解释了为什么不应该在Web服务器环境中使用pthread,但这并不是您收到错误的原因。
问题是您下载的pthreads二进制文件不是为您正在使用的PHP版本构建的。这导致pthreads的二进制API与它集成的PHP模块API不匹配。根据您的PHP版本判断,您应该使用2.0.10版本的pthreads,因为这是PHP 5.6版本的最后一个稳定版本。
请注意,不再维护对PHP 5.x版本的pthread的支持。如果您想要最新的错误修复和功能,请使用PHP 7.x和pthreads v3。