Показаны сообщения с ярлыком PHP. Показать все сообщения
Показаны сообщения с ярлыком PHP. Показать все сообщения

18.11.2008

CakePHP

Что-то я все чаще стал натыкаться на посты о Ruby On Rails, MVS и разных php-фреймворках. Думаю, пора обратить свое пристальное внимание на эту область веб-разработки.

С этого поста начну рассматривать один из самых популярных php-фреймворков на сегодняшний день – CakePHP.
Мы уже рассматривали различные js-фрейморки – jQuery и Dojo. Суть php-фреймворков все та же – упростить процесс разработки приложения.
Фреймворк CakePHP имеет архитектуру MVC (Model-Viewer-Controller) – “Модель-Вид-Представление”. Суть этой архитектуры заключается в разделении приложения на три составляющих – модель данных, пользовательский интерфейс и управляющая логика. Причем архитектура спроектирована так, что изменения одного из компонентов практически не отражается на других двух. Ключевым моментом тут является то, что представление и поведение зависят от модели, модель не зависит ни от представления, ни от поведения. Подобная организация позволяет строить модель независимо от визуального представления, а также создавать несколько различных представлений для одной модели.
С официального сайта CakePHP.org я скачал последнюю стабильную версию для своих экспериментов. После распаковки архива внутри вы увидите несколько папок: app, cake, docs и vendors.
Вот их предназначение: App – ваше приложение Cake – ядро фреймворка Docs – ну тут документация небольшая, лицензия, все дела. Vendors – тут можно будет складывать сторонние библиотеки
Раз все наше приложение будет находиться внутри папки app, следует разобраться, что там к чему. А внутри этой папки находится еще несколько папок: config, controllers, models, plugins, tmp, vendors, views, webroot.
С папкой config понятно – тут лежат конфиги фреймворка, конфиги для работы с базой данных и т.д.
Сontrollers, views и models соответственно будут содержать наше приложение разделенное на три компоненты, которые я упоминал ранее.
Plugins и vendors – плагины и сторонние библиотеки “быстрого доступа”, которые можно будет подгружать средствами фреймворка.
Tmp – тут временные файлы фрейморка (логи, кэш, сессии и т.д.).
Webroot – это, собственно, рабочая папка нашего проекта, которая также будет содержать папки с картинками, css-файлами и js-криптами.
Переходим к практической части.
Итак, быстрый старт. Продолжение на: http://i-novice.net/cakephp-bystryj-start/#more-120

Sypex Dumper

Sypex Dumper — это PHP-скрипт, с помощью которого можно просто и быстро создать резервную копию (бекап, дамп) базы данных MySQL, а также восстановить в случае необходимости базу данных из резервной копии. Sypex Dumper в отличии от многих подобных скриптов не загружает бекап-файл целиком в память, благодаря чему, ему безразличен размер базы данных и он одинаково быстро работает, как с маленькими, так и с большими объемами данных. Sypex Dumper создан специалистами украинской компании БИНОВАТОР. Sypex Dumper Lite распространяется по лицензии GNU GPL, т. е. является абсолютно бесплатным.

Облако тегов

Рассмотрим такую задачку как генерация облака тегов. ММы все конечно ни раз встречали это облако на других сайтах и блогах, но не все задумывались над реализацией этого облака на php. Общие моменты ясны из определения с wiki: “визуальное представление списка ярлыков (или категорий). Частота упоминаний, поисков, ссылок в интернете с определенного сайта неких слов, терминов, имен, отображается на специальной странице в виде изображения этих слов в формате гиперссылок. Размер изображения тем больше, чем выше релевантность данного слова (термина, имени).” Релевантность в нашем случае определяется количеством вхождений одного тега в их общую массу. Учитывая все вышесказанное, весь алгоритм построения облака тегов можно разделить на два этапа: Генерация списка пар Тег-Количество вхождений Вывод облака с учетом релевантности тегов Первая задача решается довольно просто с технической точки зрения. Вторая тоже, но здесь возможны вариации. Ниже приведу небольшой класс, который я написал для генерации облака тегов. исходниккопировать в буферпечать? tags = $tags; } private function get_tag_count($tag_name, $tags) { $count = 0; foreach ($tags as $tag) { if ($tag == $tag_name) { $count ; } } return $count; } private function tagscloud($tags) { $tags_list = array(); foreach ($tags as $tag) { $tags_list[$tag] = self::get_tag_count($tag, $tags); } return $tags_list; } private function get_min_count($tags_list) { $min = $tags_list[$this->tags[0]]; foreach ($tags_list as $tag_count) { if ($tag_count < $min) $min = $tag_count; } return $min; } public function get_cloud() { $cloud = Array(); $tags_list = self::tagscloud($this->tags); $min_count = self::get_min_count($tags_list); foreach ($tags_list as $tag=>$count) { $font_steps = $count - $min_count; $font_size = $this->font_size_min $this->font_size_step * $font_steps; $cloud[] = "".$tag.""; } return $cloud; } } ?> Скачать этот класс можно здесь: tagscloud.php, а работать с этим классом примерно так: исходниккопировать в буферпечать? get_cloud(); foreach ($tags_list as $tag) { echo $tag.' '; } ?> В результате работы этого примера в окне браузера Вы получите следующее: Второй этап построения облака тегов (вывод облака) заключается в преобразовании показателя релевантности (кол-во вхождений) в размер шрифта результирующей надписи. В классе я реализовал это следующим образом: в настройках задается минимальный размер шрифта, который соответствует минимальному уровню релевантности (одно вхождение). Все теги с большей релевантностью имеют размер на столько пикселей больше, на сколько больше они имеют вхождений. Шаг изменения можно задавать полем font_size_step, а минимальный размер шрифта полем font_size_min. Для дальнейшего усовершенствования внешнего вида можно прикрутить облако к небольшому js-скрипту. В результате чего получится такое облако: http://nacmnogo.ru/cloud.html. Подробнее про этот скрипт можно почитать здесь http://habrahabr.ru/blogs/javascript/38264/ Источник: http://i-novice.net/oblako-tegov/#more-101

