muhammads92/simple-multi-threader

1.0.3 2020-09-10 21:23 UTC

This package is auto-updated.

Last update: 2024-09-11 06:44:34 UTC


README

这是一个简单的PHP多线程扩展,无需任何设置或配置即可使用。

  • 无需集成任何队列或类似实现
  • 将您想后台处理的代码写入闭包(匿名函数)中,并带有(如果有)参数,并将其提供给扩展。这就足够了。
  • 与Core PHP(普通PHP)、Laravel和Yii2无缝兼容。
  • 只需添加所需的引导代码,即可与任何PHP框架/平台一起工作(请参阅这里)。
  • 兼容Windows和*nix(类Unix)系统中的PHP安装

安装

安装此扩展的首选方式是通过composer

运行以下命令之一

composer require muhammads92/simple-multi-threader

"muhammads92/simple-multi-threader": "*"

将其添加到您的composer.json文件中的require部分。

使用方法

如果您想在后台运行一些代码,只需将其作为一个闭包(匿名函数)提供给Threader类的对象,如下所示

$threader = new cs\simplemultithreader\Threader(['arguments' => ['myObject' => new \stdClass, 'myArray' => ['a', 'b', 'c']]]);
$jobId = $threader->thread(function($arguments){
	//your code here..
 	//you can access any of the above given $arguments here like $arguments['myObject'] or $arguments['myArray']
});

这就足够了,Threader将在指定的$jobsDir中创建所需的作业文件,并在后台启动一个PHP进程执行您的代码。主线程(上述和$threader->thread...之后的代码)将运行,而无需等待子线程(闭包中的代码)完成。您还将获得启动作业的ID(一个md5字符串),它是thread方法返回的值,您可以使用它进行调试

闭包函数返回的任何数据都将记录到以smt_<jobId>.log为名的文件中,该文件存储在默认的日志目录smt-logs中。

可配置选项

$arguments - 闭包的参数 - 类型:mixed,默认 = null

$jobsDir - 存储临时作业文件的目录(如果不存在则自动创建) - 类型:string,默认 = "smt-jobs"

$logsDir - 存储日志文件的目录(如果不存在则自动创建) - 类型:string,默认 = "smt-logs"

$nohup - 是否在基于Unix的系统上忽略HUP(挂起)信号 - 类型:boolean,默认 = true

$helperClass - 要使用的Helper的完全限定类名 - 类型:string,默认 = "cs\\simplemultithreader\\CommandHelper"

以上任何选项都可以按照以下方式配置Threader

$threader = new cs\simplemultithreader\Threader(['jobsDir' => 'MyJobsDir', 'helperClass' => '\namespace\of\MyHelperClass']);

$threader = new cs\simplemultithreader\Threader;
$threader->arguments = ['myObject' => new \stdClass, 'myArray' => ['a', 'b', 'c']];
$threader->jobsDir = 'MyJobsDir';
...

使其与您使用的平台兼容

即使您的应用程序不是建立在已支持的Core PHP、Laravel或Yii2之上,您也可以通过以下步骤使其与该扩展兼容

有两种方法可以完成此操作

  1. 最简单的方法 - 在闭包中的代码之前插入您平台的引导代码。

    $jobId = $threader->thread(function($arguments){
       //bootstrap code here..
       //your actual code here..
    });
    
  2. 推荐方法 - 扩展$helperClass以包含您自己的Helper类,并在其中包含相应的引导函数,如下所示

    假设您使用的平台是WordPress。在扩展的类中创建一个函数,如下所示

    public function executeWordpressBootStrap(){
       //code required to bootstrap Wordpress..
    }
    

    并覆盖getPlatform方法,仅返回字符串'wordpress'(因为在该应用程序中您只使用了WordPress),如下所示

    public function getPlatform(){
        return 'wordpress';
    }
    

    这就足够了!executeWordpressBootStrap将在执行您的代码之前执行,允许在闭包中的代码中使用WordPress的本地函数和用法。

    只需这样做一次,扩展程序现在就可以在任何地方执行任何代码(普通和平台相关)了。你还将获得覆盖在 CommandHelper 类中定义的任何额外逻辑的自由。

    欢迎提交支持更多平台的Pull Requests!

调试

当你的代码在闭包中抛出异常时,它将使用文件名 smt_<jobId>_error.log 进行记录。你可以在其中找到错误的详细信息,包括堆栈跟踪。