выполнить задание очереди без остановки с помощью моего ViewComposer, которым я делюсь (*), используя pm2 - PullRequest
1 голос
/ 10 ноября 2019

пытается предотвратить передачу заданий в очереди с помощью ViewComposer в laravel с использованием pm2.

Проблема: setCookie не был применен, потому что (я думаю) нет сеанса от доступа к внешним вызовам (pm2).

позвольте мне объяснить:

также делюсь с вами этой частью моего приложения.

У меня есть работа в очереди, которая отправляет динамические электронные письма(шаблоны и параметры почты) в моем ServiceController , также, когда я возвращаюсь к любому из них, я делюсь необходимыми данными со всеми представлениями, поэтому я создал ViewComposer , вызываемый любым представлением (*)в AppServiceProvider , внутри этого ViewComposer , я использую черту, которая также использует много черт, для сбора данных, которые мне нужны для представлений.

  • , когдаЯ перемещаюсь в своем приложении, все выглядит нормально.

  • при реализации любой задачи, которая использует задания в очереди, в моем случае отправка электронного письма:

    при запуске php artisan queue: работа все работает фия тоже получаю письма.

НО

  • , когда я использую pm2 deamon, который вызывает те очереди, которые он запускаетисключение: ( setCookie не был применен ), связанный с этой чертой, которую я использую в view composer.

Я знаю, что мне сложно это объяснить, но я действительноздесь нужна помощь.

вот мой код:

  • путь pm2: / (корень сервера)
  • путь к приложению: / prod

  • виртуальный хостинг с ssh.

1. AppServiceProvider

    use Illuminate\Support\ServiceProvider;
    use Illuminate\Support\Facades\Schema;

    class AppServiceProvider extends ServiceProvider
    {
       public function register()
       {
         Schema::defaultStringLength(191);
       }

       public function boot()
       {
          view()->composer('*',
          'App\Http\ViewComposers\MasterComposer');
       }
    }

2. WebsiteComposer:

    namespace App\Http\ViewComposers;
    use Illuminate\Http\Request;
    use Illuminate\Support\Facades\Cache;
    use App\Website;
    use other_traits;

     trait WebsiteComposer 
     {
        use other_traits;
       protected function Get_Website(Request $request) 
       {
         //some code by calling other traits;
         // $results= get client websitestuff;

         $this->website= $results;

       }
     }         

3. MasterComposer:

     namespace App\Http\ViewComposers;
     use Illuminate\View\View;
     use Illuminate\Http\Request;

     class MasterComposer
     {
        use WebsiteComposer; 
        public $web=[];

        public function __construct()
        {
        }

        public function compose(View $view)
        { 
          //to prevent external views( email templates located in 
          //views/emails from passing by getting website process...

           if(!starts_with($view->getName(), 'emails'))
           {
             //here where exception fired using pm2 

             $this->Get_Website(request());
             $this->web=$this->website;
           }

           View::share('website', $this->web);
        }
      }

4. ServiceContorller:

(начало процесса)

       // POST PROCESS then Calling this function :

       public function EmailDispatcher($data,Request $request)
       {
          //some code...
          dispatch(function () use ($data) {
          dispatch(new GuestMailerJob($data));
          });

         return redirect('somview');
       }

5. GuestMailerJob:

   namespace App\Jobs;
   use App\Mail\GuestMailer;
   // needed uses...

   class GuestMailerJob implements ShouldQueue
   {
     use Dispatchable, InteractsWithQueue, Queueable, 
     SerializesModels,GuestMailer;

       protected $data;
       public $tries = 3;
       public $timeout = 10;

       public function retryUntil()
       {
          return now()->addSeconds(12);
       }

       public function __construct(Array $data)
       {
          $this->data=$data;
       }

       public function handle()
       {
          $this->sendEmail($this->data);
       }
   }

6. GuestMailer:

   namespace App\Mail;
   use Illuminate\Http\Request;
   use Mail;

   trait GuestMailer 
   {
      protected function sendEmail(array $all) 
      { 
          $toview = array( 

            'title' => $all["title"],
            'other_attributes' => $all["other_attributes"]
          );

           Mail::send( [$all["template"]=> $all['view']],$toview,

           function ($message)  use($all)
           { 
             $message->from( $all['from'],$all['nameFrom'] );
             $message->subject( $all['subject'] );
             //other params...
            }

          });
      }
    }

7. исполняемый файл pm2: mail-worker.yml

         //located in: (/prod)
         //mail-worker.yml content:


           apps:
             - name: mail-worker
             script: artisan
             exec_mode: fork
             interpreter: php
             instances: 1
           args:
             - queue:work
             - --tries=1
             - --sleep=1

8: ремесленник Очистка

       all php artisan cleaners are implemented

       ex : php artisan clear-compiled
            php artisan queue:restart

9: pm2 Конфигурация:

           pm2 start mail-worker.yml
           pm2 monit

10 - состояние pm2:

       id    name            mode   reload   status   cpu   memory

       0     mail-worker     fork   1        online   0%    6.5mp

работает с php artisan queue: работа / прослушивание, но с pm2 здесь исключение.

pm2 Результат:

Whoops \ Run :: handleError ("Метод trait setCookie не был применен,
/app_base_path/PRODMAAN/vendor/filp/whoops/src/Whoops/Run.ph x Whoops \Run :: handleShutdown () [internal]: 0

failed_Jobs result:

Подсветка \ Queue \ MaxAttemptsExceededException: App \ Jobs \ GuestMailerJob имеетБыла предпринята попытка слишком много раз или слишком долго. Возможно, задание ранее было приостановлено.

В чем проблема?

Спасибо за любые советы по поводуструктура кода тоже.

...