我如何一次处理目录中的所有文件?

How I can process files in a directory all at one time?

我有一个包含 100 个 xlxs 文件的目录。现在我想做的是将所有这些文件一次全部或部分转换为 PDF。目前,foreach 和 cron 的转换过程运行良好。但它可以一次处理或转换一个文件,这增加了等待 PDF 文件的用户端的等待时间。

我正在考虑并行处理,但不知道如何实现。

这是我当前的代码

$files = glob("/var/www/html/conversions/xlxs_files/*");

if(!empty($files)){
  $now   = time();
  $i = 1;
   foreach ($files as $file) {
      if (is_file($file) && $i <= 8) {
        
        echo $i.'-----'.basename($file).'----'.date('m/d/Y H:i:s',@filemtime($file));
        echo '<br>';
        $path_parts = pathinfo(basename($file));
        
        $xlsx_file_name =  basename($file);
        
        $pdf_file_name =  $path_parts['filename'].'.pdf';
        
        echo '<br>';  
        
        try{
            $result = ConvertApi::convert('pdf', ['File' => $common_path.'xlxs_files/'.$xlsx_file_name],'xlsx');
            echo $log = 'conversion start for '.basename($file).' on '. date('d-M-Y h:i:s');
            echo '<br>';
            $result->getFile()->save($common_path.'pdf_files/'.$pdf_file_name);
            
            echo $log = 'conversion start for '.basename($file).' on '. date('d-M-Y h:i:s'); 
            echo '<br>';
            mail('amit.webethics@gmail.com','test','test');
            unlink($common_path.'xlxs_files/'.$xlsx_file_name);
            
        }catch(Exception $e){
            $log_file_data = createAlogFile();
            $log = 'There is an error with your file .'. $xlsx_file_name.' -- '.$e->getMessage();
            file_put_contents($log_file_data, $log . "\n", FILE_APPEND);
            continue;
        }
        $i++;  
    }
}
}else{

   echo 'nothing to process';
} 

我们将不胜感激任何帮助。谢谢

您可以一次启动多个 PHP 脚本。如何做到这一点的详细答案在这里:https://unix.stackexchange.com/a/216475/91593 我会选择这个解决方案:

N=4
(
for thing in a b c d e f g; do 
   ((i=i%N)); ((i++==0)) && wait
   task "$thing" & 
done
)

另一种方法是尝试使用 PHP。这个问题有深度回答:

Q : I am thinking about parallel processing at this time but don't know how to implement this.

事实#1:
这是不是的一种处理流程的真实[PARALLEL]编排。

事实#2:
一个标准的 GNU parallel(所有细节请阅读 man parallel) 将帮助您最大限度地提高处理管道的性能,给定要转换的所有文件的列表并调整其他参数作为 CPU/cores 使用的数量和 RAM-resources 您可能 reserve/allocate尽快执行此批量转换。

ls _files_to_convert.mask_ | parallel --jobs _nCores_  \
                                      --load 99%        \
                                      --block _RAMblock_ \
                                      ...                 \
                                      --dry-run            \
                                      _converting_process_

可以作为 GNU parallel 能力的直接开胃菜。

所有功劳和感谢都归功于 Ole Tange。