我需要从一个目录(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++;
}
但我不知道如何只检索未选中的。
感谢您的评论。
答案 0 :(得分:1)
在php中使用多线程编程是可能的,并且已在How can one use multi threading in PHP applications进行了讨论。 然而,这通常不是标准应用程序最明显的选择。针对您的情况的解决方案将取决于确切的用例。
您是否考虑过使用队列的解决方案? https://laravel.com/docs/5.6/queues