Windows PHP 安装 pthreads 扩展

注意:
现在仅支持 PHP 7.2+ 这是由于 PHP 7.0 和 7.1 上的 ZTS 模式存在安全问题。
摘自:https://github.com/krakjoe/pthreads

停止 PHP 7.4 的 pthread 开发
我不再打算维护 pthread,也不想鼓励对其进行维护:我认为,这样做被设计所破坏并加以修复,根本不值得。
我已经开始开发与未来兼容的新扩展程序:https://github.com/krakjoe/parallel
尽管它与 pthreads 不兼容,也不会兼容,但我认为它是即将到来的 PHP 版本的唯一可行替代品,而我的重点必须放在这上面。
当 7.4 于今年年底进入 RC 阶段时,该存储库将被存档,并且在 PECL 或此存储库中不会再发布 pthread。

感谢贡献者对 pthread 所做的所有努力,您辛勤工作,我对此表示赞赏,并且我想请今天专注 pthread 的任何人都将重点转移到未来和 parallel。
接自:https://github.com/krakjoe/pthreads/issues/929


pthreads 是一组允许用户在 PHP 中使用多线程技术的面向对象的 API。 它提供了创建多线程应用所需的全套工具。 通过使用 Thread, Worker 以及 Threaded 对象,PHP 应用可以创建、读取、写入以及执行多线程应用,并可以在多个线程之间进行同步控制。

建议使用 parallel 作为替代。

不可以在 web 服务器环境中使用 pthreads 扩展, PHP 多线程开发仅限于命令行模式的应用。

只能在 PHP 7.2+ 版本中使用 pthreads (v3) 扩展, 在 PHP 7.0 和 7.1 版本中,ZTS 模式是不安全的。

摘自:
https://www.php.net/manual/zh/intro.pthreads.php

本文以 php 5.6.9 为示例,7.0 也可按如下进行。

1、确定当前是否安装

C:\Users\Administrator>D:\php\php-5.6.9\php -m | grep pt
mcrypt
pthreads

如果存在 pthreads 则表明已经安装。

2、确定 PHP 编译信息

C:\Users\Administrator>D:\php\php-5.6.9\php -i | more

你可以看到 phpinfo() 信息。需要留意:

Compiler => MSVC11 (Visual C++ 2012)
Architecture => x86
PHP API => 20131106
PHP Extension => 20131226
Zend Extension => 220131226
Zend Extension Build => API220131226,TS,VC11
PHP Extension Build => API20131226,TS,VC11

由此可知
x86 环境,MSVC11 编译的并且是线程安全的(TS),API版本是 API220131226;如果是 NTS 则表明是非线程安全的。将不能使用 pthreads 扩展。
另外 pthreads 只能在 CLI 模式下使用。

在 https://windows.php.net/downloads/pecl/releases/pthreads/ 手动筛选
版本对应关系。

也可以通过此表:

PHP 版本pthreads 版本下载
以下列表仅供参考,并不保证最新,请手动查询最新版本
7.0-ts-vc14-x642.0.9下载
5.4-ts-vc9-x86
5.5-ts-vc11-x64
5.5-ts-vc11-x86
5.6-ts-vc11-x64
5.6-ts-vc11-x64
5.6-ts-vc11-x86
7.0-ts-vc14-x643.1.6下载
7.0-ts-vc14-x86
7.2-ts-vc15-x643.2.0下载
7.2-ts-vc15-x86

3、下载对应版本

像 PHP 5.6 人工对比,对应 2.0.9。

则在,
php_pthreads-2.0.9 中,
php_pthreads-2.0.95.6tsvc11x86.zip,便是所需要的扩展。
其中:2.0.9 是 pthreads 版本。5.6 是 PHP 版本 TS 表明是线程安全。vc11 表明编译器,x86 表明编译环境。
这些基于信息 php -i 中的信息一致才可以。

否则会报,

加载错误的扩展在 php -v 命令时,会报以下错误:
PHP Warning: PHP Startup: Unable to load dynamic library ‘D:/php/php-5.6.9/ext\php_pthreads.dll’

或者,类似以下报错消息:
PHP Warning: PHP Startup: pthreads: Unable to initialize module
Module compiled with module API=20121212
PHP compiled with module API=20131226
These options need to match in Unknown on line 0

这都表明 php_pthreads 版本号、编译环境、API 版本不一致。你需要下载正确版本的扩展。

4、复制 dll 文件

打开下载的压缩包:
并将 php_pthreads.dll 复制到 php-5.6.9\ext 目录下。
将 pthreadVC2.dll 复制到 php-5.6.9 目录下。

5、修改配置

php.ini 配置文件中,搜索 extension_dir 项,
找到

;extension_dir = “ext”

并删除前面的 ; 号。

extension_dir = “ext”

搜索 Windows Extensions 项,他的下方有很多已经加载的扩展(dll 文件),在其中新增一行:

extension=php_pthreads.dll

保存配置配置,并在命令行中,输入 php -v 无报错,将显示 PHP 版本信息,表明扩展加载成功。

至此本文结束。

另外,Linux 下参考:

相关: