Posts Tagged ‘PHP’

Ускоряем PHP с HipHop

Posted in HipHop, PHP, Performance on February 4th, 2010 by Yaroslav Vorozhko – 1 Comment

Сегодня Facebook анонсировал релиз HipHop.

Коротко, что такое HipHop для PHP:

  • HipHop – это компилятор кода PHP в C++. Т.е. он преобразует PHP код в C++ код для дальнейшей компиляции. Это не другой язык. И это не компилятор времени исполнения (JIT).
  • HipHop будет выпущен Facebook под opensource лицензией, под такой же как и основной код PHP. Facebook возлагает надежды, что разработчики улучшать HipHop и расширят его функциональность, таким образом HipHop сможет заменить больший набор функций PHP.
  • HipHop был одним из проектов в Facebook по улучшению его производительности. Все таки Facebook, второй сайт по объему траффика в интерент и в основном построенный на PHP. HipHop запущен на большинстве LAMP PHP серверах Facebook и в среднем улучшил производительность этих серверов в два раза.
  • HipHop достигает этого, путем исследования вашего PHP приложения и на его основе строить C++ проект. C++ проект потом компилируется и запускается на собственном веб серврере. Это дает возможность исключить PHP Zend engine и Apache из цепочки.
  • Учитывая что, некоторые возможности PHP не поддерживаются. Также, дополнения к PHP написанные на C, должны быть переписаны в HipHop C++ дополнения.
  • Преимущества в скороости HipHop достигаются благодаря статическому анализу, который парсит ваш PHP код ищя пути преобразования динамических частей в статические.
    Учитывая это, ваше улучшение производительности, может сильно варьроваться – более структурированный код получить наибольший прирост в производительности.

Что значит HipHop для вас:

  • Если ваш проект использует sharing хостинг – то ничего.
  • Если ваш проект использует 2 или менее серверов – то ничего.
  • Если у вас нет выделенного development и deployment окружения и у вас нет разработчика знающего C++ – то ничего.
  • Если вы разработчик open source приложения – то немного.
  • Если вы shared хостинг компания – то немного.
  • Если PHP не bottleneck вашего приложения – то пока еще ничего.
  • Если ваше приложения использует много серверов, и в основном на них работает PHP, а также у вас есть все исходники PHP кода, у вас есть немного знаний C/C++, тогджа ответ возможно.
  • Если вы разрабатываете php framework, то ответ иногда.
  • Если у вас есть сильно-связанные части архитектуры, которые удовлетворяют требованиям выше и эти части слабо связаны (через API) с остальной системой, то ответ много что.
  • Если вы обдумываете какой язык выбрать для реализации вашей системы, то ответ очень много.
  • Если вы обдумываете аргумент, переписать весь сайт на другой язык, то вы потеряли свой аргумент.

Есть очень много языковы возможностей, хороших или плохих, которые PHP должен поддерживать, а HipHop нет. Потому как HipHop уникальное решение, он никгода не заменит Zend Engine.

Статья является частичным переводом статьи Terry Chay Faster PHP fo shizzle—HipHop for PHP

Sphinx Search плагин поиска для Wordpress – поиск с Sphinx Search для начинающих

Posted in PHP, Sphinx Search, WPSphinx plugin on December 23rd, 2009 by Yaroslav Vorozhko – 2 Comments

Два года назад Петр Зайцев из Percona попросил меня написать ему плагин поиска для WordPress используя Spinx Search. Сейчас этот модуль работает на mysqlperformanceblog.com.

Данная статья будет полезна тем кто только начинает знакомится с Sphinx Search. Ее можно использовать  как начальное руководство для написания простого поисковика на Sphinx Search.

