使用 File_Put_Contents 和 File_get_Contents 上传 50,000 张图片的最佳方法

Best Method for uploading 50,000 Images using File_Put_Contents and File_get_Contents

我有一个包含大约 50,000 张图像的 CSV。在 CSV 文件中,每个图像名称都有一列,图像的实际 URL 地址有一列。该代码清理了空格、撇号和逗号,并将空格替换为破折号,这样图像名称将更易于阅读,并且对 SEO 更友好,因为原始图像名称是字母和数字的组合。

我使用的方法是将代码放在样式表上,因此为了激活它,我转到 https://mysite/stylesheet.php。一旦服务器下载了大约 600 - 700 张图像,我最终会收到 500 错误。

在没有超时的情况下将这些 50K 图像下载到服务器的最佳方法是什么?不,我没有直接访问服务器的权限,这是 Hostgator Cloud Business 设置。我已经将 PHP 内存从 256MB 增加到 1GB,但这一点也没有帮助。

代码如下:

<?php
$filename = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'photo.csv';
$file = fopen($filename, 'r');
while (($line =fgetcsv($file)) !== FALSE)
{
    $name       =   $line[0];
    $url        =   $line[1];
    $str        =   $name;
    $str        =   str_replace(' '  , '-', strtolower($str)); 
    $str        =   str_replace('\'' , '' , $str);
    $str        =   str_replace(',' , '' , $str);   
    $img        =   'mtg/images/'.$str.'.jpg';
    $img_path   =   dirname(__FILE__) . DIRECTORY_SEPARATOR . $img;

    file_put_contents($img_path, file_get_contents($url));   
}
fclose ($file); ?>

由于图像的质量,增加限制基本上没有效果。我最终采用了一种不同的方法,使用一个插件,该插件在通过 csv 文件上传时自动重命名图像。

您的房东是否可以对在给定持续时间和房东内可以发出的请求数量设置限制。 如果数字一致,则在给定的持续时间内在下限(600)上停止交易并继续下一次迭代。您将需要调整每次迭代中处理的文件的时间和数量。

 <?php
   $filename = dirname(__FILE__) . DIRECTORY_SEPARATOR . 
     'photo.csv';
   $file = fopen($filename, 'r');
   while (($line =fgetcsv($file)) !== FALSE)
  {
  // Start time
  $startTime = new DateTime();
  //  Pause duration : when do you want the process to pause
 $pauseDuration = 300; // seconds
  // Batch size : how many transactions in the active queue 
   $batchSize = 600;
  // Stop time
  $stopTime = startTime->add(DateInterval(pauseDuration));

 If(startTime == stopTime) { 
     // update the stoptime 
     sleep(pauseDuration); } else { 

   $name       =   $line[0];
   $url        =   $line[1];
   $str        =   $name;
   $str        =   str_replace(' '  , '-', strtolower($str)); 
   $str        =   str_replace('\'' , '' , $str);
   $str        =   str_replace(',' , '' , $str);   
   $img        =   'mtg/images/'.$str.'.jpg';
   $img_path   =   dirname(__FILE__) . DIRECTORY_SEPARATOR . 
    $img;
   file_put_contents($img_path, file_get_contents($url));   
    }
   fclose ($file); ?>