php - Laravel 队列不使用 DB 驱动程序执行作业
问题描述
我有一个问题,我有一项工作,当我在数据库驱动程序上调度时它是已处理的,但它不起作用,它应该使用 Curl 上传一个文件。如果我使用驱动程序同步它可以工作。由于没有错误,我不知道如何使用数据库驱动程序来解决。这是一个测试新项目,我认为它可能来自其他代码,但看起来不是。这是来自路由 web.php 的代码
<?php
use Illuminate\Support\Facades\Route;
use GuzzleHttp\Client;
use Illuminate\Http\Request;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Bus\Queueable;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
class UploadFile implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $filename, $url;
public function __construct($filename, $url)
{
$this->filename = $filename;
$this->url = $url; }
public function upload(){
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => $this->url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => array('did' => 0,'file[]'=> new \CURLFILE($this->filename)),
CURLOPT_HTTPHEADER => array(
'Authorization: Bearer ' . env('API_KEY')
),
));
curl_exec($curl);
curl_close($curl);
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
$this->upload();
}
}
class Upload
{
function __construct()
{
$this->getServer();
}
function getServer(){
$client = new Client();
$response = $client->get("https://api.website.com/v1/upload/get_server.cgi" ,[
'headers' => [
"Content-Type" => "application/json",
]
]);
$response = json_decode($response->getBody()->getContents());
$this->url = $response->url . '/upload.cgi?id=' . $response->id;
}
public function uploadFile(Request $request){
// Validation
$request->validate([
'file' => 'required|mimes:zip,png,jpg,jpeg,csv,txt,pdf'
]);
if($request->file('file')) {
$file = $request->file('file');
$filename = time().'_'.$file->getClientOriginalName();
$file->move(base_path('public'),$filename);
Session::flash('message','Upload Successfully.');
Session::flash('alert-class', 'alert-success');
UploadFile::dispatch($filename, $this->url);
}else{
Session::flash('message','File not uploaded.');
Session::flash('alert-class', 'alert-danger');
}
return redirect()->route('home');
}
}
Route::get('/', function () {
return view('welcome');
})->name('home');
Route::post('/uploadFile', [Upload::class, 'uploadFile'])->name('uploadFile');
解决方案
当您将数据库设置为队列驱动程序时,您必须在终端中运行此命令。
php artisan queue:work
或者,您也可以运行此命令
php artisan queue:listen
但前者比后者更有效率。
您可以在此处获取更多信息。
推荐阅读
- clojure - 原子在 Maclisp 中具有属性。如何在 Clojure 中做同样的事情?
- sql - 在 proc sql 中删除多个表(通过 teradata)
- c# - 检查列表中的特定列是否有重复项,跳过空值或空值
- image - Qt - 修改 qsvg 插件以支持带有 AnimatedImage 的动画,可能吗?
- asp.net-web-api - .net core 3.1 web api 的 SSO
- java - 插入嵌入文档而不阅读整个文档 - spring,mongo
- .net - 如何将 WPF 应用程序窗口固定到桌面,它不应该在 Window + D 上最小化(显示桌面)
- docker - 运行构建时Docker env_file不起作用
- ios - 通过使用 didSet 方法或在 iOS、Swift 中使用函数将数据绑定到 tableview 单元 iOS 时有什么区别
- java - 将 .pcm 文件转换为 .wav 文件