Запуск cronjob с Laravel 5.6 (с помощью планировщика) - PullRequest
0 голосов
/ 04 июля 2018

В моем приложении у меня есть несколько задач, которые должны запускаться автоматически с заданными интервалами. Поэтому моей непосредственной мыслью было: я мог бы создать работу cron на сервере.

Я начал с чтения нескольких статей:

А также документация Laravel по планированию.

Я пытаюсь, чтобы посты Facebook и Twitter загружались в базу данных из API.

Обновление Facebook и Twitter

<?php
namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;

use App\Article;
use App\TwitterPost;
use App\FacebookPost;
use Twitter;

class UpdateSocial extends Command
{
  /**
   * The name and signature of the console command.
   *
   * @var string
   */
  protected $signature = 'update:social';

  /**
   * The console command description.
   *
   * @var string
   */
  protected $description = 'Updates facebook and twitter feeds to DB';

  /**
   * Create a new command instance.
   *
   * @return void
   */
  public function __construct()
  {
    parent::__construct();
  }

  public function updateFacebook()
  {

      //Access token
      $access_token = 'secret';
      //Request the public posts.
      $json_str = file_get_contents('https://graph.facebook.com/v3.0/NewableGroup/feed?access_token='.$access_token);
      //Decode json string into array
      $facebookData = json_decode($json_str);

      //For each facebook post
      foreach($facebookData->data as $data){

          //Convert provided date to appropriate date format
          $fbDate = date("Y-m-d H:i:s", strtotime($data->created_time));
          $fbDateToStr = strtotime($fbDate);

          //If a post contains any text
          if(isset($data->message)){

            //Create new facebook post if it does not already exist in the DB
            $facebookPost = FacebookPost::firstOrCreate(
                  ['post_id' => $data->id], ['created_at' => $fbDateToStr, 'content' => $data->message, 'featuredImage' => null]
            );

            //Output any new facebook posts to the console.
            if($facebookPost->wasRecentlyCreated){
                $this->info("New Facebook Post Added --- " . $facebookPost->content);
             }

          }

      }

  }

  public function updateTwitter($amount)
  {

      $twitterData = Twitter::getUserTimeline(['count' => $amount, 'tweet_mode'=>'extended', 'format' => 'array']);

      foreach($twitterData as $data){

          //Convert provided date to appropriate date format
          $tweetDate = date("Y-m-d H:i:s", strtotime($data['created_at']));
          $tweetDateToStr = strtotime($tweetDate);
          $tweetImg = null;

          //Get the twitter image if any
          if(!empty($data['extended_entities']['media']))
          {
              foreach($data['extended_entities']['media'] as $v){
                  $tweetImg = $v['media_url'];
              }
          }

          //Create new tweet if it does not already exist in the DB
          $twitterPost = TwitterPost::firstOrCreate(
              ['post_id' => $data['id']], ['created_at' => $tweetDateToStr, 'content' => $data['full_text'], 'featuredImage' => $tweetImg]
          );

          //Output any new twitter posts to the console.
          if($twitterPost->wasRecentlyCreated){
             $this->info("New Tweet Added --- " . $twitterPost->content);
          }

      }

  }

  /**
   * Execute the console command.
   *
   * @return mixed
   */
  public function handle()
  {
    $this->updateFacebook();
    $this->updateTwitter(20);
  }
}

Это консольная команда в Laravel, которая зарегистрирована в Kernal.php

<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    /**
     * The Artisan commands provided by your application.
     *
     * @var array
     */
    protected $commands = [
        'App\Console\Commands\UpdateSocial'
    ];

    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        $schedule->command('update:social')->everyTenMinutes();
    }

    /**
     * Register the commands for the application.
     *
     * @return void
     */
    protected function commands()
    {
        $this->load(__DIR__.'/Commands');

        require base_path('routes/console.php');
    }
}

Что позволяет мне выполнить команду: php artisan update:social, но, очевидно, чтобы это произошло автоматически, мне нужно настроить задачу cron на сервере.

Документация повторяет эту строку в нескольких местах:

* * * * * php /path-to-your-project/artisan schedule:run >> /dev/null 2>&1

Я знаю, что * * * * * - это эквивалент каждой минуты каждого дня, а schedule:run довольно понятен, но какая последняя часть?

Эта часть конкретно:

>> /dev/null 2>&1

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

Кроме того, можете ли вы использовать ту же настройку для запуска этих заданий на локальном сервере, как xxamp?

Обновление

Другой пользователь предоставил большую ссылку: https://unix.stackexchange.com/questions/163352/what-does-dev-null-21-mean-in-this-article-of-crontab-basics

Это хорошо объясняет последнюю часть команды cronjob.

Изображение для справки:

enter image description here

1 Ответ

0 голосов
/ 04 июля 2018

Вы используете xamp, поэтому я предполагаю, что вы находитесь на Windows. Я предлагаю вам скачать и установить https://sourceforge.net/projects/cronw/ Затем вы можете использовать cronjobs в стиле Unix для выполнения ваших заданий.

Вы также можете изучить использование планировщика задач Windows, но, на мой взгляд, использование планировщика cron работает лучше, поскольку планировщик задач Windows допускает запуск только один раз в 5 минут.

Вам также нужно будет следовать инструкциям в файле INSTALL, чтобы запустить и запустить cronw. Но как только он запускается, им очень легко управлять, как в

Unix Crontab

Вы запускаете планировщик Laravel каждую минуту, но планировщик Laravel затем изучает, что необходимо запустить в его расписании.

У вас есть Cron, запускающий ваш планировщик.
Затем ваш планировщик загружает свои работы.
Он повторяет те и отфильтровывает, которые еще не запланированы
Выполняемые по расписанию задания выполняются.

Cron - это просто способ запустить планировщик, чтобы посмотреть, есть ли какие-нибудь ожидающие задания, которые можно запустить.

Если вы просто хотите запускать команды ремесленников и не использовать службу планировщика, вам не нужно запускать каждую минуту, но вы можете разрешить запускать задачу cron каждые 10 минут.

Лично я бы посоветовал запустить задание планировщика , так как вы можете не выполнять его, если предыдущий процесс еще не завершен, останавливая два процесса, выполняющихся одновременно.

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *1030* * * * * *1030* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *1030*. *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...