За последние 24 часа нас посетили 17488 программистов и 1839 роботов. Сейчас ищут 1470 программистов ...

Избежать Time out работе скрипта (скрипт парсит ftp)

Тема в разделе "PHP для новичков", создана пользователем filip, 11 мар 2022.

  1. filip

    filip Активный пользователь

    С нами с:
    13 окт 2018
    Сообщения:
    18
    Симпатии:
    0
    Добрый день всем. Хочу получить массив имен файлов с путями с ftp ресурса (/folder1/folder2/file.txt). Написал код (он ниже). Но проблема в том, что ftp имеет довольно разветвленную систему файлов и папок и уже на 3-м уровне вложенности вылетает тайм аут. Возможно ли как-то этого избежать?
    ПС с set_time_limit игрался, не помогает
    Код:
    PHP:
    1. // Устанавливаем время исполнения скрипта 120 с
    2. // Пытаемся установить соединение с FTP-сервером
    3.  
    4. $ftp = ftp_connect($ftp_server, $ftp_port, 300);
    5. // $ftp = ftp_ssl_connect($ftp_server);
    6. if(!$ftp) puterror("К сожалению, не удаётся установить соединение с FTP-сервером $ftp_server");
    7. // Осуществляем регистрацию на сервере
    8. $login = ftp_login($ftp, $ftp_user, $ftp_password);
    9. //$login = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
    10. if(!$login) puterror("К сожалению, не удаётся зарегистрироваться на сервере");
    11. //Объявляем 2 массива для папок и файлов
    12. $files = $folders = array();
    13.  
    14. //старт сканирования для полученияданных корнеовй директории
    15. $start = ftp_mlsd($ftp, ".");
    16. // print_r(ftp_mlsd($ftp, $start[8]['name']));
    17.  
    18. //Выбераем стартовую директорию
    19. $startFolder = $start[8]['name'];
    20. //инициируем генератор
    21. $ddd = selectDir($ftp, $startFolder);
    22.  
    23. //генератор, выдает массив с типом ресурса (папка или файл) и его названием
    24. function selectDir($ftp, $dir){
    25.   $data = ftp_mlsd($ftp, $dir);
    26.   foreach ($data as $value) {
    27.     yield array('Type' => $value['Type'], 'name' => $value['name']);
    28.   }
    29. }
    30. //цикл для разбора данных генератора по массивам files и folders
    31. foreach ($ddd as $value) {
    32.   if($value['Type'] == 'dir'){
    33.    array_push($folders, "/".$startFolder."/".$value['name'] . "/");
    34.   }
    35.   else if($value['Type'] == 'file') array_push($files, "/".$value['name']);
    36. }
    37. //count - глубина сканирования папок (на сколько папок проваливаться вглубь)
    38. $count = 2;
    39. for ($i= 1; $i <= $count; $i++) {
    40. //в цикле формируется стек с именами папок (folders) и именами с путями файлов (files)
    41.   // Устанавливаем время исполнения скрипта 120 с
    42.   foreach ($folders as $value) {
    43.     $data = selectDir($ftp, $value);
    44.     foreach ($data as $subvalue) {
    45.       if($subvalue['Type'] == 'dir'){
    46.        array_push($folders, $value . $subvalue['name'] . "/");
    47.        // array_push($folders, $value . $subvalue['name'] . "/");
    48.       }
    49.       else if($subvalue['Type'] == 'file') array_push($files, $value . $subvalue['name']);
    50.     }
    51.     array_shift($folders);
    52.   }
    53.  
    54. }
    55.  
    56. print_r($folders);
    57. print_r($files);
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.850
    Симпатии:
    745
    Адрес:
    Татарстан
    set_time_limit(0); - без ограничений, и устанавливается один раз в начале скрипта
    обход папок и файлов лучше всего сделать рекурсивно
    + возможно нужно покрутить сам ftp чтоб стал отзывчив
     
    filip нравится это.
  3. filip

    filip Активный пользователь

    С нами с:
    13 окт 2018
    Сообщения:
    18
    Симпатии:
    0
    @ADSoft , спасибо, все заработало