Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Новостная лента на файлах


Автор: Osrus 15.2.2007, 00:56
Есть новостная лента (PHP), все новости пишутся в один текстовый файл, который является базой. На главной странице выводятся только, предположим, 10 сообщений.
Представим, что файл достигает размера, к примеру, 50 мб. Будет ли сервер обрабатывть запрос дольше? Меня интересует, как работает PHP  с файлами в принципе - обрабатывает весь массив файла, а потом выводит, указанные 10 или же обращается к конкретной части файла. 

Автор: Mal Hack 15.2.2007, 01:05
Смотря как работать. Стандартными функциями - весь файл грузится в память, если через потоки, то можно частями. Сам не пробовал

Автор: pento 15.2.2007, 06:39
Osrus, SQLite?

Автор: Всемогущий 15.2.2007, 07:57
Osrus, 
скажи пожалуйста ,какими функциями для чтения файла ты пользуешься ,и я скажу
Цитата(Osrus @  15.2.2007,  02:56 Найти цитируемый пост)
как работает PHP  с файлами



Автор: Gold Dragon 15.2.2007, 08:48
по моему, если делать новостную ленту на файлах, то лучше новости делить на разные файлы - по дням, неделям, месяцам, в зависимости от количества новостей. Или как вариант по количеству новостей.

И поиск будет удобный, да и не стоит заморачиваться о нагрузке на сервер.

Автор: Osrus 15.2.2007, 11:29
Всемогущий, 
Если никто не против, я приведу полностью код:  
Код

<?php

include("config.inc");

echo "";   

function cuttext($stre,$no_of_words) { 

        $str_array = split(" ",$stre,$no_of_words+1);      

        if(count($str_array)>$no_of_words) {               

                for($q=0; $q < $no_of_words; $q++) {       

                        print $str_array[$q]." "; } 
                              

                print "...";}       

        else {                                     

                print $stre; }    

                } 

function replace ($string)

        {

        global $exech;

        global $smile;

        $string = " ".$string;

        $string = eregi_replace ('([[:space:]()[{}])(www.[-a-zA-Z0-9@:%_\+.~#?&//=]+)', '\\1<a href="http://\\2" target="_blank">\\2</a>', $string);

        $string = eregi_replace ('([[:space:]()[{}])(http://.[-a-zA-Z0-9@:%_\+.~#?&//=]+)', '\\1<a href="\\2" target="_blank">\\2</a>', $string);

        $string = eregi_replace ("[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*","<a href=\"mailto:\\0\">\\0</a>", $string);

        if ($smile == 1){

        $autochange = file ($exech);

        $lines = count ($autochange);

        for($e=0;$e<$lines;$e++)

                {

                list($change1,$change2)=explode("|", $autochange[$e]);

                $string = eregi_replace("$change1","$change2",$string);

                }

        }

        return trim($string);

        }



$file_array=file("$all_file");

$lines = count($file_array);



if (!isset($page)) { $page = 1; }



function getPages($total, $page, $link, $perpage)

        {

        $mpp = $perpage;

        $prev_page = $page - 1;

        $next_page = $page + 1;

        if ($total <= $mpp) $pages = 1;

        elseif($total % $mpp == 0) $pages = $total / $mpp;

        else $pages = $total / $mpp + 1;

        $pages = (int) $pages;

        $s_pages    = $page<7 ? 1 : floor($page / 7) * 7;

        $e_pages    = $page + 6;

        if ($e_pages > $pages) { $e_pages = $pages; }

        $s = "";

        if ($pages > 6){

        if($prev_page != 0) { $s = "<a href=\"".$link."page=1\">&lt;&lt;</a>|"; }

        if($prev_page) { $s .= "<a href=\"".$link."page=$prev_page\">&lt;</a>|"; }}

        for($i=$s_pages;$i<=$e_pages;$i++)

                {

                if ($i != $page) { $s .= "<a href=\"".$link."page=$i\" class=a2>$i</a>|"; }

                elseif ($i != 1) { $s .= "<b>$i</b>|"; }

                elseif ($page != $pages) { $s .= "<b>1</b>|"; }

                }

        if($page != $pages && $pages > 6)

                {

                $s .= "<a href=\"".$link."page=$next_page\">&gt;</a>|";

                $s .= "<a href=\"".$link."page=$pages\">&gt;&gt;</a>|";

                }

        if (!isset($s) || $s == "") { $s = "<b>1</b>|"; }

        return $s;

        }

$print_pages = getPages($lines, $page, "$PHP_SELF?", $maxmess);



$from = $lines - ($page * $maxmess - 1);

$to = $lines - (($page - 1) * $maxmess);

if($from <= 0) { $from = 1; }



