За последние 24 часа нас посетили 20642 программиста и 1008 роботов. Сейчас ищут 352 программиста ...

Как узнать есть ли в папке другие папки + нужный файл без потери производительность

Тема в разделе "PHP для профи", создана пользователем Awilum, 28 янв 2020.

  1. Awilum

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

    С нами с:
    15 ноя 2009
    Сообщения:
    325
    Симпатии:
    26
    Адрес:
    Earth
    Доброго времени суток!

    Мне необходимо узнать, есть ли в папке другие папки с нужным файлом (entry.yaml) и при этом не проходя по всем вложенным папкам. В принципе я думаю мне будет достаточно первого такого попадания для определения есть ли в нужной папки вложенные папки + файл (entry.yaml) чтобы получить флаг для дальнейшего его использования

    Пример структуры папок:

    Код (Text):
    1.  
    2. /page1/
    3. -- entry.yaml
    4.  
    5. /page2/
    6. -- entry.yaml
    7. -- /page1/
    8. ---- entry.yaml
    9. ...
    10. -- /page1000/
    11. ---- entry.yaml
    Сейчас я получаю список вложенных папок и проверяю, есть ли в них файлы (entry.yaml) и тогда ставлю флаг для родительской папки, о том что у нее есть вложенные папки.

    Как сделать тоже самое, но без перебора всех папок (так как их может быть тысячи) ?
     
  2. Babka_Gadalka

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

    С нами с:
    16 фев 2019
    Сообщения:
    162
    Симпатии:
    23
    Адрес:
    Москва, Пушкина, Избушкина, 2й этаж душечка.
    Собрать путь к файлу и проверить функцией is_file
    --- Добавлено ---
    либо glob ( regex )
     
  3. acho

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

    С нами с:
    28 дек 2016
    Сообщения:
    854
    Симпатии:
    210
    Адрес:
    Санкт-Петербург
    Средствами пыха - никак.
    Можно в shell сделать поиск файла и получить ответ в пыхе, это будет гораздо быстрее. Но, опять же, пользователю, от которого выполняется веб-сервер (мы же сейчас про веб говорим, да?), нужен будет доступ к shell.
    --- Добавлено ---
    Дополнение: хотя, мб соглашусь с предыдущим оратором, glob, возможно, тоже будет быстрее перебора. Там хоть и идёт такой же перебор, но всё-таки не силами пыха. Проверять лень. :)
     
  4. Awilum

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

    С нами с:
    15 ноя 2009
    Сообщения:
    325
    Симпатии:
    26
    Адрес:
    Earth
    то есть как либо циклом нельзя организовать заход в нужную папку и остановить проход по папкам при первой найденом совпадении ? хотя мне что-то кажется что это нереально узнать какая из папок из тысячи содержит и нужный файл в себе без перебора всего, хммммммм
     
  5. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    Проблема со скоростью уже возникла или ты решаешь проблему, которой нет?)
    Я бы попробовал тупой рекурсией обходить, а когда вопрос встанет тогда уже думать.
    Кэшировать результат можно.
    Помойму обойти пару тройку тыщ файлов - это тьфу и растереть. А на ссд так и подавно.
    --- Добавлено ---
    Если эти файлы не открывать конечно :)
     
  6. Awilum

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

    С нами с:
    15 ноя 2009
    Сообщения:
    325
    Симпатии:
    26
    Адрес:
    Earth
    > Проблема со скоростью уже возникла или ты решаешь проблему, которой нет?)

    нет, я просто задумался, на будущее)
     
  7. onderbert

    onderbert Новичок

    С нами с:
    24 мар 2019
    Сообщения:
    18
    Симпатии:
    1
    Чем тебя рекурсивная функция не устраивает? Нашел что искал и сразу ушел из рекурсии вернув тру. В теле цыкл который запускает себя до тех пор пока не найдет нужный файл или дойдет до максимальной глубины вложенности.
     
  8. anadonam

    anadonam Новичок

    С нами с:
    10 янв 2020
    Сообщения:
    89
    Симпатии:
    3
    Адрес:
    Воронеж
    Без потери производительность

    прошу прощения забыл уже..

    но дело в том что
    папки в отличии от файлов не имеют расширения (нет точки в названии).
    что является отличной причиной попытаться заглянуть внутрь. (а дальше дело техники.)
    Папки с точкой конечно создать можно.. а зачем.
     
    #8 anadonam, 31 янв 2020
    Последнее редактирование: 31 янв 2020
  9. onderbert

    onderbert Новичок

    С нами с:
    24 мар 2019
    Сообщения:
    18
    Симпатии:
    1
    is_dir() если да ищем внутри файл. не нашли смотрим есть ли ещё папки внутри.
     
  10. anadonam

    anadonam Новичок

    С нами с:
    10 янв 2020
    Сообщения:
    89
    Симпатии:
    3
    Адрес:
    Воронеж
    я не ошибся и сделал приписку произвоительность
    is dir - да все хорошо но будет чуть помедленнее чем вот такая реализация
    Код (Text):
    1.  
    2.  
    3. // Пример #1 Простой пример использования функции scandir()
    4. <?php
    5. $dir    = '/tmp';
    6. $files1 = scandir($dir);
    7. $files2 = scandir($dir, 1);
    8.  
    9. print_r($files1);
    10. print_r($files2);
    11. ?>
    12. // Результатом выполнения данного примера будет что-то подобное:
    13.  
    14. Array
    15. (
    16.     [0] => .
    17.     [1] => ..
    18.     [2] => bar.php
    19.     [3] => foo.txt
    20.     [4] => somedir
    21. )
    22. Array
    23. (
    24.     [0] => somedir
    25.     [1] => foo.txt
    26.     [2] => bar.php
    27.     [3] => ..
    28.     [4] => .
    29. )
    как видите имя somedir светится на фоне всего остального

    И поставив обработку элементов массива (проверку на точку.. [любые символы] . [любые символы] - подумал дописал - или даже просто проверка на отсутствие точки..) мы видим с чем имеем дело - заглядывать или нет - а это и есть сильная экономия ресурсов в отлчии от is_dir() которая заглядывает во всюда, чтобы дать ответ. работа с физикой гораздо дольше чем проверочные действия в оперативке - речь о долях секунд но тем не менее - море оно из капель (r))
     
    #10 anadonam, 31 янв 2020
    Последнее редактирование: 31 янв 2020
  11. acho

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

    С нами с:
    28 дек 2016
    Сообщения:
    854
    Симпатии:
    210
    Адрес:
    Санкт-Петербург
    папки бывают с точками. неожиданность.
    файлы бывают без точки. неожиданность номер два.
     
    twim32 нравится это.
  12. anadonam

    anadonam Новичок

    С нами с:
    10 янв 2020
    Сообщения:
    89
    Симпатии:
    3
    Адрес:
    Воронеж
    @acho, ну..... оптимальное универсальным не бывает
    - взаимоисключающие понятия.

    а так то оно вот:
    Код (Text):
    1. <?php
    2. foreach(new DirectoryIterator('./dir') as $file) {
    3. echo $file ->getPathname() . '<br />';
    4. }
    5. ?>
    //весь код
    https://www.php.net/manual/ru/class.directoryiterator.php

    но зачем тема когда в Гугле 10000 ответов и примеров..
     
    #12 anadonam, 31 янв 2020
    Последнее редактирование: 31 янв 2020
  13. Grihanoff

    Grihanoff Новичок

    С нами с:
    26 фев 2020
    Сообщения:
    5
    Симпатии:
    0
    При добавлении файла, ты можешь брать его абсолютный путь и класть в файл в корне (как вариант), далее ты достаешь один файл из корня и идешь построчно, получая каждый файл поклав болт на папки ))