创建一个 cron 以自动启动数据库播种器

Posted

技术标签:

【中文标题】创建一个 cron 以自动启动数据库播种器【英文标题】:Create a cron in order to launch database seeder automatically 【发布时间】:2016-07-11 23:12:17 【问题描述】:

在我的 Laravel 项目中,我有一个通过 url 获取的数据库。 这个数据库是 json 格式的。按照我的项目规范,我必须在我的本地项目中整理数据库,创建一个每月的 cron 以便每月更新一次。

恢复数据并不难,但我必须用这些数据创建一些播种机。有没有办法为数据库播种机实现每月 cron,就像我使用每月 cron 来更新初始数据一样?

更具体地说,这是我的 cron 来恢复我的 CronController.php 中的初始数据:

public static function updateJson(Request $request)


  $type="application/json";
  $charset="utf-8";
  $path = 'database/market.json';

  $time=filemtime($path);
  $update=date("Y-M-d",$time);

  $updateMonth= date('Y-M-d',strtotime('+1 month',strtotime($update)));

  $now = date('Y-M-d');

  if($now >= $updateMonth)
  
    $data = file_get_contents('url/for/the/public/database');

    $data = mb_convert_encoding($data, 'html-ENTITIES');
    $res= file_put_contents($path, $data);

    $whatIReallyNeed='update ok';

    return response()->json($whatIReallyNeed)->header('Content-type', $type, 'charset', $charset);

   else 

    $error = 'no need to update';
    return response()->json($error)->header('Content-type', $type, 'charset', $charset);
  

例如我的数据库中有一个town表,检查这个表的迁移:

class CreateTownTable extends Migration

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    
        Schema::create('town', function (Blueprint $table) 
            $table->increments('id');
            $table->string('name', 255);
            $table->timestamps();
            $table->softDeletes();
        );
    

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    
        Schema::drop('town');
    

以及从 json 数据库 TownTableSeeder.php 注册数据的播种机:

public function run()

  $path = "public/database/market.json";
  // get contents of file
  $json = file_get_contents($path);
  // decode json datas
  $datas = json_decode($json, TRUE);
  // get the multi json array
  $arrayFeatures = $datas["features"];
  // define a new empty array
  $arrayTown = array();
  // populate the new array with values we need
  foreach ($arrayFeatures as $feature) 
    array_push($arrayTown, $feature["properties"]["commune"]);
  
  // get unique entry for array
  $results = array_unique($arrayTown);
  // get only vales of array after do array_unique (no index)
  $whatIReallyNeed = array_values($results);
  foreach ($results as $result) 
    DB::table('town')->insert([
        'name' => $result,
    ]);
  

所有这一切都很好,现在我想知道当 cron 更新了我存储在我的项目中的 json 数据库时,我是否可以启动种子迁移。

【问题讨论】:

【参考方案1】:

您可以使用Laravel Events。当cron更新json数据时,只需fire an event。

手册中的示例:

Event::fire(new PodcastWasPurchased($podcast));

【讨论】:

谢谢你的回答,我是 Laravel5 的新手(顺便说一句,这是一个很好的框架),即使我没有构建我的整个 Laravel Event,它似乎是一个很好的解决方案,所以我验证你的回答。当我的代码将完整构建时,我发布事件,也许它可以帮助某人。祝你有美好的一天,愉快的编码!

以上是关于创建一个 cron 以自动启动数据库播种器的主要内容,如果未能解决你的问题,请参考以下文章

Web应用启动时,后台自动启动一个线程(转)

swoole服务挂掉,配合cron定时任务,自动启动

crontab linux

从 cron 重新启动弹性 beanstalk 应用程序服务器

创建测试范围/上下文以播种数据并运行应用程序,Scala Play Framework 2

当我启动我的 docker 容器时,Cron 没有运行