我正在尝试调试 Laravel 队列中的作业,但没有成功。我想将输出打印到控制台。例如您如何在其他地方使用
dd()
。
<?php
namespace App\Jobs;
use App\Image;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
class ProcessImage implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $image;
/**
* Attempt the job a maximum of twice
*
* @var int
*/
public $tries = 2;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct(Image $image)
{
$this->image = $image;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
// set paths for standard and thumbnail size images
$image = public_path("assets" . DIRECTORY_SEPARATOR . $this->image->original);
$product_id = $this->image->id;
$product_path = public_path("assets" . DIRECTORY_SEPARATOR . "images" . DIRECTORY_SEPARATOR .
"products" . DIRECTORY_SEPARATOR . $product_id);
$thumbnail_path = $product_path . DIRECTORY_SEPARATOR . "thumbnail";
if(!is_dir($product_path))
mkdir($product_path);
if(!is_dir($thumbnail_path))
mkdir($thumbnail_path);
// Resize and save the standard image
$standard = \Image::make($image)->resize(450, 450, function($constraint)
{
$constraint->aspectRatio();
})->save($product_path);
dd($standard);
}
}
运行
php artisan queue:restart
- 如果您将队列作为守护进程运行,则每次代码更改时都需要重新启动侦听器,因为守护进程将代码加载到内存中。
dump()
、dd()
和Log::info()
应该在队列中工作。确保逐步调试 - 在作业开始时登录,然后再低一点、再低一点,等等,看看最后注销的点是什么。
排队任务中
dump()
和dd()
的输出被发送到storage/logs/worker.log
。 Log::info()
输出发送到位于 storage/logs/laravel.log
的常用日志。
使用laravel望远镜查看更多细节
如果你想使用 PHP Storm 调试 Laravel Job 编辑
.env
文件:
QUEUE_DRIVER=sync
在
handle()
函数中放置一个断点。
我所做的是记录需要查看的信息,就像您的情况一样:
\Log::info('Making new directory');
或者
\Log::info('this is new image: ', [$standard]);
等等。只需打开日志信息并查看代码在哪里中断或应该起作用的条件不起作用。
我使用 print_r() 可以完成这项工作。
我用两种方式做到了:
通过方法
Cache
使用 put()
外观。接下来,您可以使用 Cache::get($cacheKey);
获得它。在这里我可以传递任何数据类型:Collections、arrays、integer、string等
通过方法
Log
使用 debug()
外观。第一个参数是消息,第二个参数是上下文仅限数组类型。
第一个变体更容易调试各种数据,但第二个变体更容易获取调试信息。我更喜欢第一个变体:)