Возможности плагина:

  • Быстрый поиск, ну это и понятно, мы ведь используем Sphinx Search
  • Возможность использовать расширенный синтаксис поиска (http://www.sphinxsearch.com/doc.html#extended-syntax)
  • Сортировка результатов поиска по дате или по релевантности
  • Поиск по постам, комментариям или страницам. Это отличает этот плагин от стандартного поиска на WP, который не производит поиск по комментариям и страницам. А также многие другие поисковые плагины не имеют такой возможности.
  • Есть возможность исключить из результатов поска комментарии, страницы или посты
  • И многие другие вкусности, про которые вы можете узнать на странице плагина

Все это позволяет нам делать Sphinx Search, и сейчас мы разеберем как это реализовано.

Конфигурационный файл

В первую очередь нам надо знать как устроен индекс. (sphinx.conf можно найти в каталоге rep/sphinx.conf)

Мы использовали самое простое решение это один монолитный индекс для всех данных: постов, страниц и комментариев. Формируется такой индекс единым SQL запросом, который приводить я тут не буду, он очень длинный и нас сейчас он не интересует (это все таки статья про Spihnx Search, а не про MySQL :) ), но посмотреть его можно в том же sphinx.conf.

Единственное, что нам стоит знать это какие атрибуты у нас есть:

  • comment_ID
  • post_ID
  • isPost
  • isComment
  • isPage
  • post_type
  • date_added

Атрибуты isPost, isComment и isPage отвечают за тип источника. date_added содержит дату добавления данных.

Поиск

Теперь рассмотрим как делать поиск, фильтрацию и сортировку используя атрибуты.
Пример:

CODE:
  1. if ( empty($this->params['search_comments']) ){
  2.     $this->config->sphinx->SetFilter('isComment', array(0));
  3. }
  4.                
  5. if ( empty($this->params['search_pages']) ){
  6.     $this->config->sphinx->SetFilter('isPage', array(0));
  7. }
  8.            
  9. if ( empty($this->params['search_posts']) ){
  10.     $this->config->sphinx->SetFilter('isPost', array(0));
  11. }
  12.        
  13.        
  14. if ( $this->params['search_sortby'] == 'date' ){ {
  15.     $this->config->sphinx->SetSortMode(SPH_SORT_ATTR_DESC, 'date_added');}
  16. } else {
  17.     $this->config->sphinx->SetSortMode(SPH_SORT_RELEVANCE);
  18. }
  19.  
  20. $res = $this->config->sphinx->Query ( $this->search_string, $this->config->admin_options['sphinx_index'] ););

Первое, если один из аттрибутов не установлен, то с помощью SetFilter('isPost', array(0)) мы исключаем его из поиска.
Второе, если пользователь захотел отсортировать результаты по дате добавления, то мы испольязем режим сортировки по атрибуту SetSortMode(SPH_SORT_ATTR_DESC, 'date_added'). По умолчанию данные сортируются по релевантности.
И последнее мы выполняем собственно запрос с помощью метода Query(), первый параметр это запрос введенный пользователем, второй это индекс по которому выполнять поиск.

Результат поиска

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

  • Получить найденный идентификационные номера и по ним получить данные
  • Используя атрибуты isPost, isPage и isComment мы узнаем из какой таблицы получать данные
  • Потом объединяем полученный результат
  • И последнее мы выделяем ключевые слова в результата, путем добавления html тэга STRONG вокруг слова.

Выделение ключевых слов делает метод BuildExcerpts

CODE:
  1. $opts = array(
  2.     'limit'  => $this->config->admin_options['excerpt_limit'],
  3.     'around' => $this->config->admin_options['excerpt_around'],
  4.     'chunk_separator' => $this->config->admin_options['excerpt_chunk_separator'],
  5.     'after_match' => $this->config->admin_options['excerpt_after_match'.$isTitle],
  6.     'before_match' => $this->config->admin_options['excerpt_before_match'.$isTitle]
  7. );
  8.                    
  9. $excerpts = $this->config->sphinx->BuildExcerpts(
  10.     $post_content,
  11.         'main_'.$this->config->admin_options['sphinx_index'],
  12.     $this->search_string,
  13.     $opts
  14. );

