CentOS 5 NetInstall HTTP hint

I’m always searching for next two string when I’m doing a NetInstall of CentOS using HTTP as media: “Website Name” and “CentOS Directory”.

As example, to install CentOS 5.6 from mirror.centos.org for 32 bit platform:
Website Name: mirror.centos.org
CentOS Directory: centos/5.6/os/i386

For 64 bit platform:
Website Name: mirror.centos.org
CentOS Directory: centos/5.6/os/x86_64

For my current location and 64 bit platform best chose would be:
Website Name: mirror.duomenucentras.lt
CentOS Directory: centos/5.6/os/x86_64

Yep, it’s easy to remember or to find on the Internet, but I’ll keep them here just for me. I’m sure I’ll forgot this two when I’ll be doing next install someday.

Awaiting for the HipHop for PHP

Facebook Developers created a great hype in PHP World around their new Open Source project called HipHop for PHP only with one blog post: HipHop for PHP: Move Fast. I’m waiting for HipHop for PHP to become public available to try this great feature on few projects I work on.

Facebook Developers where very kind to mention some Open Source competitors that already publicly available for try and use. Two of them I’m interested in are: Roadsend and phc.

While waiting for the HipHop for PHP I decided to see how and what Roadsend and phc can do, what limitations they have and what features they provide. It wasn’t full-scale tests, just some quick tests.

Neither Roadsend nor phc were found in Ubuntu software repository, so I compiled them from the source. I was surprised by clear installation instructions provided by both PHP compilers. There was no trouble to compile and install Roadsend and phc, except dependencies that were easily compiled to (I just hate dependencies). Well, I should mention that phc requires much more time to compile event without counting PHP compilation time comparing to Roadsend.

First “Hello World!” PHP script was compiled without any trouble. Script that gathers 100 records from MySQL database compiled well also. I haven’t tried anything complicated yet, but I don’t need it for now. I want just to see what and how they do.

Roadsend

It is a stand alone implementation of PHP that converts PHP code to executable, FastCGI application or stand alone server.

What I liked in Roadsend is that you can choose what to compile: FastCGI application or Stand Alone applications (using MicroServer, but I haven’t tried this) or executable. I like FastCGI – it is patible with many httpd servers including my favorite NGINX. FastCGI script, fetching 100 rows from MySQL database worked with a charm on NGINX.

One more thing I liked in Roadsend – you can compile your code to libraries and reuse that compiled libraries in next your applications. Just don’t forgot that it will work only with Roadsend implementation of PHP.

Another benefit of Roadsend is that they provide ready to use (with Quick and Dirty Guide) scripts to create .deb and .rpm packages and a way to compile it on Windows. Such way would make deployment much easier.

What I don’t liked in Roadsend that it is a stand alone implementation of PHP and you are limited to extensions and features that Roadsend provide. Moreover, they provide only few popular extensions. I think somewhere there are instructions how to port/embed/bind other PHP extensions to Roadsend, but I haven’t found them.

Another disturbing thing is that you can’t control number of FastCGI processes like you do in PHP-FPM or with standard PHP in FastCGI. Nothing is mentioned in manual about that.

If you are limited to PHP Standard Library, MySQL or SQLite, PCRE, XML, CURL – Roadsend may be very useful for you.

phc

phc is a PHP compiler that converts PHP code to executable or PHP extension.

I like the idea of Web application as PHP extension but the main issue in my point of view that compiled PHP extension is called by __MAIN__() function. So, without small hacking of extension C code you can’t have two Web applications as PHP extensions on same server. If they would change function name from __MAIN__() to something more usable like phc_extansionname() – it would be easier.

Another thing I liked in phc is that they use embedded PHP for compilation. So it should be compatible with all PHP extensions.

I like the way they do it in phc: PHP code converted to C code that uses native internal PHP functions and types.

What I missed is the way to create a PHP extension from any function library written in PHP. I think it would be a great benefit for that compiler.

If you like the idea to have your entire website as PHP extension – you should try this solution.

Other solutions

Oh, there are two more solutions: JAVA based Quercus and .NET Phalanger, but I haven’t tried them yet.

After reviewing and trying Roadsend and phc (I’ve read information about Quercus earlier) now, at least, I know what and how do compilation competitors of HipHop for PHP.

But what Facebook will bring to public after two years of development? Which features? Which limitations? Will HipHop for PHP require many changes of existing projects that I work on?

Install SRC.RPM on RHEL4 if no rpmbuild present

Last Friday I had a new challenge in my life as a system administrator. The challenge was to install Munin-node on Red Hat Enterprise Linux 4 Nahant 4. I thought it was easy, until I noticed that it were few x86_64 architecture servers with minimal install, so I had small troubles with SRC.RPMs.

As you may notice from Munin installation instructions there are some dependencies and those dependencies have some more dependencies… and so on… One of them that I had trouble with was sysstat. Dag’s repository that I used for Munin RPM doesn’t have sysstat RPM package at all and in RPM Find you will find only SRC.RPM package for x86_64 (actually sysstat-5.0.5-16.rhel4.src.rpm).

Of course, it would be easy to download and build that SRC.RPM package if rpmbuild would be installed on one of those servers, but it was minimal install and there was no rpmbuild utility. I couldn’t find any proper RHEL4 repository on-line. The only solution I’ve found on-line was to use CentOS 4 RPM. As far as I know from my contacts and RHEL conference – CentOS 4 is compatible with RHEL 4.

