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

Статус
В этой теме нельзя размещать новые ответы.

venetu

Мой дом здесь!
Регистрация
28 Мар 2007
Сообщения
745
Реакции
273
Вопрос не для начинающих, но просто ждать 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 - но это все же не то, с ним все равно придется перебирать каждый файл.. Долго..
 
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к картинок. и будет по сотне запросов в секунду. если есть возможность передывай в **** алгоритм хранения картинок =)
 
Про glob действительно не знал, спасибо за на водку :)

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

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

(теперь правда эти папки не доступны по ftp, так как создаются процессом апача и присвоить им права 777 нельзя). Пошел курить дальше..
 
или так
mkdir ('dirname',777);
 
Ограничения хостера. И не одного, я у всех на такое же натыкаюсь, может это cpanel делает или еще что..

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

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

И кстати, если ставишь 777, а потом обратно меняешь owner на nobody - то права обратно сбрасываются :)
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху