PHP多线程模块parallel的编译安装和多线程编程演示

从PHP7开始,多线程编原有的pthreads已经不在维护,而是使用parallel替代。

由于是新的模块,样例代码很少,这里总结一个简单的代码和详细的备注供大家参考。

编译和安装

parallel需要启用ZTS(Zend Thread Safety)的PHP构建版本(使用"--enable-zts"选项,或者在PHP 8.0.0之前的非Windows系统上使用"--enable-maintainer-zts"选项)。

1)下载PHP 7.2或8以上版本的源代码

2)下载parallel源代码,解压到php源代码的exc目录下,将parallel目录名命名为"parallel"

3)在php源码目录下按顺序执行如下命令:

bash 复制代码
./buildconf --force
./configure --enable-zts --enable-parallel --enable-fpm --with-curl --with-openssl
make
make install

其中配置选项--enable-zts --enable-parallel是必要的,其他根据自己需要增减。

安装完毕后,可以看到模块已经安装:

bash 复制代码
php -m
[PHP Modules]
...
parallel
...

使用样例

php 复制代码
<?php
 use \parallel\{Runtime, Future, Channel, Events};

/**
 * 测试并发执行的函数。
 * 该函数模拟并发执行多个任务,并跟踪每个任务的执行情况,直到所有任务完成。
 * 
 * @param int $concurrency 并发执行的任务数量。
 */
function testConcurrency(int $concurrency) {
    // 定义一个睡眠函数,用于模拟耗时操作。
    $sleeper = function (int $seconds) {
        sleep($seconds);
        return $seconds;
    };

    // 初始化用于存储未来结果的数组和运行时对象的数组。
    $futureList = [];
    $runtimeList = [];

    // 创建指定数量的运行时对象。
    for ($i = 0; $i < $concurrency; $i++) {
        $runtimeList[] = new Runtime();
    }

    // 并发执行任务。
    foreach ($runtimeList as $i => $runtime) {
        $seconds = rand(1, 10);
        $futureList[$i] = $runtime->run($sleeper, [$seconds]);
    }

    // 监控所有任务直到完成。
    echo "loop... \n";
    while (true) {
        // 检查每个任务的状态。
        foreach ($futureList as $i => $runtime) {
            if ($runtime->done()) {
                $value = $runtime->value();
                echo "ThreadId: $i Sleep: $value seconds (End)\n";
                unset($runtimeList[$i]);
            }
        }

        // 打印当前运行中的任务数量,并休眠一段时间后继续检查。
        echo count($runtimeList) . " thread is running... \n";
        sleep(2);

        // 如果没有运行中的任务,则结束监控。
        if (empty($runtimeList)) break;
    }
}

$concurrency = 5;

testConcurrency($concurrency);

?>
相关推荐
郑州光合科技余经理1 小时前
本地生活服务系统:成品模块和定制接口怎么划界
java·前端·人工智能·后端·系统架构·php·ai编程
LorryJovens7 小时前
【LAAP科研】CEN因果等价网络理论---从双缝干涉到因果等价
开发语言·php
Casual9 小时前
【网络基础进阶】:看懂子网划分与 VLAN
开发语言·网络·php
0xBADCODE11 小时前
CTF Writeup 合集
安全·web安全·网络安全·系统安全·密码学·php·ctf
IPdodo_14 小时前
静态 IP 访问异常排查:403/429 归因与迁移验收
服务器·网络·数据库·python·网络协议·php·性能测试
砚凝霜15 小时前
【软考信息安全】第二章 网络攻击基础与常见技术方法
网络·安全·php
XR12345678816 小时前
办公组网像“看病“:先问诊,再选型
开发语言·php
JaguarJack18 小时前
现在就值得尝试的 5 个 Laravel 新包
后端·php·laravel·服务端
BingoGo18 小时前
现在就值得尝试的 5 个 Laravel 新包
后端·php
专注API从业者18 小时前
Open‑Claw 实战|无需逆向,快速搭建电商商品监控与数据分析系统
开发语言·数据结构·数据库·数据分析·php