Показ дописів із міткою php. Показати всі дописи
Показ дописів із міткою php. Показати всі дописи

середу, квітня 22, 2009

Регулярные выражения php

regexpЯ надеюсь все знают, что такое регулярные выражения, публикую полезную таблицу и полезные примеры для web-разработчиков:


Ниже приведена таблица паттернов и их соответствий:

/pattern/Соответствие
x?ноль или один символ 'x'
x*ноль или больше символов 'x'
x+один или больше символов 'x'
.*ноль или больше любых символов
.+один или больше любых символов
{m}M символов
[]символы, заключенные в []
[^]символы, кроме заключенных в []
[0-9]любая цифра от '0' до '9'
[a-z]любая буква от 'a' до 'z'
[^0-9]любой символ, не находящийся между '0' и '9'
[^a-z]любой символ, не находящийся между 'a' и 'z'
/^.../первый символ в строке
/...$/последний символ в строке
\dодна цифра, то же, что и [0-9]
\d+одна или больше цифр, то же, что и [0-9]+
\Dодна не-цифра, то же, что и [0-9]
\D+одна или больше не-цифр, то же, что и [0-9]+
\wодин alphanumeric символ (латинская буква или цифра), то же, что и [a-zA-Z0-9]
\w+один или больше alphanumeric-символов, то же, что и [a-zA-Z0-9]+
\Wодин не-alphanumeric символ, то же что и [^a-zA-Z0-9]
\W+один или больше не-alphanumeric символ, то же что и [^a-zA-Z0-9]+
\sодин space символ (пробел, табуляция, новая строка), то же что и [\n\t\r\f]
\s+один или больше space символов, то же что и [\n\t\r\f]
\Sодин не-space символ, то же что и [^\n\t\r\f]
\S+один или больше не-space символов, то же что и [^\n\t\r\f]+
a|b|c'a' или 'b' или 'c'
abcподстрока "abc"
(pattern)() запоминает группу символов, присваивая их переменным $1, $2 и т.д. См. примеры.
/pattern/iигнорировать регистр букв

Это, конечно, не понять с первого раза, поэтому вот примеры:

ПримерОписание
$str=~/perl/;проверяет, есть ли в строке $str подстрока "perl"
$str=~/^perl/;проверяет, начинается ли строка с подстроки "perl"
$str=~/perl$/;проверяет, заканчивается ли строка на подстроку "perl"
$str=~/c|g|i/;проверяет, содержит ли строка символ 'c' или 'g' или 'i'
$str=~/cg{2,4}i/;проверяет, содержит ли строка символ 'c', следующие сразу за ним 2-4 символа 'g', за которыми следует символ 'i'
$str=~/cg*i/;проверяет, содержит ли строка символ 'c', слудующие за ним 0 или больше символа 'g', за которыми следует символ 'i'
$str=~/c..i/;проверяет, содержит ли строка символ 'c', и символ 'i', разделенные двумя любыми буквами
$str=~/[cgi]/;проверяет, содержит ли строка один из символов 'c', 'g' или 'i'
$str=~/\d/;проверяет, содержит ли строка цифру
$str=~/\W/;проверяет, содержит ли строка символы, не являющиеся буквами латинского алфавита и цифрами

Использование регулярных выражений:

1) Иногда требуется узнать расширение файла по его имени. Элементарное регулярное выражение выбирает все символы после последней точки;
# Пример в  PHP

$filename = '/index.php';

$out = array();

preg_match('/\S+\.(\S+)$/', $filename, $out);

# $out[1] будет содержать расширение файла - 'php'

2) Заменяет английские закрывающие кавычки-«лапки» на русские «елочки»;
# Пример в  PHP

$text = preg_replace('/(\S)"([ .,?!])/', '$1»$2', $text);

3) Простая проверка правильности введенного адреса электронной почты;
# Пример в  PHP

