codespede / simple-multi-threader
Requires
- opis/closure: *
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构建,您也可以通过以下步骤使其与该扩展兼容
有两种方法可以实现这一点
-
最简单的方法 - 在闭包中的代码之前插入您平台的引导代码。
$jobId = $threader->thread(function($arguments){ //bootstrap code here.. //your actual code here.. }); -
推荐的方法 - 通过您自己的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 的文件中。您可以在其中找到错误的详细信息,包括堆栈跟踪。