muhammads92 / simple-multi-threader
Requires
- opis/closure: *
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之上,您也可以通过以下步骤使其与该扩展兼容
有两种方法可以完成此操作
-
最简单的方法 - 在闭包中的代码之前插入您平台的引导代码。
$jobId = $threader->thread(function($arguments){ //bootstrap code here.. //your actual code here.. });
-
推荐方法 - 扩展
$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
进行记录。你可以在其中找到错误的详细信息,包括堆栈跟踪。