codespede/simple-multi-threader

1.0.1 2020-05-13 20:01 UTC

This package is auto-updated.

Last update: 2024-09-21 20:54:05 UTC


README

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

  • 无需集成任何队列或类似实现
  • 将要在后台处理的代码以闭包(匿名函数)的形式编写(如有参数),并将其提供给扩展。就这么简单。
  • 无需配置即可与Core PHP(普通PHP)、Laravel和Yii2一起使用。
  • 只需添加所需的引导代码,就可以与任何PHP框架/平台一起使用(请参阅此处)。
  • 兼容Windows和*nix(类Unix)系统中的PHP安装

安装

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

运行以下命令之一

composer require codespede/simple-multi-threader

或添加

"codespede/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...之后的代码)将运行,而不必等待子线程(闭包中的代码)完成。您还可以通过方法的返回值(一个md5字符串)获得启动作业的ID,您可以使用它进行调试

闭包函数返回的任何数据都将记录到默认目录(smt-logs)中名为smt_<jobId>.log的文件中。

有关示例,请参阅此处

可配置选项

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

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

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

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

$helperClass - 要使用的Helper的完全限定类名 - 类型:字符串,默认 = "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. 推荐的方法 - 通过您自己的Helper类扩展$helperClass,并在其中包含相应的引导函数,如下所示

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

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

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

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

    就这么简单!executeWordpressBootStrap将在执行您的代码之前执行,允许在闭包中的代码中使用WordPress的原生函数和用法。

    只需执行一次,扩展现在可以在您的应用程序的任何位置执行任何代码(普通和平台相关)。您还可以自由覆盖在 CommandHelper 类中定义的任何附加逻辑。

    欢迎为支持更多平台提出拉取请求!

调试

当从您提供的闭包代码中抛出异常时,它将记录在一个名为 smt_<jobId>_error.log 的文件中。您可以在其中找到错误的详细信息,包括堆栈跟踪。