我如何一次处理目录中的所有文件?
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。
我有一个包含 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。