За последние 24 часа нас посетили 40439 программистов и 1278 роботов. Сейчас ищут 1225 программистов ...

Банально, но ;) пишу CMF ищу единомышленников

Тема в разделе "Прочие вопросы по PHP", создана пользователем d1gi, 20 дек 2011.

  1. d1gi

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

    С нами с:
    24 май 2009
    Сообщения:
    326
    Симпатии:
    0
    Предлагаю познакомиться с текущими наработками системы. Целью написания данного поста является поиск заинтересованных лиц и единомышленников с которыми представится возможность вместе заниматься дальнейшей разработкой данной системы :) Ниже расписаны некоторые моменты, конечно это далеко не всё, по этому предлагаю задавать вопросы, буду стараться на все достаточно подробно ответить, хотя некоторые вещи в какой-то степени расписаны в вики http://smart-core.org/wiki/.

    Предназначение движка.

    - Создание веб-сайтов различной сложности и направленности, например: блоги, новостные сайты, интернет-магазины, просто визитки и т.д. :)
    - Сайты созданные на движке обладают лаконичным и удобным интерфейсом управления т.е. их сайты можно смело и спокойно передавать клиенту, который не является профессионалом в ИТ :)
    - В будущем система будет включать возможности для распределённых проектов.

    Преимущества.

    - Движок разрабатывается из рассчета на низкое потребления ресурсов сервера, сейчас можно оценить потребление памяти и скорость выполнения скриптов.
    - Достаточно лёгкое написание модулей.
    - Также достаточно лёгкое внедрение тем оформления.
    - Использование современных технологий, хотя пока и поддерживается PHP линейки 5.2, но в будущем будет только 5.3+. Также планируется внедрение поддержки PostgreSQL, SQLite, MongoDB, Memcache, Redis и т.д.

    Текущий статус.

    На данные момент уже заложены в архитектуру системы и реализованы следующие вещи:
    - Система шаблонизации.
    - Управление базовыми сущностями системы: папки, ноды, контейнеры и т.д.
    - Мультисайтовость — возможность на одной инсталляции системы обеспечить работу нескольких независимых сайтов.
    - Концептуальные наработки по фонт-енд админке.
    - Кэширование страниц целиком для гостей.
    - Система прав доступа для папок и нод.
    - Подсистема почтовых рассылок..
    - Система запуска задач по расписанию.
    - Некоторые базовые функциональные модули: авторизации и регистрации юзеров, текстовын блоки, простая фотогалерея, новости и каталог на компоненте «юникат», веб-формы...
    - Особая особенность в движке, это компонент «юникат», весьма гибкая и мощная система управления каталогизированных данных. Юникат в целом уже весьма рабочий, но еще в разработке и требует доработки для работы с некоторыми типами данных и внедрения кеширования.
    - Возможность применение единой базы пользователей для разных сайтов, в том числе расположенных на разных серверах.

    Для коллективной разработки подняты вики, форум и планировщик задач (так же изместный, как баг трекер), основной репозиторий Git насположен на http://sourceforge.net/projects/smart-core-cmf/.

    Планы на развитие.

    - В архитектуре системы скорее всего будет внесены небольшие изменения, хотя они могут коснуться в большей части толкьо программного кода.
    - Допиливание базовых модулей: комментарии, профили пользователей, интернет-магазин.
    - Оптимизация под высокие нагрузки, внедрение поддержки разнообразных систем кеширования.
    - Мультиязычность, как контента, так и пользовательских интерфейсов.

    Кому проект может быть интересен.

    - Практикующим разработчикам сайтов. На данный момент можно сделать пока несложные проекты и частично проекты средней сложности. Но в системе заложен понтециал для весьма сложных систем, например социальные сети и мультиблоги.
    - Разработчикам, которые применяют различные готовые системы и чувствуют некоторую неудобвленность этих систем ;) т.е. есть идеи что должно быть в системе, чтобы было действительно удобно.
    - Начинающие разработчики, которые хотят изучить принципы работы систем управления проектов, а также самим поучавствовать в развитии движка.

    Кому проект скорее всего будет НЕ интересен ;)

    - Людям, которые не занимаются созданием веб-сайтов.
    - Сторонникам параноидального ООП, где каждая рюшечка должна быть оформлена в виде каскада наследуемых классов и обязательно всё подкрепрено тестированием т.е. тестирование и ооп это хорошо, но всему есть мера.
    - Ищущим уже полностью готовое и развитое решение.

    Где взять

    Скачать архив с демо-версией можно отсюда https://sourceforge.net/projects/smart-core-cmf/files/, здесь архив подготовленный для простого разворачивания на хосте, включающий все таблицы и демо-данные для 2-х сайтов привязанным к доменам loc и loc2.

    Также в git доступны скрипты для инсталляции, но с ними есть некоторые тонкости ;) по этому для знакомства с системой лучше использовать именно полный архив с демкой.

    ЗЫ: срачникам привет! ;) можете поднимать вонь на сколько у вас мощи найдется ;)))
     
  2. alive342

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

    С нами с:
    21 апр 2011
    Сообщения:
    137
    Симпатии:
    0
    Адрес:
    Российская Федерация
    мда, автору как минимум стоит прочитать книгу "Чистый код"
     
  3. d1gi

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

    С нами с:
    24 май 2009
    Сообщения:
    326
    Симпатии:
    0
    и "совершенный код" тоже :)

    ЗЫ: срачникам привет! :)
     
  4. alive342

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

    С нами с:
    21 апр 2011
    Сообщения:
    137
    Симпатии:
    0
    Адрес:
    Российская Федерация
    можно и "совершенный код" тоже, достойная книга :)
     
  5. d1gi

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

    С нами с:
    24 май 2009
    Сообщения:
    326
    Симпатии:
    0
    что по поводу архитектуры системы скажете? т.е. не про ООП и не про быдрокодные буковки, а именно про архитектуру задумки проекта.
     
  6. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Код (Text):
    1. function cf_format_filesize($input, $metric = NULL)
    2. {
    3.     if (!$metric)
    4.         $metric = array('байт', 'Кб', 'Мб');
    5.    
    6.     if (is_file($input))
    7.         $input = filesize($input);
    Правильно ли я понял, если я передаю в функцию число, но в текущей папке у меня оказывается файл например "23234879243" то функция даст мне не тот результат которого я жду ?

    ИМХО автоматика не всегда хорошо, я бы всё же явно указывал при вызове файл передаётся или нет...

    И далее идёт кстати шедевр
    Код (Text):
    1.     elseif (isset($metric[1]) && (($input = $input / 1024) < 1024))
    2.         $unit = $metric[1];
    3.  
    4.     elseif (isset($metric[2]) && (($input = $input / 1024) < 1024))
    5.         $unit = $metric[2];
    6.  
    7.     elseif (isset($metric[3]) && (($input = $input / 1024) < 1024))
    8.         $unit = $metric[3];
    9.  
    10.     elseif (isset($metric[4]) && (($input = $input / 1024) < 1024))
    11.         $unit = $metric[4];
    Поищите по форуму, помню мы тут флудили на эту тему, много красивых решений было... А то что у вас это простите "быдлокод"

    ЗЫ: и вам тоже привет! :)
     
  7. d1gi

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

    С нами с:
    24 май 2009
    Сообщения:
    326
    Симпатии:
    0
    cf_format_filesize() не я писал, откудато спер просто потому что мне надо было конвертировать размеры файлов в человероконятный вид. к архитектуре системы это не относится, если у вас есть более грамотная реализация какого-либо фрагмента кода, то проект опенсорц, пожалуйста вливайтесь :)
     
  8. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Да и сам по себе $metric опциональным делать я бы не стал, его надо подключать либо из языкового файла (если есть поддержка мультиязычности) либо вообще убрать (если поддержки нет и не предвидится)
     
  9. d1gi

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

    С нами с:
    24 май 2009
    Сообщения:
    326
    Симпатии:
    0
    Описание концепции архитектуры выложил в вики, вот по этому адресу:
    http://smart-core.org/wiki/Основы_архитектуры

    Можно было бы и тут запостить, но подумал, что во первых многовато текста, а во вторых сама статья будет еще дописываться, по этому лучше ссылкой :)

    Vladson, вот тут http://smart-core.org/wiki/ есть раздельчик: Что надо сделать, и там есть пункт, 4. Мультиязычность. Т.е. мультиязычность предвидется, а сейчас её почти нет, но есть рассчет, что будет и подготовлены например таблицы БД для этого... По поводу cf_format_filesize() посмотрите где он используется и вопросы отпадут почему он именно такой ;) лучше обсудить архитектуру самой системы (не прогаммного кода), а по реализации я сам могу много чего наговорить ;)
     
  10. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Они не отпадут, если сначала писать код а потом думать и даже мечтать в будущем поправить, то рано или поздно упрёшься в тупик. Сначала надо планировать, а уже потом писать. Неожиданности всё равно будут, но когда их меньше, то есть шанс их уладить.
     
  11. d1gi

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

    С нами с:
    24 май 2009
    Сообщения:
    326
    Симпатии:
    0
    согласен, но абсолютно всё и сразу в одиночку я не могу предусмотреть :( будем считать, что это одна из неожиданностей ;) притом ну очень несущественная, которую можно прям сейчас вырезать из кода и ничего не изменится :)

    а по архитектуре у вас есть замечания? ;) или хотябы не по функции cf_format_filesize() ;))
     
  12. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Vladson
    Недавно вот читал где-то, кажется на хабре... Ну в общем там смысл был противоположный твоим словам :) Типа, не стоит долго думать, начинайте писать, все проблемы и вопросы будут намного быстрее решаться по ходу написания, чем если сидеть и днями размышлять на тему "как же сделать лучше" :) Так никогда ничего и не сделаете и то место, которое мог занять ваш сайт - займут другие :)
     
  13. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Об этом говорил Ашманов, но имел в виду совсем другое, быдлокодеры же его славами стали прикрывать своё ламерство. (и на хабре таких очень много, особенно РНР-шников у которых от инвайта на хабр выросло самомнение)

    Да, в WEB часто нужна модель мягкого ввода, т.е надо выкладывать бету раньше всех, а потом допиливать. Для этого и нужны готовые фреймворки (в них уже всё продумано, т.е за 10 минут пишешь например блог а потом ты только допиливаешь его до уровня например хабра)

    Писать же свой фреймворк, это другое дело, если он не разрабатывался с умом, и если в его планирование не ушло 90% времени и не учтены все мелочи, то очень скоро будут выскакивать незапланированные мелочи и разработка как самого фреймворка так и того что с его помощью пишут зайдёт в тупик.
     
  14. Михаил

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

    С нами с:
    12 июл 2009
    Сообщения:
    545
    Симпатии:
    0
    Адрес:
    Bielarus
    уочень авторитетный ресурс, ага
     
  15. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Ну в данном конкретном случае скорее всего просто цитировали Ашманова... (он достаточно авторитетный дядька) другое дело что его слова выдрали из контекста
     
  16. d1gi

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

    С нами с:
    24 май 2009
    Сообщения:
    326
    Симпатии:
    0
    По замечаниям с форумов проведен некоторый рефакторинг кода, теперь стало больше «магии» ;) имхо стало красивее, да и на скорость не повлияло. Также из новых функций добавлена возможность кеширования нод, как фрагменты html кода. Пока настройка кеширования нод выполняется ручками через свойства ноды в формате yaml, а также надо включить флаг в файле _temporary.php, дальше будет реализована более првильная админка ;)

    Провел первые тесты на выносливость и скорость. Пока тестировал только apache bench с параметрами -c500 -t60 -k -H "Accept-Encoding: gzip", а также -с1. При одном юзере при включенном кеше страниц для гостей показатель очень вкусный, обычно страница отдаётся примерно за 0.002 сек т.е. быстренько выпуливается из кеша :) а без кеша страницы отдаются в среднем за 0.03-0.07 сек, что в прицнипе хорошо.

    Приглашаю снова покрутить код, а также посмотреть в действии систему, для этого надо скачать с сурсфорга последний .zip архив и установить на своём сервере (в будущем обязательно будет доступен публичный тестовый сайт). Все замечания и предложения привествуются, а также приглашаются все желающие принять участие в развитии данного проекта! :)

    На всякий случай еще раз напомню ссылку на страничку проекта: http://smart-core.org/ оттуда же можно и скачать и выйти на вики и форум.
     
  17. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Ммм, 0.002 сек для кеша, это не быстренько. У меня на порядок меньше на средненьком сервере. Смотри, например, mosreklama.net, внизу (если там показано кол-во запросов, то нужно перезагрузить). Но, конечно, смотря что и как кешировать.
     
  18. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    d1gi
    cf_format_filesize() не я писал
    Такая функция вобще не нужна в таком виде. Есть функция получения размера в пхп. Нужна функция пересчета размера в человекоудобоваримый вид. Кому нужно узнать размер файла в КБ тот сначала запросит размер файла, а потом прогонит через эту функу. Вот это правльный подход.

    вот кстати моя если чо.
    кто кстати назовет это быдлокодом - тот лох!


    PHP:
    1. <?
    2. function HumanBytes($size) {
    3.     $filesizename = array(" Bytes", " KB", " MB", " GB", " TB", " PB", " EB", " ZB", " YB");
    4.     return $size ? round($size / pow(1024, ($i = floor(log($size, 1024)))), 2) . $filesizename[$i] : '0 Bytes';
    5.   }
    шутка. критика всегда приветствуется.
     
  19. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    d1gi
    мультиязычность предвидется, а сейчас её почти нет, но есть рассчет, что будет и подготовлены например таблицы БД для этого...
    мультиязычность делается через одну таблицу с тремя или четырьмя полями.
     
  20. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Vladson
    РНР-шников у которых от инвайта на хабр выросло самомнение)
    Мне! Мне очень надо подрастить самомнение, так что если у кого есть инвайт - я буду оч рад принять его =)
     
  21. Михаил

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

    С нами с:
    12 июл 2009
    Сообщения:
    545
    Симпатии:
    0
    Адрес:
    Bielarus
    к функции нет вопросов, но в именовании согласно стандарту нужно human_bytes, и также 1024 ---> 1 КиБ, а не КБ, такие дела.
     
  22. d1gi

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

    С нами с:
    24 май 2009
    Сообщения:
    326
    Симпатии:
    0
    кеширование тестил так:
    1. Хост-машина: core-i3-530 2.9МГц/4г рам/win7-32bit
    2. Виртуальная машина: virtualbox-4.1.8/768м рам/100%cpu/VT-x и NestedPaging включены
    3. Архитектура веб-сервера: nginx на фронте, apache+mod_php на бакенде.
    4. Конфигурация php тут: http://smart-core.org/vbox-phpinfo.html

    с хостовой машины запускаю ab с ключами ab.exe -c1 -t60 -v0 -k -H "Accept-Encoding: gzip" http://10.4.4.4/SmartCore/
    в результате получаю 0.0017 сек, что округлил до 0.002 :) а вот например один файл с командой echo "123"; выдаёт 0.00065 сек, т.е. примерно всего в 2.5 раза быстрее.

    опишите на словах как именно, по какому алгоритму у вас выдаётся страница из кеша для гостей?

    igordata, да действительно отличная идея, вынести "человекизацию" разных метрик в отдельный класс! :)) даже думаю лучше тудаже добавить возможности переводить меры масс, длины, времени и т.д. :)) благодарю на наводку :)

    по поводу мультиязычночсти: пихать все переводы разных сущностей в отну таблицу нехочу... чувствую что это несовсем верно... пока остановился на решении хранения переводов каждой сущности в отдельной таблице... на самом деле кол-во этих таблиц будет очень невелико, например сейчас созданы таблицы для "папок", тектовых блоков, меню и вебформы... и более того структуры этих таблицы разные, например для пунктов меню ненужны мета-данные, для в вебформе, к переводу относится кнопка подтверждения и т.д...
     
  23. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    d1gi
    по поводу мультиязычночсти: пихать все переводы разных сущностей в отну таблицу нехочу...
    я тебя не спрашиваю и не советую =)

    все переводы ДОЛЖНЫ жить в одной таблице по простым причинам, нравится нам это или нет. Это не от нашего желания и ощущения зависит.
    1 - это переводы, это таблица для переводов, они живут в ней.
    2 - все переводы одинаковые. они лезут в таблицу с такой структурой: id (не обязательно), язык, номер сообщения, сообщение.
    3 - выборка осуществляется одним и тем же запросом к одной и той же таблице, что прекрасно.
    4 - все модули всегда не зависимо от языка знают куда писать перевод и где его искать.

    =)

    А в остальном ты конечно можешь полагаться на свое чутьё! =)

    внесу пять копеек моего говнокода. сразу скопом с предыдущей функой
    PHP:
    1. <?
    2.  
    3.   ////////////////////////////////////////////////////////////////////////////////////////
    4.   // <editor-fold defaultstate="collapsed" desc="Превращение даты и прочего в человекочитаемый вид">
    5.  
    6.   public static function HumanDate($date) {
    7.     $date = strtotime($date);
    8.     $diff = time() - $date;
    9.     $days = floor($diff / 86400);
    10.     $hd = '';
    11.     if ($days == 0) {
    12.       //сегодня
    13.       $hd = 'сегодня в ' . date('H:i', $date);
    14.     } else {
    15.       if ($days > 0) {
    16.         //прошлое
    17.         switch ($days) {
    18.           case 1:
    19.             $hd = 'вчера в ' . date('H:i', $date);
    20.             break;
    21.           case 2:
    22.             $hd = 'позавчера в ' . date('H:i', $date);
    23.             break;
    24.         }
    25.       } else {
    26.         //будущее
    27.         switch ($days) {
    28.           case -1:
    29.             $hd = 'завтра в ' . date('H:i', $date);
    30.             break;
    31.           case -2:
    32.             $hd = 'послезавтра в ' . date('H:i', $date);
    33.             break;
    34.           case -3:
    35.             $hd = 'через три дня';
    36.             break;
    37.         }
    38.       }
    39.     }
    40.     if ($hd == '') {
    41.       $hd = date('d.m.Y H:i', $date);
    42.     }
    43.     return '<acronym title="' . date('d.m.Y H:i', $date) . '">' . $hd . '</acronym>';
    44.   }
    45.  
    46.   public static function HumanDatePrecise($date) {
    47.     $r = false;
    48.     $a = preg_split("/[:\.\s-]+/", $date);
    49.     $d = time() - strtotime($date);
    50.     if ($d > 0) {
    51.       if ($d < 3600) {
    52.         //минут назад
    53.         switch (floor($d / 60)) {
    54.           case 0:
    55.           case 1:
    56.             return "<acronym title='$date'>только что</acronym>";
    57.             break;
    58.           case 2:
    59.             return "<acronym title='$date'>только что</acronym>";
    60.             break;
    61.           case 3:
    62.             return "<acronym title='$date'>три минуты назад</acronym>";
    63.             break;
    64.           case 4:
    65.             return "<acronym title='$date'>четыре минуты назад</acronym>";
    66.             break;
    67.           case 5:
    68.             return "<acronym title='$date'>пять минут минуты назад</acronym>";
    69.             break;
    70.           default:
    71.             return "<acronym title='$date'>" . floor($d / 60) . ' мин. назад</acronym>';
    72.             break;
    73.         };
    74.       } elseif ($d < 18000) {
    75.         //часов назад
    76.         switch (floor($d / 3600)) {
    77.           case 1:
    78.             return "<acronym title='$date'>час назад</acronym>";
    79.             break;
    80.           case 2:
    81.             return "<acronym title='$date'>два часа назад</acronym>";
    82.             break;
    83.           case 3:
    84.             return "<acronym title='$date'>три часа назад</acronym>";
    85.             break;
    86.           case 4:
    87.             return "<acronym title='$date'>четыре часа назад</acronym>";
    88.             break;
    89.         };
    90.       } elseif ($d < 172800) {
    91.         //сегодня
    92.         //2011-07-14 16:20:44
    93.         // 0    1  2  3  4  5
    94.         if (date('d') == $a[2]) {
    95.           return "<acronym title='$date'>сегодня в {$a[3]}:{$a[4]}</acronym>";
    96.         }
    97.         if (date('d', time() - 86400) == $a[2]) {
    98.           return "<acronym title='$date'>вчера в {$a[3]}:{$a[4]}</acronym>";
    99.         }
    100.         if (date('d', time() - 172800) == $a[2]) {
    101.           return "<acronym title='$date'>позавчера в {$a[3]}:{$a[4]}</acronym>";
    102.         }
    103.       }
    104.     } else {
    105.       ////////////////////////////////////////////////////////////////////////////////////////
    106.       // В будущем   <editor-fold defaultstate="collapsed" desc="В будущем">
    107.       $d *= -1;
    108.       if ($d < 3600) {
    109.         //минут назад
    110.         switch (floor($d / 60)) {
    111.           case 0:
    112.           case 1:
    113.             return "<acronym title='$date'>сейчас</acronym>";
    114.             break;
    115.           case 2:
    116.             return "<acronym title='$date'>через две минуты</acronym>";
    117.             break;
    118.           case 3:
    119.             return "<acronym title='$date'>через три минуты</acronym>";
    120.             break;
    121.           case 4:
    122.             return "<acronym title='$date'>через четыре минуты</acronym>";
    123.             break;
    124.           case 5:
    125.             return "<acronym title='$date'>через пять минут</acronym>";
    126.             break;
    127.           default:
    128.             return "<acronym title='$date'>через " . floor($d / 60) . ' мин.</acronym>';
    129.             break;
    130.         };
    131.       } elseif ($d < 18000) {
    132.         //часов назад
    133.         switch (floor($d / 3600)) {
    134.           case 1:
    135.             return "<acronym title='$date'>через час</acronym>";
    136.             break;
    137.           case 2:
    138.             return "<acronym title='$date'>через два часа</acronym>";
    139.             break;
    140.           case 3:
    141.             return "<acronym title='$date'>через три часа</acronym>";
    142.             break;
    143.           case 4:
    144.             return "<acronym title='$date'>через четыре часа</acronym>";
    145.             break;
    146.         };
    147.       } elseif ($d < 172800) {
    148.         //сегодня
    149.         //2011-07-14 16:20:44
    150.         // 0    1  2  3  4  5
    151.         if (date('d') == $a[2]) {
    152.           return "<acronym title='$date'>сегодня в {$a[3]}:{$a[4]}</acronym>";
    153.         }
    154.         if (date('d', time() - 86400) == $a[2]) {
    155.           return "<acronym title='$date'>завтра в {$a[3]}:{$a[4]}</acronym>";
    156.         }
    157.         if (date('d', time() - 172800) == $a[2]) {
    158.           return "<acronym title='$date'>послезавтра в {$a[3]}:{$a[4]}</acronym>";
    159.         }
    160.       }
    161.       $d *= -1;
    162.       //, В будущем   </editor-fold>
    163.       ////////////////////////////////////////////////////////////////////////////////////////.
    164.     }
    165.  
    166.     $r = "{$a[2]}.{$a[1]}";
    167.     if ($a[0] != date('Y') OR $d > 0) {
    168.       $r .= '.' . $a[0];
    169.     }
    170.     $r .= " {$a[3]}:{$a[4]}";
    171.     return "<acronym title='$date'>$r</acronym>";
    172.   }
    173.  
    174.   public static function HumanBytes($size) {
    175.     $filesizename = array(" Bytes", " KB", " MB", " GB", " TB", " PB", " EB", " ZB", " YB");
    176.     return $size ? round($size / pow(1024, ($i = floor(log($size, 1024)))), 2) . $filesizename[$i] : '0 Bytes';
    177.   }
    178.  
    179.   //, Превращение даты и прочего в человекочитаемый вид   </editor-fold>
    180.   ///////////////////////////////////////////////////////////////////////////////////////.
     
  24. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    "Захардкоденые" (какое-то новое слово, на phpclub услышал) в функции "только что", "через четыре часа" и пр. не очень состыковываются с многоязычностью... :)

    А вообще мне кажется, что формат даты

    8 Января 2012, 23:51
    8 January 2012, 23:51

    более чем достаточно...
     
  25. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    d1gi,
    ну если так
    , то, конечно, не сравнить. У меня echo выводило где-то за 0.0001 и меньше.
    Очень сильно время увеличивается на операциях чтения из файла, а также получения статистики (время последнего изменения файла, размера и т.д.). Так что желательно максимально уменьшить количество запросов к диску.
    Сначала функцией file_exists($name) ищется кеш с уникальным именем вида "7e9a8105ebd66...", потом считывается $ct=@file_get_contents($name). Кстати, имя создается из обработанного ранее пути $path: $name='cache/'.md5($path.$salt).
    Потом проверяю, не пусто ли в том файле if(strlen($out)>10), и вырезаю первые 10 символов-цифр - там время, до которого позволительно жить кешу. Остальные символы в файле - html код, который нужно выдать браузеру. Если время истекло, то идем далее, инклудим остальные важные фрагменты и классы, подключаемся к БД и т.д. Если не истекло время жизни, то выдаем символы из кеша (со своими заголовками, если надо, инфу о которых можно запихнуть в тот же кеш в первые строчки).
    Итого получаем всего два запроса (из скрипта) к ФС в надежде, что кэш актуален: file_exists и file_get_contents.
    Ну остальное мелочи :)
    Это, конечно, самый простой случай кеширования. Если нужно устанавливать время жизни разным блокам, то, возможно, запихивать их в файлы, а потом читать, будет уже не оптимальный путь. Тогда лучше подключиться к БД.