1. Задавайте здесь вопросы о коде, которые не подходят в другие разделы, такие как:
    Дизайн > Верстка
    PHP > Как сделать на PHP
    Скрыть объявление

лист файлов, начинающихся на опред. букву

Тема в разделе "Web Coding", создана пользователем venetu, 7 фев 2008.

Статус темы:
Закрыта.
Модераторы: latteo
  1. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    Вопрос не для начинающих, но просто ждать 50 постов сильно долго, поэтому приходится писать сюда - надеюсь, все же дойдет по адресу. :)

    Итак, вопрос такой: Есть папка, допустим, /tmp
    Есть в ней несколько тысяч файлов, у всех файлов имена вида
    23-myfile.jpg
    23-another.jpg
    271-pic.jpg

    где число в начале - это ID статьи, к которой данные файлы относятся.

    При выводе статьи хочется быстро выбрать файлы, к ней относящиеся. Если делать через opendir() и readdir() - приходится просматривать весь каталог, пока дойду до нужного файла. Если файлов больше тысячи - начинает заметно подтормаживать, до 0.5 секунд..

    Хочется сделать что-нибудь типа

    exec("dir /b 213-*.*", $files);

    но средствами php. Ну или хотя бы через тот же exec, но в варианте для юникса - т.е. чтобы оно в массив files выгр**** все имена, начинающиеся на определенные символы. И при этом не перебирало всю директорию.

    В доке к php нашел только fnmatch - но это все же не то, с ним все равно придется перебирать каждый файл.. Долго..
     
  2. Dogmat

    Dogmat Постоялец

    Регистр.:
    16 фев 2007
    Сообщения:
    121
    Симпатии:
    38
    1.В любом случае перебирается каждый файл. вопрос средствами пыхпых или более низкого уровня(что собственно быстрее)

    2. Как ты доки то куришь? На девчат засмотрелся по телику? ;)
    PHP:
    Find pathnames matching a pattern (PHP 4 >= 4.3.0, PHP 5) 

    array glob ( string pattern [, int flags] )

    The glob() function searches for all the pathnames matching pattern according to the rules used by the libc glob() function, which is similar to the rules used by common shells. No tilde expansion or parameter substitution is done. 

    Returns an array containing the matched files/directories, an empty array if no file matched or FALSE on error. 

    Valid flags: 

    GLOB_MARK - Adds a slash to each item returned 
    GLOB_NOSORT - Return files as they appear in the directory (no sorting) 
    GLOB_NOCHECK - Return the search pattern if no files matching it were found 
    GLOB_NOESCAPE - Backslashes do not quote metacharacters 
    GLOB_BRACE - Expands {a,b,c} to match 'a', 'b', or 'c' 

    Note: 
    This flag is not available on some non GNU systems, like Solaris. 


    GLOB_ONLYDIR - Return only directory entries which match the pattern 

    Note: 
    Before PHP 4.3.3 GLOB_ONLYDIR was not available on Windows and other systems not using the GNU C library. 


    GLOB_ERR - Stop on read errors (like unreadable directories), by default errors are ignored. Added in PHP 5.1.0. 


    <?php
    foreach (glob("*.txt") as $filename) {
       echo 
    "$filename size " filesize($filename) . "\n";
    }
    ?>
    3. Как вариант можешь конечно составлять автоматом индекс списка файлов в текстовик, и уже по нему искать. но плохой вариант =)

    4. Вобще плохой метод хранения картинок конечно. этож ****ись если будет 5к картинок. и будет по сотне запросов в секунду. если есть возможность передывай в **** алгоритм хранения картинок =)
     
    venetu нравится это.
  3. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    Про glob действительно не знал, спасибо за на водку :)

    С ним оказалось примерно в 2 раза медленнее, чем через readdir()

    Так что решил внять твоему совету номер 4 и заводить папочки для каждой статьи, чтобы было
    23/myfile.jpg
    23/another.jpg
    271/pic.jpg

    (теперь правда эти папки не доступны по ftp, так как создаются процессом апача и присвоить им права 777 нельзя). Пошел курить дальше..
     
  4. pll

    pll Создатель

    Регистр.:
    29 дек 2007
    Сообщения:
    28
    Симпатии:
    5
    почему нельзя а chmod() ?
     
  5. zetar

    zetar

    Регистр.:
    18 май 2007
    Сообщения:
    497
    Симпатии:
    348
    или так
    mkdir ('dirname',777);
     
  6. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    Ограничения хостера. И не одного, я у всех на такое же натыкаюсь, может это cpanel делает или еще что..

    Короче если овнер у папки - вебсервер (обычно это nobody), то папке ты 777 просто никак не поставишь
    И chmod и mkdir - нормально отрабатывают, без ошибок, но права не ставятся.

    Так что надо делать chown() а потом как-то под новым owner'ом заходить и тогда уже ставить 777. Но это гимор, проще хостеров других еще поискать..

    И кстати, если ставишь 777, а потом обратно меняешь owner на nobody - то права обратно сбрасываются :)
     
Статус темы:
Закрыта.