Laravel同时执行多项任务

时间:2018-04-25 15:07:03

标签: laravel multitasking

我需要从一个目录(S3目录)处理几个图像文件,过程是读取存储在文件名中的文件名(id和type)(001_4856_0-P-0-A_.jpg),这个文件存储在当前调用的过程中(我使用cron和schedule,它工作得很好)该过程的目的是将信息存储到数据库中。

我的流程正常,但效果很好,但我的问题是目录中的文件数量,因为每秒都会向目录添加更多文件,在此过程中花费的时间约为0.19秒,但文件数量巨大,每分钟增加15,000左右,所以我认为同一个原始流程的多个同步流程(大约10 - 40倍)可以完成这项工作。

我需要一些建议或想法,

首先要了解如何在一个原始流程的同时启动多个流程。

其次,如何只获取未选择的文件名,因为该过程采用文件名:

  $recibidos = Storage::disk('s3recibidos');

  if(count($recibidos) <= 0)
  {
    $lognofile = ['Archivos' => 'No hay archivos para procesar'];
    $orderLog->info('ImagesLog', $lognofile);
  }else{
    $files = $recibidos->files();

    if(Image::count() == 0)
    {
      $last_record = 1;
    } else{
        $last_record = Image::latest('id')->pluck('id')->first()+1;
    }
    $i=$last_record;
    $fotos_sin_info = 0;
    foreach($files as $file)
    {
      $datos = explode('_',$file);
      $tipos = str_replace('-','',$datos[2]);
      Image::create([
        'client_id' => $datos[0],
        'tipo' => $tipos,
      ]);
      $recibidos->move($file,'/procesar/'.$i.'.jpg');
      $i++;
    }

但我不知道如何只检索未选中的。

感谢您的评论。

1 个答案:

答案 0 :(得分:1)

在php中使用多线程编程是可能的,并且已在How can one use multi threading in PHP applications进行了讨论。 然而,这通常不是标准应用程序最明显的选择。针对您的情况的解决方案将取决于确切的用例。

您是否考虑过使用队列的解决方案? https://laravel.com/docs/5.6/queues

还是调度程序? https://laravel.com/docs/5.6/scheduling