В параметрах этого метода надо указать строку результата в которой надо выделить слова, индекс, запрос и параметы выделения.  В результате мы получем строку с подсвеченными ключевыми словами, которые пристуствовали в запросе.

В итоге как мы видим, написать свой поиск используя Sphinx Search достаточно просто. Если у вас большой блог и вы также хотите получить быстрый и много-функциональный поиск, тогда скачивайте WPSphinx плагин - это бесплатно. :)

Autoload своих библотек в Zend Framework 1.8+

Posted in Development, PHP, Tips And Tricks, ZendFramework on December 11th, 2009 by Yaroslav Vorozhko – Be the first to comment

Чтоб загружать в Zend Framework свои библиотеки, нам надо сделать следующее:
Первое - это добавить физический путь к библиотеке в include_path.
Второе - это указать префикс классов библиотеки, если такой вообще используется.

Добавить путь в include_path можно двумя способами:
1. Жетско прописать путь в public/index.php файле:

CODE:
  1. set_include_path(implode(PATH_SEPARATOR, array(
  2.     realpath(APPLICATION_PATH . '/../library'),
  3.     realpath(APPLICATION_PATH . '/../mylib'),
  4.     get_include_path(),
  5. )));

2. Прописать путь в конфигруационном файле application/configs/application.ini

CODE:
  1. includePaths.mylib = APPLICATION_PATH "/../mylib"

В обоих случаях мы добавляем путь к mylib в include_path. Второй способ более предпочтительный, так как на основе выбранной конфигурации (production, develeopment, test) можно устанавливать путь к различным версиям mylib.
Кстати используя этот же прием, можно устанавливать путь и к каталогу library/Zend и на основе конфигураций подгружать различный версии Zend Framework.

И так, второе что нам необходимо сделать - это подключить автозагрузчик и установить префикс используемый классами библиотеки.
Я прописал автозагрузчик в файле public/index.php

CODE:
  1. require_once 'Zend/Loader/Autoloader.php';
  2. $loader = Zend_Loader_Autoloader::getInstance();
  3. $loader->registerNamespace('My_');

В данном случае префикс классов в моей библиотеки "My_".

Также, этот же код можно прописать и в классе Bootstrap.php

CODE:
  1. protected function _initAutoload()
  2.     {
  3.         require_once 'Zend/Loader/Autoloader.php';
  4.         $loader = Zend_Loader_Autoloader::getInstance();
  5.         $loader->registerNamespace('My');
  6.     }

Все, теперь ZF знает как загружать классы из вашей бибилиотеки.

Ответы на вопросы в интервью по веб разработке

Posted in Development, Self Development, Tips And Tricks on August 25th, 2009 by Yaroslav Vorozhko – 3 Comments

Антон Шевчук написал хороший список вопросов для интервью по приему на работу веб разработчиков. Я хочу предложить вам краткие комментарии и советы по каждому из вопросов, надеюсь это поможет вам лучше ориентироваться в мире веб разработки и поможет пройти интервью.

- С какими PHP библиотеками, фреймворками знакомы?
Соискатель должен знать о существовании таких фреймворков как Zend Framework, CakePHP, CodeIgniter или Symfony, и желательно иметь опыт работы с одним из них (список можно расширить – это не так принципиально).

За 4 с лишним лет работы PHP разработчиком я познакомился с тремя из перечисленных фреймворков, и активно использую Zend Framework.
Знание различных фреймворков дает вам понимание и идеи как писать код. Этим путем обязан пройти каждый разработчик. Изучайте и участвуйте в развитии Open Source проектов - это даст вам большой опыт, по сравнении с тем, который вы способны сами получить в аналитическом мышлении. Отвечая на этот вопрос будет уместно рассказать о своих способностях к проектированию и архитектурному мышлению.

- С какими API приходилось работать?
Интересуют Google API, AMF PHP, различные payment gateway, Facebook API, Twitter API и т.д.

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

- Есть ли опыт работы с различными CMS?
Опыт работы не как web-мастера, а как программиста…