Простая защита от DoS-атак с помощью MySQL

Организовать простую защиту от DoS-атак для сайтов, использующих PHP MySQL, можно следующим образом. В MySQL создается таблица (будем называть ее ip_check) с полями lasttime, count, ip (все поля — типа INTEGER, причем ip — первичный ключ).

Сразу после подключения к базе данных выполняется проверка, есть ли для данного IP-адреса запись в таблице. Если записи нет, она создается, при этом в count пишется 1, в lasttime — текущее время. Если запись уже есть, то проверяется, когда она была сделана (поле lasttime), и если прошло менее определенного количества секунд, то поле count увеличивается на 1, в противном случае приравнивается единице, и производится обновление записи в таблице (записывается новый count и lasttime). Далее происходит проверка величины count, и если она превысила некоторое пороговое значение, выдается статус 500 (или 403 или 503), сообщение об ошибке, и выполнение скрипта завершается.

Таким образом, для выполнения проверки требуется всего одной таблица с предельно простой структурой и 2 запроса SQL. Также можно добавить еще одно поле status, в которое ставить 1, если IP-адрес забанен навсегда по каким-то причинам, и совместить проверку на DoS-атаки с проверкой на забаненные IP-адреса без добавления дополнительных запросов. При необходимости можно еще одним запросом добавить учет суммарной нагрузки за все время или нагрузки по подсетям.

Кроме того, перед завершением скрипта можно добавить проверку, сколько времени заняло его выполнение, и если оно превышает какую-то пороговую величину (например, 10 секунд), начислять этому IP-адресу “штрафные очки” (т.е. дополнительно увеличивать поле count).

В виде кода это можно представить следующим образом:

// $link -- соединение с БД, $ip_text -- IP-адрес
define('ALERT_TIME',300);
define('ALERT_COUNT',150);