for($i = $to - 1; $i >= $from - 1; $i--)

        {

 list($add_date,$nick,$name_news,$linw,$mes)=explode("|||", $file_array[$i]);

$num = $i + 1;

$mes = replace($mes);

        list($timesq,$datesq)=split("_",$add_date);

        $add_date=$timesq.",".$datesq;

echo "
<table width=100% border=0 align=center cellpadding=0 cellspacing=0>
        <tr>
          <th width=25 height=46 scope=row bgcolor=#F4D187><img src=des/1.gif width=25 height=46 hspace=0 vspace=0 align=left /></th>
          <td height=46 align=center bgcolor=#F4D187></td>
          <td width=25 align=center  bgcolor=#F4D187><img src=des/2.gif width=25 height=46 hspace=0 vspace=0 border= align=right /></td>
        </tr>
        <tr>
          <th  scope=row bgcolor=#F4D187></th>
          <td align=center valign=middle bgcolor=#FFFFFF><table width=100% height= border=0 align=center cellpadding=0 cellspacing=0>
              <tr>
                <th width=10 height=10 scope=row background=des/22.gif></th>
                <td align=center style=background-color:#FFFFFF></td>
                <td width=10 background=des/33.gif></td>
              </tr>
              <tr>
                <th scope=row bgcolor=#FFFFFF></th>
                <td style=background-color:#FFFFFF align=left>$name_news $add_date<br><br> $mes <br><br><a href=comments.php?c=$add_date>Комментарии
</a> </td>
                <td style=background-color:#FFFFFF></td>
              </tr>
              <tr>
                <th height=10 width=10 scope=row background=des/11.gif></th>
                <td align=center style=background-color:#FFFFFF></td>
                <td background=des/44.gif></td>
              </tr>
          </table></td>
          <td width=25 align=right valign=bottom bgcolor=#F4D187>&nbsp;</td>
        </tr>
        <tr>
          <th   height=46 bgcolor=#F4D187 scope=row><img src=des/3.gif width=25 height=46 hspace=0 vspace=0 border=0 align=left /></th>
          <td height=46 align=center valign=middle  bgcolor=#F4D187></td>
          <td width=25 align=center bgcolor=#F4D187><img src=des/4.gif width=25 height=46 hspace=0 vspace=0 border=0 align=right /></td>
        </tr>
      </table><br>";

$linw = trim($linw);

if ($linw != "нет"){

echo " <span><b></b> <a href=$link target=_blank><span>$linw</a></span><br><br>";

}else{echo "<br>";}

$fc="comments/".$add_date.".txt";

if (file_exists($fc)){

$commen = count(file($fc));

echo "<font color=F3BA43>$commen</font>";

}


}

if($lines/$maxmess > 1){  

echo "<b><p align=left>Страницы :</b> |$print_pages</b></p><p><b>Всего новостей: $lines</b></p>";

}else{echo "";}

echo "";


?>


Если нетрудно, расскажите про эту функцию - function cuttext

Автор: mishaSL 15.2.2007, 18:19
Цитата(Osrus @  15.2.2007,  11:29 Найти цитируемый пост)
Если нетрудно, расскажите про эту функцию - function cuttext 


Osrus, извини но это твоя функция. А если ты взял чей-то код и не можешь понять по воспользуйся пожалуйста сначало мануалом. 
Для начала:
http://ru.php.net/file
http://ru.php.net/split


Теперь по вопросу размера файла и твоего кода:
Если сервер не твой, т.е. ты покупаешь виртуальный хостинг. Обычно стоит ограничение на использование памяти  от 2 до 10 мегабайт. Функция file как уже сказал Mal Hack загружает весь файл в память. Так что смотри сам на сколько может быть большой файл. Разбивай новости на несколько файлов, а еще лучше используй какую-нибудь БД, если это возможно.

Автор: Osrus 15.2.2007, 18:34
mishaSL, Спасибо.

Автор: Osrus 16.2.2007, 18:12

mishaSL,  Сп.. еще раз. А в случае, если для каждой отдельной новости создается
только один файл? По дате, например... т.е. дата(и время) становится именем файла.

Автор: mishaSL 16.2.2007, 18:25
Osrus, можно и так. Ты только скажи почему ты так настойчиво не хочешь использовать БД? smile 

Автор: Osrus 16.2.2007, 22:57
mishaSL, Открываю секрет... smile 
Я  не программист... знаю лишь HTML и КСС... но, изучая разные движки, остановился на одном, а именно SM news v 2. Кстати, автора движка, скорее всего, знает Mal Hack - так, на заметку... Так вот - движок мне этот полюбился тем, что в нем легко изменить дизайн. А с файлами, лично мне кажется, проще работать, да и Mysql я не знаю почти. Основной принцип, конечно, понятен... 
Конечно можно было бы поставить портальную систему, но там много функций, которые для моего сайта просто не нужны, да и дизайн изменять как-то мутороно.
Может быть,  я не прав, а может, просто много не знаю...
В чем, в принципе, + работы с БД? 

Автор: Serkys 16.2.2007, 23:20
Цитата(Osrus @  16.2.2007,  23:57 Найти цитируемый пост)
В чем, в принципе, + работы с БД? 

В первую очередь удобство и скорость.
До бесконечности можно перечислять.

Автор: Osrus 17.2.2007, 00:52
Только что потрошил sPaize-nuke... ладно, признаю - работает быстро... в принципе, и дизайн редактируется в Дриме довольно быстро. Но рыться в чужой верстке не очень по нраву. И функционально... это бд... Убедили, может, перетащу все на движок с БД.
Видимо, упрямство мешало...

А что про безопасность скажете? Если сравнить, к примеру, тот же php-nuke на Mysql
и модель сайта на файлах (к примеру, новостная лента с возможностью комментирования).

Автор: mishaSL 17.2.2007, 15:55
Цитата(Osrus @  17.2.2007,  00:52 Найти цитируемый пост)
А что про безопасность скажете? Если сравнить, к примеру, тот же php-nuke на Mysql
и модель сайта на файлах (к примеру, новостная лента с возможностью комментирования).


Безопасность будет зависить от самой реализации.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)