За последние 24 часа нас посетили 17399 программистов и 1271 робот. Сейчас ищут 1498 программистов ...

Почему не раб счетчик

Тема в разделе "PHP для новичков", создана пользователем ergocom, 12 июн 2008.

  1. ergocom

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

    С нами с:
    24 янв 2008
    Сообщения:
    12
    Симпатии:
    0
    Почему не раб счетчик?

    Код (Text):
    1. <?php
    2. class file
    3. {
    4. var    $file;
    5. var $bufer;    
    6. function __construct($files)
    7. {
    8.     //open file from directory
    9.     $this->file=fopen($files,"r+");
    10.     if(!$this->file)
    11.     {
    12.         echo "Error open file";
    13.     }
    14. }
    15. function bufer ()
    16. {
    17.     // here view
    18.     $this->bufer =fread($this->file,100);
    19. }
    20.  
    21. function prints()
    22. {
    23.     echo $this->bufer;
    24.     echo "<br>";
    25. }
    26.  
    27.  function __destruct()
    28.  {
    29.      fclose($this->file);
    30.  }
    31.  
    32. }
    33.  
    34. class file2 extends file
    35. {
    36.     function write($text)
    37.     {
    38.         fputs($this->file,$text);
    39.     }
    40.     function counts()
    41.     {
    42.         $total = 0;
    43.         while(!feof($this->file))
    44.         {
    45.         $str = fgets($this->file);
    46.         $total++;
    47.         }
    48.         echo $total;
    49.     }
    50.      
    51. }
    52.  
    53. $one = new file2 ("file.txt");
    54. $one->bufer();
    55. $one->prints();
    56. echo"<br>";
    57. $one->counts();
    58. echo"<br>";
    59. $text="best PHP";
    60.  $one->write($text);
    61.  
    62. ?>
     
  2. lexa

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

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Вероятно, из-за того, что рабство отменили?
     
  3. TROODON

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

    С нами с:
    4 ноя 2007
    Сообщения:
    112
    Симпатии:
    0
    lexa
    демократия =D хочет работает, хочет не работает)))
     
  4. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Никогда не думал, что 3х строковый счетчик можно расписать на строк 50, да и еще применить непроцедурный подход...
     
  5. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    ergocom
    Потому что всякие умники городят классы там, где можно без функций даже обойтись... Как Java прям...
    Вся фишка в том, что этот код можно заменить таким:
    PHP:
    1. <?php
    2. file_put_contents('total.txt',(@file_get_contents('total.txt')+1)); //Подсчет
    3. echo file_get_contents('total.txt'); //Вывод
    4. ?>
    :lol:
     
  6. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    [vs]
    Вот тебе тоже незачет. Зачем читать файл дважды?
     
  7. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Kreker
    Зато две строчки!! =)
    Можно конечно сделать так:
    PHP:
    1. <?php
    2. echo $total=@file_get_contents('total.txt'); //Вывод
    3. file_put_contents('total.txt',++$total); //Подсчет
    4. ?>
    Но не прикольно что считается хит после вывода...
     
  8. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    [vs]
    Две строчки хорошо, но не всегда может быть работе. Файл надо блокировать на время записи.
    Вообще fgc & fpc используются не для совместных действий. То есть, когда надо только прочитать или только записать в файл. Эти функции комбинации fopen, fwrite/fread/fclose.
    Про три строчки я, конечно, иронизировал.

    PHP:
    1.  
    2. <?php
    3. $contfil = fopen("G:\home\counter.txt","a+");
    4.  flock($contfil,LOCK_EX);
    5.  $counter = ((int)fread($contfil, 1024))+1;
    6.  ftruncate($contfil, 0);
    7.  fwrite($contfil,$counter);
    8.  flock($contfil, LOCK_UN);
    9.  fclose($contfil);
    10.  echo $counter;
    11. ?>
    12.  
    Я могу ошибаться насчет рациональности. Мой вариант не удобен для чтения, но может и более быстр.
    В твоем варианте, если я не ошибаюсь, можно обойтись без подавителя ошибок, если передать необходимый параметр функции. Да и кстати, можно и увеличивать хит перед выводом.
     
  9. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Мой выполняет 100.000 циклов в среднем за 25.13 сек. А ты свой на работоспособность и корректность работы проверял? :lol:
     
  10. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Не проверял. Это старый + добавил кое чего. Сейчас поправлю, я там напакостил. Просто не иррационально закрыть файл и тут же его открыть. Да и могут быть ошибки в подсчетах из-за одновременного открытия разными юзерами.
     
  11. avm

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

    С нами с:
    21 сен 2006
    Сообщения:
    597
    Симпатии:
    0
    Адрес:
    Москва
    [vs] первый кусочек был приятнее второго =) просто можно было чуток подправить
    PHP:
    1. <?php
    2. file_put_contents( $filename='total.txt', (($cnt=(int)@file_get_contents($filename))+1) ); //Подсчет
    3. echo $cnt."\n"; //Вывод
    4. ?>
    а на блокировки при таких счетчиках на сайте можно забить - такие решения на нагруженных проектах быть не могут.... =)))
     
  12. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    avm
    АААААА!!! До меня дошла гениальная мысль!!! ФУНКЦИЯ PRINT ВОЗВРАЩАЕТ ЕДЕНИЦУ!!
    Гы, счетчик хитов вместе с выводом в одну строку!
    PHP:
    1. <?php
    2. file_put_contents($filename='total.txt',(($cnt=(int)@file_get_contents($filename))+print $cnt) ); //Подсчет и вывод ;)
    3. ?>
    =)))))))))))))))))))
     
  13. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
  14. S.t.A.M.

    S.t.A.M. Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    1.041
    Симпатии:
    0
    Не мешайте человеку изучать объектно-ориентированное програмирование! )))
     
  15. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    S.t.A.M.
     
  16. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    ... Именно с такого кода начинался счетчик live internet