function check_dos($ip_text, $link)  {
$ip=ip2long($ip_text);
$res=mysql_query($link,'SELECT lasttime, count, status FROM ip_check WHERE ip="'.$ip.'"');
if (mysql_num_rows($res)==0) { // нет такого IP
$count=1;
mysql_query($link,'INSERT INTO ip_check (lasttime,count,ip,status) VALUES ('.time().',1,"'.$ip.'",0)');
}
else {
$data=mysql_fetch_row($res);
$status=$data[2];
if ($status!=2 && ($data[0]<time()-ALERT_TIME || $data[1]<ALERT_COUNT)))   $count=1;
elseif ($status!=2) { $count=$data[1] 1; if ($count>=ALERT_COUNT) $status=1; }
if ($status!=2) {
  mysql_query($link,'UPDATE ip_check SET count='.$count,', status='.$status.', lasttime='.time().' WHERE ip="'.$ip.'"';
}
if ($status) {
  header($_SERVER['HTTP_PROTOCOL'].' 503 Temporary Unavailable');
  trigger_error('Превышено число допустимых запросов!',E_USER_ERROR);
}
}

Кроме того, периодически следует очищать базу от старых записей (например, по cron). Кроме того, если ожидается большая интенсивность атак, возможно, имеет смысл заменить UPDATE-запрос на последовательность DELETE/INSERT, но в этом случае необходимо будет регулярно проводить оптимизацию таблицы.

Источник: Профессиональный Блог 4X_Pro http://www.xpro.su/archives/59

29.09.2008

Работа с датой и временем в PHP 5.2

Рано или поздно при разработке проекта встает вопрос о работе с датой и временем.

Начиная с версии 5.2 ядро PHP предоставляет для этой работы классы DateTime иDateTimeZone.

Существующие в PHP 4 и 5 функции для работы с датой и временем:

  • checkdate - Проверяет правильность даты по грегорианскому календарю
  • date и gmdate - Форматирует системную дату/время (gmdate форматирует по Гринвичу)
  • getdate - Возвращает информацию о дате/времени
  • gettimeofday - Возвращает текущее время
  • localtime - Возвращает системное время
  • mktime(gmmktime) - Возвращает метку времени для заданной даты (по Гринвичу)
  • strftime(gmstrftime) - Форматирует дату/время с учетом текущей локали (по Гринвичу)
  • strtotime - Преобразует текстовое представление даты на английском языке в метку времени Unix.

Улучшения работы с датами, начиная с PHP 5.1.

  • Использование 64-битного типа для хранения даты. Теперь граница интервала использования данного типа 4 Декабря 292277026596 год (ранее таймстамп представлялся в виде 32-битного целого, из-за чего ограничение его использования находилось между 1902 и 2038 годами).
  • Функция strtorime была переписана, за счет чего сократились издержки выполнения и количество ошибок в ней.
  • Полная поддержка временных зон, перевода часов и модификаторов дат, чего не было ранее.
  • Новый формат модификаторов временных зон.
  • Более продвинутые функции для работы с датами.

Форматы представления даты и времени, начиная с PHP 5.1

  • Американский формат: 9/11;4:08 pm;12/22/78; 8:51:00 am
  • Комбинированный формат: Sat, 24 Apr 2004 21:48:40 0200; 2001-11-29T13:20:01.123-05:00
  • Описательный формат: tomorrow; four months ago; last saturday; 20 days 2 hours
  • Текстовый формат: December 22. 1978; 22-december-1978
  • Все ISO 8601 форматы: 1978/12/22; 13:03:12.45678; 13:03:12.45678 0100; 15:57-8; 1978-12-22; 15:57:41 pdt; 13:03:12.45678 CEST; 231431 CEST; 70-4-25; 13:03 CEST; 04:05 -0930; 23:41F
  • Форматы баз данных: 1999-Jan-08; 1999.238

Временные зоны, начиная с PHP 5.1

  • Встроенная база на 551 временную зону
  • Нет зависимости от аббревиатуры временной зоны
  • Названия временных зон имеют формат - Continent/Location или Continent/Location/Sublocation. Зоны разделены на 10 больших групп: Африка, Америка, Антарктика, Арктика, Азия,Европа,Индия,Тихий океан. Каждая временная зона идентифицируется городом с наибольшим населением на данной территории. Существует также группа Другие, состоящая из вышедших из употребления названий и служащая для обеспечения обратной совместимости.

Изменение информации по временным зонам.

  • Обновления информации по временным зонам происходят около 20 раз в год
  • Большинство обновлений происходят неожиданно
  • Чтобы не потерять актуальность, релизы php должны быть достаточно часты
  • Расширение pecl, которое исправляет данные недостатки, называется timezonedb (pecl install timezonedb)

01.05.2008

Учебное пособие по PHP MySQL

Это действительно превосходный источник для начинающих PHP-программистов. Автор приводит массу примеров кода, используя который вы сможете сделать:

  • подключение к базе данных,
  • добавление, редактирование и удаление записей,
  • извлечение данных,
  • создание резервной копии базы данных.
Еще в довесок, на примере, разъясняется как создать простую CMS, использовать аутентификацию пользователей, создавать галерею изображений, а также форму с проверкой введенных пользователем данных. Ресурс — просто настоящая находка для тех, кто хочет подобные вещи сделать самостоятельно, не прибегая к помощи специалистов.

11.04.2008

Cайты по PHP, бесплатные скрипты PHP

http://www.php.net/manual/ru/index.php официальное руководство по PHP на русском языке http://php-ru.info/ - скрипты на php. http://www.phpclub.ru/?m=app - Здесь собраны php скрипты различных веб-приложений, платные php скрипты в этот каталог не входят, Вы можете заказать PHP скрипты на заказ обратившись к нам.

http://www.php-script.kiev.ua - Бесплатные скрипты PHP. http://nukefiles.ru/ - PHP-Nuke по-русски. Дополнительные модули, блоки, форумы поддержки. http://phpload.org/ - портал про PHP, все что можно узнать об программировании. Введение в PHP, история возникновения и развития PHP. http://phpclub.ru/ - ресурс о PHP, MYSQL, POSTGRES, APACHE. Здесь найдутся: готовые скрипты, очень активный форум с 5000 WEB-программистами, настройка apache, уроки и курсы php5, биржа труда, вакансии. http://www.php-adminka.ru - админка сайта на php MySQL - создание управляемых сайтов. http://php.spb.ru/ - PHP по-русски.

Официальные сайты (на английском): http://www.php.net/ http://phpnuke.org/

Форумы: http://www.phpforum.ru/ http://forum.phpc.ru/ http://forum.php-myadmin.ru/ http://www.phptalks.ru/

Архив блога