如何在Laravel中使用spatie/async运行任务 解决受保护属性返回null问题
PHP异步并行任务属性返回null问题排查及解决
核心问题汇总
- 类属性定义语法错误:属性声明行开头多写了多余的
$符号,不符合PHP类属性定义规范,导致属性未被正确注册 - 构造函数拼写错误且未赋值:构造函数名拼写为
__contruct(正确为__construct),且传入的$arrayData参数未赋值给类的受保护属性,导致属性初始化就为null - 异步闭包未捕获外部变量且变量名大小写错误:控制器中async匿名函数未通过
use关键字捕获外部的$fileInfo变量,同时内部变量名写为小写的$fileinfo(和外部驼峰命名不一致),导致传入Task构造函数的参数为null - configure方法存在语法错误:
require语句末尾使用了逗号而非分号,第二行加载app的语句也缺少结尾分号,会导致框架初始化失败,相关服务属性无法赋值 - 异步任务未主动执行初始化和业务方法:创建Task实例后未调用
configure方法初始化框架,也未调用run方法执行业务逻辑,导致$services和$result属性始终为初始化的null值
修正后的Task类代码
// 移除属性前多余的$符号 protected $arrayData; protected $services; protected $result; // 修正构造函数拼写,新增属性赋值逻辑 public function __construct($arrayData) { $this->arrayData = $arrayData; } // 修正语法错误 public function configure() { require __DIR__ . '/../../vendor/autoload.php'; $app = require_once __DIR__.'/../../bootstrap/app.php'; $kernel = $app->make(\Illuminate\Contracts\Http\Kernel::class); $kernel->handle(...); } // 按要求实现的run方法 public function run() { // 可根据业务需求使用$this->arrayData处理逻辑 $user = new User(); $this->services = new HandleServices(); $this->result = $this->services->run($user); return $this->result; }
修正后的控制器代码
public function handleParallel() { $pool = Pool::create(); foreach($fileInfos as $fileInfo) { // 用use关键字捕获外部变量,修正变量名大小写 $pool[] = async(function() use ($fileInfo) { $task = new Task($fileInfo); // 主动调用初始化方法和业务方法 $task->configure(); return $task->run(); }); } $result = $pool->await(); return $result; }
内容的提问来源于stack exchange,提问作者Gon Killua
相关产品推荐
相关产品推荐

