【问题标题】:Laravel queue not doing Jobs with DB driverLaravel 队列不使用 DB 驱动程序执行作业
【发布时间】:2021-09-02 02:16:11
【问题描述】:

我有一个问题,我有一份工作,当我在数据库驱动程序上发送时它是已处理的,但它不起作用,它应该使用 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');

【问题讨论】:

  • 这个 env('API_KEY') 似乎不正确,你能做类似这样的 config('app.API_KEY') 并检查一下。在此之前,您必须在 config/app.php 文件中添加 API_KEY,例如 'API_KEY' => env('API_KEY');

标签: php laravel curl laravel-queue


【解决方案1】:

当您将数据库设置为队列驱动程序时,您必须在终端中运行此命令。

php artisan queue:work

或者,您也可以运行此命令

php artisan queue:listen

但前者比后者更有效率。

您可以通过here获取更多信息。

【讨论】:

  • 已经尝试过两种方法,正如我所说,那里正在处理作业,不会进入失败队列
  • 抱歉,我在理解您时遇到了问题。不去失败队列是什么意思?如果您在 .env 文件中设置了 QUEUE_DRIVER=database。然后您必须运行 php artisan queue:table php artisan migrate 以便在您的数据库中创建所有作业和 failed_jobs 表。
  • 作业正在被处理为成功,但带有文件上传的 CURL 部分不起作用,当设置为 SYNC 时它起作用,文件被上传到该服务器。
  • 可能有两个问题,一:队列使用了php-cli,请问php-cli中是否启用了cURL?或者 cURL 可能需要更多时间来处理请求,这就是您的文件没有上传的原因,您可以运行此命令,然后运行 ​​php artisan queue:listen --timeout=60.
猜你喜欢
  • 2016-03-04
  • 2016-12-30
  • 1970-01-01
  • 2017-02-10
  • 2016-09-01
  • 2019-11-28
  • 1970-01-01
  • 1970-01-01
  • 2020-08-26
相关资源
最近更新 更多