Думаю компания использует некоторые CMS в своих проектах. Расскажите подробно про ту CMS с которой вы знакомы или пусть даже про свою само-писанную с которой довелось работать.

- Работал с PHP 4? Назови различия с 5-ой версией.
- Что нового в PHP 5.3?
- Типы данных в PHP?
Этот вопрос на добивание, он часто ставит в тупик, если человек отвечает что их восемь, а потом начинает их перечислять, значит он готовился к собеседованию :)

Все ответы есть в PHP мануале, просто RTFM.

- Что такое сериализация?
- Что самое сложное разрабатывали на PHP?
Этот вопрос может расставить все точки над “i”, но не стоит его задавать в самом начале – это пугает…

Второй вопрос очень хорош, и может быть даже решающим. Я бы рассказал здесь про проектирование, архитектуру и применение OOP в своем последнем проекте или в своем самом интересном проекте. Также, добавил бы про высокую оптимизацию приложения и работу с большими массивами данных. А, если вы работали с какими то «экзотическими», но мега-полезными библиотеками, такими как Sphinx Search, Lucene или может с чем то уникальным в вашей компании, то об этом также стоит рассказать.

- Какие шаблоны проектирования знаешь? Расскажи в чем соль каждого?
- Что есть MVC? Какую роль выполняет каждый из составляющих элементов?

Шаблоны проектирования или design patterns являються не чем иным, как распространенными методами решения типичных задач. Кто внимательно читал книгу «Банды четырех» или «Архитектура корпоративных программных приложений» Фаулера, тот ответит на этот вопрос даже с неким удовольствием.

- С какими web-серверами работал? Apache? Nginx? IIS?
- Можешь описать как можно подробнее, что происходит между тем, как пользователь ввёл в адресной строке http://google.com и тем, как браузер показал страницу?
– Системы контроля версий? SVN? CVS? Git? Что есть branch/trunk/tags?
– Багтрекинг системы?

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

Немного мучаю по БД:
- С какими БД работал? Что такое транзакции, хранимые процедуры, тригеры?
- Коль работал с MySQL то сможешь назвать различия между версиями 4.1, 5.0, 5.1?
- Каковы различия между MyISAM и InnoDB?

Все это есть в мануале MySQL, и как минимум теоретически знания по дополнительным возможностям MySQL у разработчика должны быть.
Типов storage engine не так уже и много и знать про характеристики основных двух надо обязательно.
Если вы имеете более 3 лет опыта работы в веб разработке на php, python, perl, то скорее всего вы начинали с mysql 3.23 и по мере эволюции MySQL представляете различия и возможности новых версий. Поэтому этот вопрос не должен вас сбить с ног.

И для полноты знаний web-разработчика естественно не хватает вопросов о HTML, CSS, Javascript:
- Ваша субъективная оценка своих знаний по CSS по пятибальной шкале?
- Приходилось ли верстать сайт?
- Почему CSS это каскадные таблицы стилей?
- Что здесь написано? Напишите HTML код к которому будет применен данный стиль.

PHP:
  1. #my p.sel:first-line, .main li li a:hover + span
  2. {
  3. color:#f00; /* Что это за цвет? */
  4. }

Уметь читать, понимать и писать CSS это разные вещи. Если вы обладаете первыми двумя навыками, этого достаточно, умеет верстать отлично.

- Ваша субъективная оценка своих знаний по Javascript’у?
- Что самое сложное разрабатывали с использованием Javascript’a?
- С какими Javascript фреймворками работали? Какие плагины использовали? Писали ли плагины, виджеты?
Интересуют jQuery/UI, Prototype/Aculo, MooTools/MochaUI, Dojo Toolkit, ExtJs.
- Каким образом можно реализовать наследование в Javascripte?
- Что такое AJAX и как он работает?
- Что такое JSON? С JSONP сталкивались?

Знания по Javascript важнее знаний CSS, но они взаимосвязаны и поэтому зная одно и не зная другого, вы не сможете делать полноценные скрипты. Javascript фреймворки просто облегчают вашу жизнь, попробуйте выучить основы хотя бы одного и вам будет уже намного проще с Javscript.

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

