多线程的使用(基于parallel扩展)

  PHP官方警告:不要在web服务器环境中使用parallel扩展或pthreads扩展,PHP多线程仅限于应用在CLI模式。
  PHP官方警告:不要在web服务器环境中使用parallel扩展或pthreads扩展,PHP多线程仅限于应用在CLI模式。
  PHP官方警告:不要在web服务器环境中使用parallel扩展或pthreads扩展,PHP多线程仅限于应用在CLI模式。
 
  PHP官方推荐使用parallel扩展作为pthreads扩展的替代品。



  parallel扩展的基本使用:

<?php
//========== 启动线程① ==========//
$task = static function (string $name, string $gender, int $age): void {
    echo "俺叫{$name}{$gender}),今年{$age}岁。" . PHP_EOL;
};
$argv = ['张三', '男', 18];
$future1 = parallel\run($task, $argv); // 俺叫张三(男),今年18岁。


//========== 启动线程② ==========//
$future2 = parallel\run(static function (string $name, string $gender, int $age): void {
    echo "俺叫{$name}{$gender}),今年{$age}岁。" . PHP_EOL;
}, ['李四', '女', 17]);


// [root@localhost ~]# /program/php/bin/php /inetpub/wwwroot/parallel/demo.php
// [root@localhost ~]# 俺叫张三(男),今年18岁。
// [root@localhost ~]# 俺叫李四(女),今年17岁。
// [root@localhost ~]#


  parallel扩展的使用示例:

<?php
$id = 'parallel-1';
parallel\run(static function (string $id): void {
    $counter = 0;

    // 每1秒钟在当前目录下生成一个名为“parallel.*.tmp”的文件,最多生成10个文件
    while (true) {
        if ($counter > 9) {
            break;
        }

        $file = "$id.$counter.tmp";
        $size = file_put_contents(__DIR__ . "/$file", '');
        if ($size !== false) {
            echo "{$id}生成文件[$file]成功" . PHP_EOL;
        } else {
            echo "{$id}生成文件[$file]失败" . PHP_EOL;
        }

        $counter++;

        sleep(1);
    }

    echo "线程任务($id)已完成" . PHP_EOL;
}, [$id]);
echo "线程任务($id)已启动" . PHP_EOL;


$id = 'parallel-2';
parallel\run(static function (string $id): void {
    $counter = 0;

    // 每1秒钟在当前目录下生成一个名为“parallel.*.tmp”的文件,最多生成10个文件
    while (true) {
        if ($counter > 9) {
            break;
        }

        $file = "$id.$counter.tmp";
        $size = file_put_contents(__DIR__ . "/$file", '');
        if ($size !== false) {
            echo "{$id}生成文件[$file]成功" . PHP_EOL;
        } else {
            echo "{$id}生成文件[$file]失败" . PHP_EOL;
        }

        $counter++;

        sleep(1);
    }

    echo "线程任务($id)已完成" . PHP_EOL;
}, [$id]);
echo "线程任务($id)已启动" . PHP_EOL;


// [root@localhost ~]# /program/php/bin/php /inetpub/wwwroot/parallel/demo.php
// 线程任务(parallel-1)已启动
// 线程任务(parallel-2)已启动
// parallel-2生成文件[parallel-2.0.tmp]成功
// parallel-1生成文件[parallel-1.0.tmp]成功
// parallel-2生成文件[parallel-2.1.tmp]成功
// parallel-1生成文件[parallel-1.1.tmp]成功
// parallel-2生成文件[parallel-2.2.tmp]成功
// parallel-1生成文件[parallel-1.2.tmp]成功
// parallel-2生成文件[parallel-2.3.tmp]成功
// parallel-1生成文件[parallel-1.3.tmp]成功
// parallel-1生成文件[parallel-1.4.tmp]成功
// parallel-2生成文件[parallel-2.4.tmp]成功
// parallel-1生成文件[parallel-1.5.tmp]成功
// parallel-2生成文件[parallel-2.5.tmp]成功
// parallel-1生成文件[parallel-1.6.tmp]成功
// parallel-2生成文件[parallel-2.6.tmp]成功
// parallel-1生成文件[parallel-1.7.tmp]成功
// parallel-2生成文件[parallel-2.7.tmp]成功
// parallel-2生成文件[parallel-2.8.tmp]成功
// parallel-1生成文件[parallel-1.8.tmp]成功
// parallel-2生成文件[parallel-2.9.tmp]成功
// parallel-1生成文件[parallel-1.9.tmp]成功
// 线程任务(parallel-1)已完成
// 线程任务(parallel-2)已完成
// [root@localhost ~]#


//========== 总结 ==========//
// 1、使用线程执行任务并不是把任务扔到后台执行然后程序立即退出,而是任务并发执行不会产生阻塞,程序必须等所有线程任务执行完了才会退出,
//    也就是说如果某个线程任务里面有死循环且没有退出条件,那么程序将会永远执行下去不会退出。

Copyright © 2024 码农人生. All Rights Reserved