Очередь Laravel не выполняет задания с драйвером БД

#php #laravel #curl #laravel-queue

Вопрос:

У меня проблема, у меня есть задание, которое, когда я отправляю драйвер базы данных, он обрабатывается, но не работает, он должен загрузить файл с Curl. Если я сделаю это с синхронизацией драйверов, это сработает. Поскольку ошибок нет, я не знаю, как разобраться в этом с драйвером БД. Это тестовый новый проект, я думал, что он может быть из другого кода, но похоже, что нет. Это код из маршрутов web.php

 <?php

use IlluminateSupportFacadesRoute;
use GuzzleHttpClient;
use IlluminateHttpRequest;
use IlluminateContractsQueueShouldQueue;
use IlluminateFoundationBusDispatchable;
use IlluminateQueueInteractsWithQueue;
use IlluminateQueueSerializesModels;
use IlluminateBusQueueable;
/*
|--------------------------------------------------------------------------
| 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');
 

Комментарии:

1. Этот env(‘API_KEY’) кажется неправильным, можете ли вы сделать что-то вроде этой конфигурации(‘app. API_KEY’) и проверьте. Перед этим вы должны добавить API_KEY в config/app.php файл, подобный этому ‘API_KEY’ => env(‘API_KEY’);

Ответ №1:

Когда вы устанавливаете базу данных в качестве драйвера очереди, вам необходимо выполнить эту команду в терминале.

 php artisan queue:work
 

Кроме того, вы также можете выполнить эту команду

 php artisan queue:listen
 

Но первое более эффективно, чем второе.

Вы можете получить более подробную информацию здесь.

Комментарии:

1. Уже пробовал с обоими, как я уже сказал, там говорится, что задания обрабатываются, а не попадают в неудачную очередь

2. Извините, у меня возникли проблемы с пониманием вас. Что вы имеете в виду, говоря «не попадать в неудачную очередь»? Если вы установили QUEUE_DRIVER=база данных в файле .env. Затем вы должны запустить очередь php artisan:таблица php artisan migrate, чтобы в вашей базе данных были созданы все таблицы job и failed_jobs.

3. Задания обрабатываются как успешные, но часть CURL с загрузкой файлов не работает, и когда она настроена на СИНХРОНИЗАЦИЮ, файл загружается на этот сервер.

4. Могут возникнуть две проблемы, одна из которых: очередь использует php-cli, можете ли вы проверить, включен ли cURL в php-cli? или может быть возможно, что cURL занимает больше времени при обработке запроса, поэтому ваш файл не загружается. вы можете выполнить эту команду, а затем очередь php artisan:listen —timeout=60.