2024 年 PHP 日本大会

简介

pthreads 是一个面向对象的 API,它提供了 PHP 中进行多线程处理所需的所有工具。PHP 应用程序可以创建、读取、写入、执行线程、工作线程和线程化对象,并与之同步。

警告

此扩展被认为是未维护且已失效的。

提示

建议改用 parallel

警告

pthreads 扩展不能在 Web 服务器环境中使用。因此,PHP 中的线程处理仅限于基于 CLI 的应用程序。

警告

pthreads (v3) 只能与 PHP 7.2+ 一起使用:这是因为在 7.0 和 7.1 中 ZTS 模式是不安全的。

Threaded 类构成了 pthreads 运行功能的基础。它为程序员提供了同步方法和一些有用的接口。

Thread 类允许通过简单地扩展它并实现 run 方法来创建线程。任何成员都可以通过对线程的引用被任何上下文写入和读取。任何上下文也可以执行任何公共和受保护的方法。当从创建它的上下文中调用实现的 Thread::start() 方法时,将在线程中执行 run 方法的主体。只有创建线程的上下文才能启动和加入它。

Worker 类具有持久状态,并且从调用 Thread::start()(继承的方法)开始一直可用,直到对象超出作用域或显式关闭(通过 Worker::shutdown())。任何具有对工作线程对象的引用的上下文都可以将任务堆叠到工作线程(通过 Worker::stack()),这些任务将在工作线程的单独线程中执行。工作线程对象的 run 方法将在工作线程堆栈上的任何对象之前执行,从而可以初始化待执行对象可能需要的资源。

Pool 类用于创建一组工作线程,以在其间分配 Threaded 对象。这是在 PHP 应用程序中使用多个线程最简单、最有效的方法。

注意

Pool 类不扩展 Threaded 类,因此基于池的对象被视为普通的 PHP 对象。因此,不应在不同的上下文之间共享它的实例。

Volatile 类是 pthreads v3 的新增功能。它用于表示 Threaded 类中可变的 Threaded 属性(因为这些属性现在默认为不可变)。它还用于在 Threaded 上下文中存储 PHP 数组。

在进行线程处理时,同步是一个重要的能力。pthreads 创建的所有对象都具有内置同步功能(这对于 Java 程序员来说很熟悉),其形式为 Threaded::wait()Threaded::notify()。在对象上调用 Threaded::wait() 将导致上下文等待另一个上下文在同一对象上调用 Threaded::notify()。此机制允许在 PHP 中的 Threaded 对象之间进行强大的同步。

注意

任何打算在应用程序多线程部分中使用的对象都应该扩展 Threaded

数据存储:根据经验法则,任何可以序列化的数据类型都可以用作 Threaded 对象的成员,它可以从具有对 Threaded 对象引用的任何上下文读取和写入。并非所有类型的数据都是按顺序存储的,基本类型以其真实形式存储。复杂类型、数组和非 Threaded 对象按顺序存储;它们可以从任何具有对 Threaded 对象引用的上下文读取和写入到 Threaded 对象。除了 Threaded 对象之外,用于设置 Threaded 对象成员的任何引用都与 Threaded 对象中的引用分开;任何具有对 Threaded 对象引用的上下文都可以随时直接从 Threaded 对象读取相同的数据。

静态成员:创建新的上下文(线程或工作线程)时,它们通常会被复制,但出于安全原因,具有内部状态的资源和对象会被清除。这允许它们充当一种线程局部存储。例如,在启动上下文时,其静态成员包含数据库服务器的连接信息和连接本身的类,将只会复制简单的连接信息,而不是连接本身。允许新上下文以与创建它的上下文相同的方式启动连接,并将连接存储在相同的位置,而不会影响原始上下文。

注意

当执行 print_r、var_dump 和其他对象调试函数时,它们不包含递归保护。

注意:

资源:在 PHP 中定义资源的扩展和功能完全没有为这种环境做好准备;pthreads 允许在上下文之间共享资源,但是,对于大多数类型的资源,应该认为它是不安全的。在上下文之间共享资源时,应格外小心谨慎。

注意

在 pthreads 执行的环境中,需要一些限制才能提供稳定的环境。

添加注释

用户贡献的注释 1 条注释

匿名
5 年前
pthreads 和 parallel 的创建者 Joe Watkins 在今年 2 月(2019 年)宣布,由于架构缺陷,pthreads 将不再维护 PHP 7.4 之后的版本。

将来,应该使用 parallel 而不是 pthread。

公告
https://github.com/krakjoe/pthreads/issues/929#issue-410636734
To Top