So I used the nearest CentOS 4 RPMS mirror (for example <ftp://ftp.pbone.net/mirror/ftp.centos.org/4.8/os/x86_64/CentOS/RPMS/>) and downloaded next RPMs rpm-4.3.3-32_nonptl.x86_64.rpm, rpm-build-4.3.3-32_nonptl.x86_64.rpm, rpm-libs-4.3.3-32_nonptl.x86_64.rpm, rpm-python-4.3.3-32_nonptl.x86_64.rpm (and any dependency they will require) and installed them:

  1. rpm -Uvh rpm-python-4.3.3-32_nonptl.x86_64.rpm rpm-4.3.3-32_nonptl.x86_64.rpm rpm-libs-4.3.3-32_nonptl.x86_64.rpm
  2. rpm -Uvh rpm-build-4.3.3-32_nonptl.x86_64.rpm

Now I can build required SRC.RPM packages.

In order to install SRC.RPM package I use command rpm -ivh, in my case: rpm -ivh sysstat-5.0.5-16.rhel4.src.rpm. Source package will be placed in /usr/src/redhat/SRPMS directory and spec file (that we need for rpmbuild) in /usr/src/redhat/SPECS
Now we need to run rpmbuild -ba with proper path spec file, in my case rpmbuild -ab /usr/src/redhat/SPECS/sysstat.spec.
If everything is OK, at the end you will find RPM package in /usr/src/redhat/RPMS.

Now you can install you package with command rpm -Uvh and I can install my sysstat RPM: rpm -Uvh /usr/src/redhat/RPMS/x86_64/sysstat-5.0.5-16.rhel4.x86_64.rpm

I was lucky – all servers that required Munin-node was x86_64 and created RPM package were compatible with all servers and I didn’t have to repeat all operation with SRC.RPM all over again. I just had to upload it to the server and run rpm -Uvh sysstat-5.0.5-16.rhel4.x86_64.rpm.

PHP Conf 2009 Kaunas

Да, да я пишу о PHP Conf 2009 Kaunas, который произошёл 2 месяца назад, ещё 21 апреля 2009 года. Как-то туго у меня со свободным временем и всё что осталось свободным от работы ты тратишь на семью и отдых.

О том, что организуется PHP конференция я узнал один из первых, так как меня пригласили туда организаторы и не пассивным слушателем. К сожаления конференция проходила в рабочий день, что было немного не удобно с моим напряжённым графиком. Но свободный день на работе мне дали очень легко — поэтому я согласился в ней участвовать.

Организаторы были в этом году теже, что и в прошлом: InfoShow и «Net Frequency». Всё происходило в центре дистанционного обучения Каунасского технологического университета.

Тема у меня благодатная: «PHP+MySQL проекты с огромной посещаемостью», информация по ней много в сети, и я сделал просто выборку по теме и подкрепил её своими жизненными примерами. Презентацию я сделал на ура за несколько часов в одно из воскресений после прогулок по магазинам с супругой. Потом потратил пару часов на доработку.

Поездка в Каунас прошла очень гладко — 100 км на автобусе проехать очень просто и не долго по автостраде. Музыка в плеере, 3G интернет в мобильном, пара звонков, включая организаторов: попросили выслать им презентацию заранее, что-бы перенесли её в нужный компьютер — переслал её прямо в пути через Gmail клиент в Nokia. Тут всё прошло без проблем.

Сама конференция в этом году прошла очень и очень интересно и я бы сказал на довольно высоком уровне.

Во первых, все докладчики подобрали очень интересные темы:
Rytis Lukoševičius — «Как стать лучшим программистом»
Очень понравилась идея «имени-бренда», очень правильные идеи относительно того что работа должна нравиться. Это не новость, но тема в наши дни я думаю очень актуальная для многих, особенно начинающих PHP программистов.

Rimantas Liubertas — «Дистрибутивные системы контроля версий: git, mercurial, bazaar»
Актуальная тема для многих — такие системы как git или bazaar становятся всё популярней и востребованней среди разработчиков. Беглое ознакомление с ними многим может помочь в дальнейшем при их изучении, да и за всеми новостями не всегда успееш.

Paulius Jačionis — «Как справиться с огромными потоками пользователей»
Человек представил именно свою визию (точнее команды, которая работает над проектом http://www.uzdarbis.lt/), как бороться с нагрузкой, которая образуется при больших потоках пользователей имея маленький парк машин. Очень рад, что я не один здесь и решения которые принимаю я совпадают с теми, что принимают они.

Edvinas Tamošiūnas — «Как новичку влиться в команду, быстро и эффективно»
Это была довольная весёлая презентация с серьёзными и не очень советами. Кто первый раз попадал в такую ситуацию — то они полезны, кто не раз менял работу — то наверняка уже имеет свою тактику.

Giedrius Kriščiukaitis — «За качество и эффективность»
Не ожидал такой открытой презентации о том, что происходит внутри отдельно взятой компании, методах и технологиях. Местами казалось, что работать в «Net Frequency» для меня было-бы вызовом.

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

Понравилось замечания в адрес моей презентации от Giedrius Kriščiukaitis, что в ней не упомянуто ни одного способа как проверить максимальную нагрузку на разрабатываемом проекте, ни показаны числа. К сожаления у меня нет этих чисел и способов проверить — я работаю с проектом, который уже до меня разместили на нескольких серверах с распределением нагрузки и провести тесты на живом проекте не представляется возможным — ни сайт есть желание положить, ни канал с такой пропускной мощностью, так что многое делается «по приборам» и внутреннему чутью команды. Я покупать копию по «желеу» для этих нужд никто не будет.

Что не понравилось, так то, что Tomas Liubinas и Vladas Diržys не представили свои темы: «OXID eShop Community Edition» и «Не изобретай велосипед, используй framework. Плюсы Zend Framework». Я очень ждал этих презентаций.

На after-party я не пошёл, так как предстояла дорога домой, дома ждала любящая супруга и вкусный ужин. Да и не любитель я пить пиво вечером в другом городе, если потом ехать куда-то надо.

Темп жизни и работы

Жизнь приняла какой-то дикий темп. Вроде все говорят кризис, работы нет… а у меня её меньше не стало. Стало больше бессоных ночей, поездок, встреч, звонков, задач, обсиждений. Голова пухнет.

Из знаменательных событий за последние пару месяцев:

  • в апреле слетал с коллегами на Ad:Tech в Париж – очень понравилось
  • принял участие в PHP::Conf 2009 в Литве, которая проходила в Каунасе – в этом году была очень сильная конференция
  • если верить паспорту, то отпраздновал 28 лет – особо рад небыл, если только подаркам
  • oсвоил Facebook
  • Обзавёлся Twitter’ом @zaza_lt
  • Отказался от участия в конференции блогеров Литвы Login 2009 – очень уж скучно всё начиналось в их описании
  • С третьей попытки осисли GIT для личных целей
  • Совсем не могу жить без Ubuntu – забыл все проблемы, которые мучали на других OS

А так – рутина и работа…

А иногда задумываютсь:

  • о смене дизайна блога
  • об обновлении движка блога и удалении каких-то старых страниц
  • о том, что не плохо было-бы перейти на английский язык
  • о завершении подотовки к ZSE и получении сертификата
  • найти время и пересмотреть Zend Framework 1.8.x да и некоторую информацию обновить

NGINX, PHP-FPM и загрузка файлов по HTTP

Наверно недели 3 сидел у меня в голове вопрос на тему NGINX + PHP-FPM (FastCGI) и как они будут работать с загрузкой файла по HTTP, если PHP-FPM процесс крутиться на другом сервере.

Сегодня наконец выпала возможность в конце рабочего дня собрать на 2 раздельных серверах такую конфигурацию, когда NGINX находиться на одном сервере, а процессы PHP-FPM на другом и NGINX весь .php прогоняет именно через те процессы, что крутятся удалённо.

Весь этот эксперимент проходил на Ubuntu Server 8.10, так что проблем с установкой или сборкой PHP или NGINX у меня не возникло. Единственное, что я сделал не верно и что меня затормозило на пол часа, так это конфигурация NGINX — я упустил строку, в которой PHP файлы указывалось искать не в Document Root, а в /scripts.

Собрать из HTML форму для загрузки файла не составляет труда, добросить за несколько минут туда PHP код, который сделает var_dump($_FILES); и отдаст содержимое загружаемого файла тоже не сложно.

Прицепить маленький текстовый файл и нажать на «Submit» ещё проще. И что же видно в результате? Всё работает идеально. Файл загружен при помощи POST на сервер с NGINX, а там передан к PHP-FPM и уже PHP-обработчик с ним работает как ему/вам угодно — что меня очень радует. Всё работает «out of the box» и никаких особых шаманских танцев не нужно.

Что огорчает, так что PHP-FPM до сих пор не входит ни в стандартную поставку PHP ни в какие-либо пакеты в стандартных дистрибутивах Linux — таскать за собой какие-либо Perl или Lighttpd spawn-скрипты не хочется, плюс те возможности, которые представляет PHP-FPM делает его очень вкусным.

Ещё огорчает, что PHP-FPM это patch к PHP и после его установки установить какой-либо модуль из PECL становиться намного сложнее если вы его хотите скомпилировать со static – приходиться использовать phpize.

Но вообще, эксперимент считаю удавшимся — сборка системы с NGINX + PHP-FPM не представляет сложности и я давно хотел испытать такую конфигурацию хотя-бы в парниковых условиях.

Zend_View и encoding

Смотрю я теперь на исходный код Zend_Controller_Front , Zend_Controller_Action, Zend_View, а также на Zend_View_Abstract у Zend Framework версии 1.7.3, чтоб понять, как в них обстоят дела с encoding.

Продолжая тему MySQL + PHP: charset и collation и правильные мысли и изучение векторов, которые подкинул Алексей Захлестин, я наткнулся на замечательный private член класса Zend_View_Abstract под названием $_encoding, со значением ISO-8859-1. Так-же в этом классе я нашёл как в Zend_View_Abstract устроен метод escape. Этот $_encoding на него влияет, так как в методе escape он является третьим параметром к функциям htmlspecialchars или htmlentities (какую из них использовать вы тоже можете настроить).

Вот смотрю я на их исходный код и понять не могу, как нормальным и безболезненным способом в объект Zend_View передать мне нужный encoding? Везде в уроках по Zend Framework можно увидеть, как во всех View используют строку <meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″ /> или соответствующую строку из helpers API у Zend_View, но я нигде не замечал как сменить внутреннюю настройку. Ну, кроме наисложнейших манипуляций со всей иерархией bootsrap, ведь есть замечательный helper Zend_View_Helper_Doctype.

Ведь, если бы была единая настройка encoding для всех компонентов Zend Framework, как бы было удобно и не возникала таких проблем, как были у нас. Разработчикам не нужно было-бы думать о том, в каком encoding у них клиент для работы с базой данных, в каком encoding у них страницы, в каком encoding у них остальные используемые компоненты Zend Framework — обо всём позаботились бы в одном месте и сразу.

Может я чего упустил — ткните в соответствующий урок или страницу мануала.

MySQL + PHP: charset и collation

Работаю я над одним проектом, где в день проноситься до миллиона уникальных посетителей в день. Для этого проекта я с командой работаю над маленьким сателлитом, назначения которого не имеет столь весомого значения, сколько имеет значение проблема, с которой я сегодня столкнулся. И нам крупно повезло, что кол-во данных сейчас на сателлите мизерное и он пока находиться в стадии тестирования и нагрузка на нём растёт постепенно.

Проект пишется на PHP 5.2.x + MySQL 5.0 Так как проект международный, база сателлита находиться в collation utf8_unicode_ci.

У сателлита есть 2 части: так называемая клиентская и административная. Клиентская доступна всем и дёргается постоянно, административная только администраторам, ею пользуются раз в неделю примерно пока.

Клиентская часть, из-за ожидаемой нагрузки, писалась полностью мною, без использования каких-либо фреймворков, каркасов и прочего. Благо её простейшие функции позволяли это сделать быстро. Естественно, в качестве MySQL клиента был выбран mysqli, всё как надо, сразу после соединения был выставлен нужный charset, строго как в мануале:

$conn->set_charset("utf8")

Сам mysqli был выбран потому-что проект новый и у него вроде-как получше с поддержкой UTF-8 всё устроено.

Административная часть писалась коллегой, на пару со мной, причём ответственность за качество кода лежит на мне. Для большей скорости написания мы использовали Zend Framework, который мы оба довольно не плохо освоили к этому моменту. К тому-же, административная часть имела куда больше функций и меньше нагрузки, нежели клиентская. Единственное разногласие, которое у нас было с коллегой, это использовать или нет Zend_Form или нет из-за очень сложной кастомизации самих форм и их декораторов, неразумного использования комбинации <dd> и &ltdt> вокруг скрытых полей и прочих мелких религиозных и языковых разногласий. Ни одному из нас не возник простейший вопрос, как устроен другой компонент — Zend_Db. Определит ли он сам charset и collation, который мы используем и нам нужен или будет использовать тот, что установлен по умолчанию. И вот, сегодня мы поняли что мы выстрелили себе в ногу примерно две недели назад — не то пуля летело медленно и наконец долетела, не то порох сырой ныл и сработал только сейчас.

Я всегда думал, что умный Zend_Db как-то сам узнает какой нужно charset и collation использовать, раз он сам узнаёт какие поля у таблицы и какие значения туда можно писать, а какие нет. Оказалось что нет… Я был не прав и ему об этом нужно грубо говорить (ну или клиенту вдолбить в настройки по умолчанию).

Поэтому в самом начале ему пришлось прописать следующие строку сразу после инициализации:

$db->query('SET CHARACTER SET utf8');

Теоретически, если следовать документации Configuring the Character Set and Collation for Applications, хватило-бы только SET NAMES ‘utf8’, но в таком случае collation остался бы utf8_general_ci — а нам этого не хочется. Поэтому, копнув немного глубже, в Connection Character Sets and Collations, было найдено SET CHARACTER SET utf8.

После данных изменений со стороны административной части на Zend Framework, замены $conn->set_charset(“utf8”); тоже на $conn->query(‘SET CHARACTER SET utf8’); и правок в базе данных всё заработало прекраснейшим образом.

Я вот понять не могу, почему у Zend Framework нигде об этой проблеме не написано? Зачем у mysqli есть метод mysqli::set_charset, если он меняет collation на верный? Почему в PHP мануале написано не использовать «старый дедовский способ с SET NAMES»?

Вообще, если посмотреть на то, что я встречаю в других проектах, которые попадают к нам на поддержку или консультации, много кто зарывается на этих charset и collation к сожалению, особенно на мультиязычных проектах.