2 回答

TA貢獻1817條經驗 獲得超14個贊
別打電話glob()。只需使用一個循環來處理按數字順序匹配模式的每個文件。當文件不存在時,您可以停止循環。
我假設您的文件名數字序列中沒有間隙。
if (($handle = fopen("../RC_PRODUCT_HUB.csv", "r")) !== FALSE) {
fgets($handle); // skip header line
while (($data = fgetcsv($handle, 9000000, ";")) !== FALSE){
if ($data[0] != null) {
for ($i = 1; file_exists($fileName = $path.$data[6].'_'.$data[7].'-'.$i.'.JPG'); ++$i) {
if (!in_array($fileName, $dataImage)){
$dataImage[$data[6] . '_' . $data[7]]['file'][$i] = $fileName;
$fileName = str_replace($path, '', $fileName);
if (!in_array($fileName, $dataImageTmp)){
$dataImageTmp[] = $fileName;
}
}
if (isset($dataImage[$data[6] . '_' . $data[7]]['TOTAL'])) {
$dataImage[$data[6] . '_' . $data[7]]['TOTAL']++;
} else {
$dataImage[$data[6] . '_' . $data[7]]['TOTAL'] = 1;
}
}
}
}
}

TA貢獻1780條經驗 獲得超4個贊
需要注意的一些事項:
為什么先
count(glob(..))
循環查找文件名(?file_exists
)?您只需glob($path . $data[6] . '_' . $data[7] . '*.JPG')
獲取文件名即可。您的解決方案首先創建一個所有文件名的數組,對其進行計數,然后丟棄它并為文件名創建一個全新的數組。您可以迭代 返回的數組
glob
,然后$i
根據需要從文件名中提取。如果需要
count(glob(..))
,可以用 shell 命令替換它。我認為它們會更快,因為它們不需要 PHP 中的內存分配/釋放。類似的東西
shell_exec("ls '{$path}{$data[6]}_{$data[7]}*.*' | wc -l")
。當然,這是針對基于 *nix 的系統和bash/sh
.?您可以在其他操作系統(或 shell)中找到類似的東西。您可以以某種方式分割文件,并使用多個腳本來處理它們。該解決方案可能會有很大差異,具體取決于您想要的復雜程度。喜歡:
預先拆分 csv 文件,然后對其運行腳本,然后合并結果。
編寫一個腳本來讀取 csv 并運行多個進程,將 csv 文件的某些部分交給每個進程進行處理,然后合并結果。流程或類似的庫在這里可能很有用。
使用作業隊列。腳本讀取 csv 文件并為每一行(也許不是每一行,而是每 100 行)創建一個作業。作業由多個工作人員處理,結果保存在數據庫或其他內容中以進行合并。有一些解決方案,但我只在 Laravel 或 Symfony 等有自己的作業隊列的框架中使用它們。搜索一下
php job queue
,你會找到一些解決方案。
- 2 回答
- 0 關注
- 192 瀏覽
添加回答
舉報