В моем приложении у меня есть несколько задач, которые должны запускаться автоматически с заданными интервалами. Поэтому моей непосредственной мыслью было: я мог бы создать работу 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.
Изображение для справки: