Структура Загруз центра

1. Жека (17.04.2010 / 21:27)
Настало время делать загруз и тут появилось желание сделать папки неограниченной вложенности.
Первый вариант сделал с использованием рефИД т.е.
Первый раздел имеет ид 1.
Подраздел имеет рефИд = ид первого радела.
И собственно выборка SELECT * FROM `files` WHERE `refid` = равно ид'у предыдущего раздела.
И так получается сетка. Всё бы хорошо, но как теперь сделать полноценный подсчёт папок и файлов? Только цикл?

2. WCO (17.04.2010 / 21:34)
Да, + кэширование результатов.

3. Жека (17.04.2010 / 21:36)
Второй вариант сделал с использованием поиска по доп полю.
Таблица имеет вид имеет вид:
id | local | name
1 | files | java
2 | files/java | hit
3 | files/java/hit | top100
и т.д.
И так тоже получается сетка и подсчёт работает коректно. Всё кул, но теперь у меня на сайте 80 000 файлов и папок и если приминяю функцию подсчёта, то страницы заметно тормозят сек по 5.
запрос на листинг
<?php
$fol = isset($_GET['f']) ? intval($_GET['f']) : 'not';
if ($fol != 'not') {
$sql = mysql_query("SELECT `local`, `name` FROM `down` WHERE `id` = '".$fol."'");
list($loc, $nam) = mysql_fetch_array($sql);
$loc = $loc.'/'.$nam; 
} else { $loc = 'files'; }
$sql = mysql_query("SELECT `id`, `type`, `rus_name` FROM `down` WHERE `local` = '".$loc."'");
...
подсчтёт
$num_folder=mysql_result(
mysql_query("SELECT COUNT(`id`)
FROM `down`
WHERE `type`='folder'
AND `local`
LIKE '".($local.'/'.$name)."%'"),0);

4. Жека (17.04.2010 / 21:37)
кто чё раскажит? Что за кэширование?

5. Вантуз-мен (17.04.2010 / 22:06)
не понял что ты там затеял но самый лучший вариант я считаю как к примеру сделано у нас на форуме, там по идее также возможно неограниченное кол подфорумов
id / parent / name
1 / 0 / название 1
2 / 0 / название 2
3 / 1 / подкатегория от id 1
4 / 3 / под-подкатегория от id 3
тогда и считать проще, ну а кешировать все равно желательно
к примеру в файл

6. Дмитрий (17.04.2010 / 23:45)
в зц без кеширование никак не обойтись иначе он убёт сервер, нагрузка при большом количестве файлов будет бешеной а время генерации будет зашкаливать

7. Nu3oN (17.04.2010 / 23:46)
5. Vantuz, есть одно "но" в этом способе!
Неприятная процедура выходит при выводе полного "дерева" каталогов!
Например идет так!
Категория1/Категория2/Категория3/Категория4/Категория5/...
Как узнать все эти ветви, если записывается только одно значение в "parent" а делать это надо в цикле!
В итоге выйдет n-е колличество запросов к БД!
Т.е первый цикл
$query1 = mysql...(SELECT... WHERE `parent` = '".$id."');
потом
$query2 = mysql...(SELECT... WHERE `parent` = '".$query1['parent']."');
$query3 = mysql...(SELECT... WHERE `parent` = '".$query2['parent']."');
и т.д

8. Fanis (18.04.2010 / 01:37)
1. Придумываем велосипед?) рефид для только вывода.
подсчет: индекс на поле путь к файлу и подсчет по этому пути по like + кеширование. А подсчет через цикл при большом кол-ве файлов отправит твой сервак в *** и к чертям на долгое время))

9. Fanis (18.04.2010 / 01:39)
)))слово "дayн" в антимате)) весело

10. Lugaro (18.04.2010 / 02:22)
Я у себя на форуме посты так считаю, сначала получаю список под каталогов
<?
    function list_id_podcat($id)
    {
        $list = $id;
        $sql = $this->list_cat($id);
        while (false != ($res = $this->db->assoc($sql))) {
            // рекурсия
            $list .= ',' . $this->list_id_podcat($res['id']);
        }
        return $list;
    }
Ну и потом счетчик
<?
    function count_post_cat($id, $time = '')
    {
        if ($time != '') $time = 'time > ' . (time() - $time) . ' AND';
        $sql = $this->db->query("SELECT COUNT(*) FROM  " . $this->prif . "forum_post WHERE  $time id_r IN($id)");
        return $this->db->result($sql);
    }


11. ramzes (18.04.2010 / 13:56)
$dir['url'] = 'java/games/240x320';
INSERT INTO zc_files SET url = '".$dir['url']."', ...
// считаем раз в 6 часов
$total = SELECT count(*) FROM zc_files WHERE LIKE url '".$dir['url']."%'
UPDATE zf_dirs SET total_files = '".$total."', update_time = '".(time()+21600)."'...
Без разницы какое строение зц..

12. Жека (19.04.2010 / 17:40)
Спасибо всем просто загруз центр сеа при 80 000 файлов стал лагать. Сканирование диска упало почти. Вот и пошла идея написать свой загруз. Ни кто не знает есть ли какой нить альтернативный способ обходя кэширование? Ну к примеру какой нить спец запрос в мускуле? Просто не понятно как некоторые сайты вывозят по 2 500 000 файлов и без висов?

13. Жека (19.04.2010 / 17:43)
Или может быть пора выбирать болие мощный язык? или другую BD? Что скажите? Может ASP.NET ?

14. ramzes (19.04.2010 / 17:43)
Для этого и используют кеширование, считает один раз и все остальное время выводит статическое число

15. Жека (19.04.2010 / 17:49)
а может можно настроить какие-нибудь директивы MySQL в htaccess?

16. ramzes (19.04.2010 / 17:57)
php_flag ne_tormozi_sql On
гг так? Сервер за тебя думать не будетsmile

17. Жека (20.04.2010 / 17:10)
16. ramzes, а что на счёт my.cnf ???

18. Вусал (03.05.2010 / 00:15)
Nu3oN (18.04.10 / 00:46)
5. Vantuz, есть одно "но" в этом способе!
Неприятная процедура выходит при выводе полного "дерева" каталогов!
Например идет так!
Категория1/Категория2/Категория3/Категория4/Категория5/...
Как узнать все эти ветви, если записывается только одно значение в "parent" а делать это надо в цикле!
В итоге выйдет n-е колличество запросов к БД!
Т.е первый цикл
$query1 = mysql...(SELECT... WHERE `parent` = '".$id."');
потом
$query2 = mysql...(SELECT... WHERE `parent` = '".$query1['parent']."');
$query3 = mysql...(SELECT... WHERE `parent` = '".$query2['parent']."');
и т.д
вово как раз меня тоже интересует. как сделаты то самое дере вывод всех каталогов и подкаталогов.
много парился как это сделано в двиге дле, но так и не до пёрло до меня

19. Петруха (04.05.2010 / 07:08)
А не проще ли использовать mysqli или pdo , в которых есть замечательная вещь, кеширование запросов. Тем самым экономим время и не так нагружаем машину при считывание и кеширование, при построе дерева пути к файлу или директории

20. Вусал (11.05.2010 / 00:28)
5. Vantuz, напиши пожалуйста код который выводит список всех разделов, на странице в форуме когда создаешь новую (forum.php?act=addtheme&fid=8)

21. Назар (13.05.2010 / 13:30)
Рекурсивно вызываем фцию вот и все! Припустим есть поля id and parent_id если в раздела нет подраздела,пишем туда 0! Вывод всех подкатегорий.
<?php 
function print_sub($parent_id)
{
if ($parent_id!=0){
$query=mysql_query("select * from`table`where `id`="'.$parent_id.'" limit 1");
$kat=mysql_fetch_assoc($query);
print $kat[name];
print_sub($kat[sub_kat]);}}?>
//sub_kat-подкатегория


22. Назар (13.05.2010 / 13:44)
Писал с тела,возможны небольшие ошибки

23. Nu3oN (13.05.2010 / 16:23)
demeros (Сегодня / 13:30)
Рекурсивно вызываем фцию вот и все! Припустим есть поля id and parent_id если в раздела нет подраздела,пишем туда 0! Вывод всех подкатегорий.
<?php 
function print_sub($parent_id)
{
if ($parent_id!=0){
$query=mysql_query("select * from`table`where `id`="'.$parent_id.'" limit 1");
$kat=mysql_fetch_assoc($query);
print $kat[name];
print_sub($kat[sub_kat]);}}?>
//sub_kat-подкатегория
Мдеее... я в 7 посту о этом говорил! а если этих подкатегорий будет 50, и ты каждый так будешь выводить? нет! это будешь делать через цыкл! а это 50 лишних запросов!

24. Назар (13.05.2010 / 18:28)
Ну ето другой вопрос! Только вот зачем в загрузе 50 подкатегорий? Ну да ладно,еще вариант:делаеш поле parent_id в котором ид самой первой категории,и еще поле добавляеш,например kat_id в котором нумеруеш порядок наследования от главной категории,и в одном запросе выбираеш все записи в которых parent_id равно главной категории,сортируя все по kat_id!например для :игры->ява->нокиа->серия 40
игры: id=1 parent_id=0 kat_id=0 name=игры;
ява:id=5 parent_id=1 kat_id=1 name=...;
нокиа:id=6 parent_id=1 kat_id=2 итд. Думаю смысл понятен?

25. Назар (13.05.2010 / 18:29)
Можно еще придумать чтото,такчто думай!

26. ramzes (13.05.2010 / 19:16)
24, 50 папок это считай пустой загруз =). У меня небольшой и то ~150 папок.

27. Назар (13.05.2010 / 19:25)
26.Я имел ввиду зачем в одной категории 50 подкатегорий!!!!

28. Nu3oN (14.05.2010 / 08:13)
demeros (Вчера / 18:28)
Ну ето другой вопрос! Только вот зачем в загрузе 50 подкатегорий? Ну да ладно,еще вариант:делаеш поле parent_id в котором ид самой первой категории,и еще поле добавляеш,например kat_id в котором нумеруеш порядок наследования от главной категории,и в одном запросе выбираеш все записи в которых parent_id равно главной категории,сортируя все по kat_id!например для :игры->ява->нокиа->серия 40
игры: id=1 parent_id=0 kat_id=0 name=игры;
ява:id=5 parent_id=1 kat_id=1 name=...;
нокиа:id=6 parent_id=1 kat_id=2 итд. Думаю смысл понятен?
ты меня не слышиш! всеравно вывод придется делать в цикле!

29. Вусал (14.05.2010 / 15:20)
21. demeros, благодарю за мысль, чюток поправиль как у мя и все будет ок!!!!

30. Назар (14.05.2010 / 18:39)
28 ну как по другому? Всеравно считать все записи одним запросом не выйдет! Тогда кешируй:считывай как в моем предыдущем посте и пиши в файл по порядку. Например для каждой основной категории будет один файл со всеми подкатегориями!

31. Вусал (14.05.2010 / 23:47)
готово, во как у мя
таблица из трех полей
id - ид (под)каталога
name - имя (под)каталога
pid - высший уровень подкаталога (если это первый уровень то равен 0
например
id - 1 name - игры pid - 0
id - 2 name - гонки pid - 1
id - 3 name - 3D pid - 2
id - 4 name - проги pid - 0
function opencat($id) {
global $db;
$query = sqlite_query ($db, "SELECT * FROM cats WHERE pid=".$id);
$qq = sqlite_current($query);
if ($qq['id'] > 0) {
$quer = sqlite_query ($db, "SELECT * FROM cats WHERE pid=".$id);
while($qw = sqlite_fetch_array($query)) {
echo '- '.$qw['name'].'<br>';
echo opencat($qw['id']); }}}
тут выводим все каталоги и под каталоги в нем...
$base = sqlite_query ($db, "SELECT * FROM cats WHERE pid=0");
while($data = sqlite_fetch_array($query)) {
echo $data['name'].'<br>';
echo opencat($data['id']); }
и получиться
игры
-гонки
-3D
проги
////////////
у меня БД sqlite , легко поправить на mysql

32. Nu3oN (15.05.2010 / 07:51)
demeros (Вчера / 18:39)
28 ну как по другому? Всеравно считать все записи одним запросом не выйдет! Тогда кешируй:считывай как в моем предыдущем посте и пиши в файл по порядку. Например для каждой основной категории будет один файл со всеми подкатегориями!
мне оно не надо! я это все узнаю по категориям, и записываю в кеш! без базы данных, и ни каких заморочек!

URL: https://visavi.net/topics/8348