$is_ok = preg_match('/^(.+@.+\..+|)$/', $text);
4) Находит в тексте и автоматически преобразует адреса, начинающиеся с ftp://, http://, https:// в активные ссылки;
# Пример в  PHP

$text = preg_replace("#(https?|ftp)://\S+[^\s.,>)\];'\&
quot;!?]#", '\\0', $text);

четвер, березня 26, 2009

Nested Set Symfony или CodeIgniter

symfonyО проблемах хранения деревьев в SQL базах данных вопрос можно не поднимать, просто сказать, что они есть. Теорию, посвященную описанию этих деревьев и как организована структура в базе данных, можно найти на сайте Wikipedia. В данном же посте я опишу свой класс, который я разработал для манипулирования Nested Set в Doctrine для CodeIgniter или Symfony. При помощи этого класса, можно не задумываясь вставлять, удалять, перемещать ноды дерева. Класс писался с прицелом, на то, что его можно будет легко заменить другим классом, не работающим с Nested Set, но предоставляющим такой же API. Также важная поправка, класс писался используя плагин к Doctrine Nested Set.
Первое, что я создал для класса вложенных множеств это его интерфейс:
interface Hierarchical
{
public function build($object);
public function _getTree();
public function _getBranch($branch = 0);
public function _add($parent);
public function _delete($id);
public function _replace($parent,$id);
}
Благодаря интерфейсу, иной класс, наследуя его может с легкостью заменить класс вложенных множеств.

Сам класс выглядит так:
class NestedSet extends Doctrine_Record implements Hierarchical
{
public function build($object)
{
$this->iObject = $object;
$this->Object = Doctrine::getTable($this->TABLE_NAME)->getTree();
$this->hasManyRoots = $this->Object->getAttribute('hasManyRoots');
}

public function _getTree()
private function getChildren($item)
public function _getBranch($branch = 0)
public function _add($parent)
public function _delete($id)
public function _replace($parent,$id)
}
Зная, о том, что деревья могут содержать несколько рутовых веток или одну рут-ветку некоторые функции учитывают эту особенность.

Функция получения Дерева в Nested set:
public function _getTree()
{
$this->TreeArray = array();

if ($this->hasManyRoots)
{
$rootColumnName = $this->Object->getAttribute('rootColumnName');
foreach ($this->Object->fetchRoots() as $root)
{
$options = array('root_id'=>$root->$rootColumnName);
foreach($this->Object->fetchTree($options)->toArray() as $node)
{
$this->TreeArray[$root->$rootColumnName][] = $node;
}
}
}
else
{
foreach ($this->Object->fetchTree()->toArray() as $node)
{
$this->TreeArray[$node['level']][] = $node;
}
}
return $this->TreeArray;
}
Как видно из кода все ясно и понятно.

Особенности создания правильной структуры Nested Set, и как создавать Many Roots деревья используя Doctrine yaml в схемах, я опишу немного позже.

Вот основная функция, которая работают с деревом Nested Set в Symfony и в CodeIgniter используя PHP ORM Doctrine плагин. Сам класс получился довольно простым и дееспособным. Остальные функции, выложить не удалось из-за нечитабельного их расположения на страницах блога (код вылазит за границы страницы и надо его вручную подгонять, а мне лень).
Весь код класса я могу выложить сюда же в блог, по первому требованию девелоперов, для того, что бы сократить время затраченное на разработку тех или иных задач, в которых используется NestedSet.

Основную информацию по легкому созданию и управлению деревьями вы можете взять отсюда и написать свой собственный класс.

В дальнейшем я планирую написать легкое и доступное овервью как создавать деревья посредством Doctrine yaml схем, и как использовать SimpleTest в Doctrine для методики TDD.
Также хочу насторожить тех девелоперов, которые впервые работают с Nested Set. Переход от структуры смежных вершин к вложенному множеству влечет за собой некий дискомфорт ))).

середу, березня 25, 2009

PHP ORM Doctrine и почему ее надо использовать.