Список книг обязательных к прочтению, которые помогут вам в веб разработке:

PHP без PHP

Posted in Development, PHP on August 15th, 2009 by Yaroslav Vorozhko – Be the first to comment

Tarry Chay написал интересный пост для PHP Advent, в котором он делиться мыслями про:

  • Умное кеширование или ErrorDocument trick, реализованное на php.net
  • Архитектурные принципы PHP
  • Паттерны проектирования
  • Парадигмы
  • Приводит очень поучительные примеры проектов из жизни, в стиле Стива Макконнелла и Мартина Флауэра
  • А также говорит о том, что Стив Макконнелл в своей книге Code Complete, ошибался насчет парадигмы конструирования

Список полезных классов и библиотек для PHP разработчиков

Posted in Development, PHP, Tips And Tricks on August 12th, 2009 by Yaroslav Vorozhko – Be the first to comment

Saud Khan из w3avenue собрал хороший список полезных библиотек и классов для PHP разработчиков.

Особенно полезным список будет для начинающих.

Хотя возможно найдутся некоторые guru PHP, которые не слышали об одной или нескольких перечисленных библиотеках.

Список включает в себя следующие разделы:

  • Базы данных
  • Разработка
  • Документация
  • Email
  • Формы
  • HTML/CSS
  • Image/Media/File
  • Javascript/Ajax
  • Microformats
  • RSS & Atom Feeds
  • Безопасность
  • Тестирование и отладка
  • Веб сервисы

В общем хорошая подборка практически на все нужды разработки.

Не поленитесь изучить! ;-)

Мифы PHP оптимизации

Posted in PHP, Performance on August 11th, 2009 by Yaroslav Vorozhko – Be the first to comment

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

а. echo быстрее чем print
Echo может быть быстрее, так как оно не возвращает значение. Но, в моем бенчмарке преимущество было очень мало. А, в некоторых ситуациях print будет быстрее echo, например когда ob_start включен.

б. меньше комментариев ускоряет код
Если вы используете кеширование opcodes, то комментарии уже игнорируются. Этот миф идет от PHP3, когда каждая строка PHP интерпретировалась во время исполнения.

в. 'var='.$var быстрее чем, "var=$var"
Так было до версии 4.2 и было исправлено в версии 4.3.

Ускоряет ли код использование ссылок?
Ссылки не дают преимущества строковым, целым и другим базовым типам данных.
Например:

PHP:
  1. function TestRef(&$a)
  2. {
  3. $b = $a;
  4. $c = $a;
  5. }
  6. $one = 1;
  7.  
  8. ProcessArrayRef($one);

И тот же самый код без ссылки.

PHP:
  1. function TestNoRef($a)
  2. {
  3. $b = $a;
  4. $c = $a;
  5. }
  6. $one = 1;
  7.  
  8. ProcessArrayNoRef($one);

PHP не создает дубликат переменной "отправленной по значению", вместо этого он использует внутренних высокоскоростной подсчет ссылок. Поэтому в TestRef(), $b и $c будут дольше устанавливаться, так как надо вести "трэкинг" ссылок, в то время как в TestNoRef(), $b и $c сразу будут ссылаться на исходное значение $a, а значение счетчика ссылок будет инкрементировано.
В сравнении, функции которые принимают массивы и объекты, работают быстрее тех, которых принимают ссылки. Потому что, массивы и объекты не используют подсчет ссылок, а используется оригинальное значение переданное в параметре.
Например:

PHP:
  1. function ObjRef(&$o)
  2. {
  3. $a =$o->name;
  4. }

медленнее чем:

PHP:
  1. function ObjRef($o)
  2. {
  3. $a = $o->name;
  4. }

Примечание: в PHP5 все объекты передаются по ссылке, и нет необходимости устанавливать знак '&' в списке параметров. Производительность работы с объектами в PHP5 значительно выше, чем в php4.