Лучший способ загрузки 50 000 изображений с использованием File_Put_Contents и File_get_Contents - PullRequest
0 голосов
/ 31 октября 2019

У меня есть CSV с примерно 50000 изображений. В CSV-файле у меня есть столбец для каждого имени изображения и столбец для фактического URL-адреса изображения. Код очищает пробелы, апострофы и запятые и заменяет пробелы черточками, чтобы имена изображений были удобнее для чтения, а также более удобными для SEO, так как исходные имена изображений представляют собой комбинацию букв и цифр.

Подход, который я использую, заключается в размещении кода в таблице стилей, поэтому для его активации я перехожу к https://mysite/stylesheet.php. Как только сервер загружает около 600 - 700 изображений, я в конечном итоге получаю ошибку 500.

Как лучше всего загрузить эти 50К-образы на сервер без тайм-аута? Нет, у меня нет прямого доступа к серверу, это настройка Hostgator Cloud Business. Я уже увеличил объем памяти PHP до 1 ГБ с 256 МБ, и это совсем не помогло.

Код указан ниже:

<?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); ?>

Ответы [ 2 ]

0 голосов
/ 04 ноября 2019

Может ли ваш хост установить ограничение на количество запросов, которые могут быть сделаны в течение определенного периода времени и хоста. Если число непротиворечиво, остановите транзакцию на нижнем пределе (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); ?>
0 голосов
/ 04 ноября 2019

Увеличение лимита имело нулевой эффект из-за массы изображений. В итоге я использовал другой подход, используя плагин, который автоматически переименовывает изображения, когда они загружаются через CSV-файл.

...