DoctrineСклоняетесь или интересуетесь ORM?
Знаете PHP, но не работали с ORM?
Слышали про Doctrine, но толком не вкурите в чем соль?
Тогда Вам сюда. Здесь я постараюсь описать свое впечатление от работы с системой, а вы возьмете на заметку. Ведь в конечном итоге Вам решать работать с ней или нет.

Что такое ORM?
Ну вообще ORM простыми словами, это система, которая позволяет абстрагироваться от БД и работать на уровне обьектов. В чем соль?
Вся соль в том, что я могу сказать обьекту:
$обьект->сохранись();
И он сохранился, а sql я не пишу. Жииииррррр.....

Итак:
Я переключился на Doctrine после двугодичной разработки самописных систем. Что такое самописная система надеюсь все знают, это когда все написано от руки и это все модифицируется и со временем выростает в громадную кучу кода. С которой уже не хочется работать.
Doctrine
Так вот после этих двух лет, я открыл для себя новый горизонт. Первое, что мне понравилось в Доктрине, это:
  1. То, что написание sql запросов в разы улучшается, с точки зрения подхода! Именно с точки зрения подхода, а это важно. Важно, потому что это огромная экономия времени на написании и на дебаге sql запросов. Вообще Doctrine абстрагируется от базы данных и работать с ней, становится одним удовольствием.
  2. Doctrine позволяет подходить к разработке посредством сущности - СУПЕР КЛАССНО. Объявив один раз сущность "Новость", я могу вертеть ей как мне захочется, это также громадная экономия времени. Я могу связать эту сущность с сущностью "Категория" и с легкостью выбирать все новости по категории.
  3. Doctrine использует innoDB таблицы MySQL сервера. А innoDB в свою очередь тянет за собой весь свой потенциал. Особенно мне нравятся каскадные удаления. А раньше я писал проверки и удалял руками из одной таблицы, потом из другой.
  4. Я в восторге от подхода Доктрины к формированию БД и обьектов посредством фикстур и схем. Описав их один раз, я могу с легкостью разворачивать проект где мне угодно и не заботиться о дампах баз данных.
  5. Мне очень нравится плагин к Доктрине Nested Set (вложенное множество), который я сразу же начал использовать в новом проекте.
И еще мне много чего в ней нравится, но главное это наверное одно: "Простота и быстрота решения поставленных задач".

Есть в ней конечно и минусы и иногда даже нужно лезть в код и править саму Doctrine. Есть некоторые недоразумения в объявлении yaml схем, также в составных ключах и использование праймери ключа в таблицах. Также минус для новичка, это довольно скудная и сложная для чтения документация API. Но эти минусы можно виртуозно обходить используя другие подходы к решению задач.
Doctrine предоставляет свой репозиторий, откуда можно высосать последнюю версию. Еще у нее есть открытый для пользователя Trac. Сама она написана тоже достаточно не сложно. Так что вам и карты в руки.

Использование Doctrine вместе с Symfony или CodeIgniter позволяет юзать классный OOP PHP5, что есть очень хорошим опытом и развитием для программиста. Но я пошел дальше, я прикрутил SimpleTest и стал использовать методику TDD.

Как итог могу подвести следующее: PHP ORM Doctrine включает в себя немалый потенциал, есть конечно и минусы и плюсы, но в целом мне нравится их подход, если первый проект отрекомендует себя довольно неплохо, вряд ли я откажусь от Доктрины.

Класс посвященный управлению Nested Set в Symfony с использованием Doctrine.

понеділок, березня 23, 2009

Как установить php memcache

memcachedНебольшое howto, как установить memcached.
Вы можете собрать и установить memcached из исходных кодов, из пакетов или при помощи инсталлятора.

Установка memcached при помощи инсталлятора:
  • На RedHat, Fedora или CentOS используйте yum:
root-shell> yum install memcached
  • Для установки на Debian или Ubuntu используйте apt-get:
root-shell> apt-get install memcached
  • На Gentoo используйте emerge:
root-shell> emerge install memcached
  • Для установки на OpenSolaris используйте pkg для установки SUNWmemcached пакета
root-shell> pkg install SUNWmemcached
Сборка memcached из исходников:
На других Unix-подобных платформах, включая Solaris, AIX, HP-UX и Mac OS X и дистрибутивы Linux не перечисленные выше, вы должны собирать memcached из исходников. Для Linux есть некоторые требования:
  1. Релиз ядра версии 2.6;
  2. Библиотека libevent версии 1.1 или выше;
Скачать memcached вы можете отсюда!
Сама сборка:
shell> gunzip -c memcached-1.2.5.tar.gz | tar xf - 
shell> cd memcached-1.2.5
shell> ./configure
Опции для конфигурации:
  • --prefix
Если хотите сменить директорию установки;
shell> ./configure --prefix=/opt
По умолчанию установка производится в /usr/local;
  • --with-libevent
Если у вас установлен libevent и configure не может его найти используйте --with-libevent для нахождения библиотеки;
  • --enable-64bit
Для сборки 64-битовой версии memcached используйте --enable-64bit;
  • --enable-threads
Для поддержки мультипоточности в memcached, используйте --enable-threads.Улучшает время реакции сервера;

Запустите make для сборки memcached;
shell> make
Запустите make install для установки memcached;
shell> make install

неділю, березня 22, 2009

php - программист, или работаю за еду

php freelancerГде-то на московском сайте, я прочитал, что php-программисты в Москве работают за еду. Капец. Неужели php настолько плох? Или это москвичи как всегда зажрались...

С тех пор прошло пару лет. Я уже состоявшийся php-программист, как ни странно ))) Я начал просматривать вакансии программистов в google и блин, ни одной вакансии где нужен php. Хотя нет, есть одна, но там этот язык упоминается наряду с perl, python. Тоесть сам по себе он не нужен. Я расстроился! Я стал просматривать вакансии программиста php в Украине, и нашел довольно таки неплохие.

Компании требуется php-программист со стажем работы от 3 лет, со знанием еще всяких веб-технологий и зарплата нормальная...

Странно!
В нашей стране веб-программист, пишущий на php довольно востребован и за эту работу платят довольно не малые деньги. Да и в Москве наверное много людей неплохо зарабатывают используя данную технлогию. Много студентов, устраивающихся на работу знают php. В интернете куча наколенных решений с применением php. Вообщем полно всего.
Казалось бы все смотрит в сторону php.

Но! Это если посмотреть со стороны заказчика. Технология простая и быстрая, а главно действенная, а главное, относительно дешевая наряду с тем же питоном.

Держать штат php-программистов, в котором работаю за еду3 гуру программирования, 10 стажеров и еще 7 средних программеров намного дешевле и выгоднее, чем содержать штат из 20 гиков, пишущих на perl + python, вдобавок развлекающихся с++.

Результат то ведь один - веб сайт, написаный на php. Быстро и сердито, то что надо и решений полно, даже писать то ничего и не надо.

Это что касается заказчика! А что касается программиста?
Программист php пройдя определенный этап начинает задумываться, что пора бы писать на другом компьютерном языке. Это как в жизни, чем больше языков знаешь, тем умнее. И когда переквалифицировавшись из php-программера в python-программера с ужасом вспомниаешь как ты писал на этом ужасном php можно и пошутить: "PHP - пишу за еду".

Конструкции php на самом деле скучны и просты и когда поднаторев в типовых задачах приходится писать одно и то же - это быстро надоедает. Хочется свежых решений, свежий конструкций и идей, интересных задач...

Выучить то-же perl на много сложнее, чем php. Но выучив его можно пожинать много больше плодов и не программировать за еду, как в Москве ))).

Що таке база данних?

База данних — це спеціальна система зберігання, організації та пошуку інформації. Вона містить дані у вигляді таблиць, записів та інших стру...