0

我有一个包含 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';
} 

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

4

2 回答 2

1

您可以一次启动多个 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。这个问题有深入的回答:https ://stackoverflow.com/a/36440644/625521

于 2020-09-21T05:56:52.340 回答
1

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

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

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

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

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

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

于 2020-09-21T06:12:21.567 回答