Archive for the ‘php’ Category

Установка Xdebug поверх MAMP на Mac OS X

Апрель 11, 2009

Как-то я некоторое время обходился без дебагера, видимо, мало работал =) Но время пришло и пришлось искать в сети руководства по установке, потому что я был (и остаюсь) ленив и использую MAMP забыв радости ./confugure&&make&&make install.
Все оказалось до банального просто. Существует такая IDE Komodo, которая есть на всех платформах и на всех платформах предоставляет возможность использования Xdebug. А для этого у них есть прекомпиленные версии Xdebug для всех ОС и они их безвозмездно раздают. Вот такие чудесные люди, спасибо им. Идем и забираем. Они заботливо компилят дле всех активных веток PHP, так что каждый найдет то, что ему нужно.
Дальше все слишком просто, местами скучно =)
Копируем xdebug.so в MAMPовскую директорию с extensions (/MAMP/bin/php5/lib/php/extensions/no-debug-non-zts-20050922/)
Добавляем в php.ini (/MAMP/conf/php5/php.ini) строчки


[xdebug]
zend_extension=\
/MAMP/bin/php5/lib/php/extensions/no-debug-non-zts-20050922/xdebug.so

И все остальное, что вы хотите попросить его делать, например немного попрофайлить код. Вот здесь я словил просветление. Я всегда использовал KCacheGrind и считал, что он единственные и неповторимый. К счастью, я ошибался, клиент для мака есть и он даже иногда развивается. Он, конечно, не такой клеви, как K, но зато нативен и не принуждает к сексу с портами. KISS.

Zend Certified Engineer — HowTo

Ноябрь 24, 2008

Давно я собирался сертифицироваться, еще когда была сертификация по PHP4, с тех пор прошло 2 года и вот наконец-то я получил заслуженный 😉 статус.

Для чего это нужно, каждый решает сам для себя, но хочу отметить активность, которая наблюдается в последнее время в русском сегменте PHP Yellow Pages. За сентябрь-октябрь-ноябрь количество сдавших экзамен увеличилось до 36. Я был 31, а думал быть 23 =) Выводы делайте сами, но мне кажется, что народ вкладывает деньги в себя, чтобы попроще пережить кризис. И надо сказать, штука это полезная, учитывая то количество хороших резюме, которые я наблюдаю на рынке.

Информации по этой теме в рускоязычном сегменте не так уж много и в большинстве своем она устаревшая, да и вообще информации не так, чтобы очень =) Восполним этот досадный пробел, надеюсь, кому-то это поможет.

Подготовка

Если вы ответили себе на вопрос «зачем», самое время ответить теперь на вопрос «как». Для начала стоит отправиться на сайт Zend и приобрести там ваучер на сдачу экзамена. Это сэкономит вам немного денег, т.к. сертификационные центры продают экзамен чуть дороже. Ваучер обойдется вам в $125 и действует он год с момента покупки.

Теперь у вас есть год, чтобы как следует подготовиться к экзамену 😉 Если вы «зубр» и сами всех засертифицируете до смерти, то читайте только про сам процесс сдачи, а мы пока поговорим про подготовку. Для начала стоит обзавестись почти официальным учебником, любители «вареза» отправляются в гугл, но надо сказать, что в продаже сейчас 2-ое дополненное, улучшенное издание, которое на торрентах еще не засветилось =) Зато с торрентов можно слить предыдущий Study Guide, посвященный PHP4. Надо сказать, что он намного полнее освещает многие моменты и рекомендуется к прочтению пару раз.

Помимо чтения этих двух учебников, стоит еще регулярно пописывать код, который в них содержится и иногда спорить с авторами. Еще очень помогает держать под рукой официальны мануал, в котором «все» темы освещены хорошо =)

Еще можно помучать гугл. Гугл может поделиться ссылкой на блог китайского программиста, где тот описывает свой опыт сдачи экзамена, и расшаривает неплохую книгу с официального курса по сертификации. Хотя это уже варез, но он такой…полезный. В конце концов отдавать за этот курс $1000 как-то грустно, учитывая, что нового там говорят не так, чтобы много.

После того, как вы перед сном можете быстро проговорить все функции работы со строками, а утром легко вспоминаете десяток параметров из php.ini, можно начинать готовится к самому тестированию =) Здесь есть 2 пути. Можно откопать из неисчерпаемых торрентов The Zend PHP Certification Practice Test Book,который по PHP4, но есть способ лучше. Лучше всего приобрести набор «тестовых тестов», которые проходят в том же режиме, что и настоящий экзамен. 70 вопросов на 90 минут. Но, в отличие от экзамена, где выдают «passed/failed», здесь результат разбит на 12 предметных тем, за каждую из которых показана отметка по 3х-бальной шкале. Сами зендовцы говорят, что они тщательно скрывают систему оценки, чтобы никто не зубрил какую-нибудь одну тему, желая выехать только на ней. А так приходится учить все =)

В стремлении сэкономить и предаваясь паранойе, я купил сразу 10 тестов. Однако, ребята немного халтурят, и после 5-ти раз проходить эти тесты уже не интересно. Вопросы элементарно повторяются. А я серьезно подошел к прохождению тестов, каждый сеанс я записывал с помощью CamStudio, потом парсил вопросы и искал на них ответы. Таким образом сокращая количество белых пятен в своих знаниях. Так вот в пятом тесте новых вопросов было всего 20. Отложил ссылочку на будущее, может кому пригодится и пошел шедулить экзамен.

Сдаем экзамен

Для того, чтобы сдавать экзамен, надо отправляться на сайт VUE, подбирать себе тестовый центр и звонить им. Потому что, например в Инвенте, где я сдавал этот экзамен сдают в Пн и Чт. После предварительной договоренности, шедулим экзамен на сайте и начинаем грызть ногти =) Есть, кстати, один нюанс. Экзамен можно отменить за один «бизнес-день» до сдачи. Т.е. если сдаете в Пн, то отменять можно лишь в Пт. Так что если вы склонны к алко-туризму, то стоит назначать на какой-нибудь другой день 😉

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

Интерфейс экзамена заметно более убогий (аскетичный), чем в тестовых тестах, зато можно мышкой вообще не пользоваться =) Времени дается с избытком, если хорошо готовится, я уложился в 75 минут со всеми проверками-перепроверками, и когда понял, что начинаю феерично меня ответы на рандомные, нажал кнопку «финиш». Дальше было 3 секунды, за которые я вспомнил весь пых сразу и одновременно и, заметив слово «конгратьюлэйшнс», понял, что эксперимент удался. Дальше нам дают распечатку о том, что мы молодцы и можно идти в кафе праздновать.

Плюшке?

Диплом обещают прислать как-нибудь, я пока не дождался, хотя прошел месяц (дефолтСити, если кто не понял еще). Зато можно бомбардировать certification@zend.com с требованиями разместить вас в PHP YellowPages, можно вступить в группу в линкедИне (просто так =), можно повесить у себя везде красивую картинку и отправиться дописывать профили в разных соцСетях =) Каждому свое.

Если есть вопросы — пишите в комменты, отвечу.

ПКМГ. rsync по ssh для обновления сайта.

Сентябрь 14, 2008

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

CIS — continuous integration server

Начинать придется с этой малопонятной штуки. Насколько я понял из русской и английской (лучше) Wiki эту штуку придумали незабвенные Фаулер с Беком. Где-то на рубеже веков. Придумали для всеяЫнтерпрайзЖавы, но идея ожила и распространилась дальше. Даже книга на русском есть.

Честно скажу, этой штукой я займусь не скоро, но уж больно интересна идея. Хорошие обсуждения можно найти на форуме по гибким методологиям, где идут очень интересные обсуждения, заставившие меня почувтсовать, что я работаю в детском саду, а не в девелоперской конторе 😉

Но для начала я вытащил из всей этой идеи Phing. Те, кто работал с всеяЫнтерпрайзЖабой, знают, что есть такая штука, как Ant. Это такой трудолюбивый муравей, которого создали люди, считающие, что xml намного понятнее, чем файлы make. В двух словах, он нужен для того, чтобы билдить из исходного кода то, что можно потом задеплоить. Вы ещё здесь? =)

Так вот меня этот Phing здорово зацепил, ибо я всегда любил всё автоматизировать. Ведь однажды обученный компьютер ошибается гораздо реже, чем человек. Надо просто объяснить ему что делать =) В принципе, у нас в пыхоРазработке не сильно много проблем, не то что в ынтырпрайзЖабе. Но тоже хватает. И среды dev/prd отличаются, и изменения в DB надо учитывать, короче, есть где развернуться автоматизатору. Можно держать все изменения в голове и обновлять только нужные файлики, а базы обновлять одновременно. Можно вообще на prd разрабатывать =) Но не зря же мы svn используем и вообще пытаемся отмыться от приставки «быдло» в слове кодинг =)

Временным решением пробдем с конфигами и прочими паролями к БД может быть привязка к рабочей директории. Об этом хорошо писал Кузьма Феськов в последнем PHPInside. Где-то год назад. Костыль, но всё ж лучше, чем каждый раз вспоминать, что не надо заливать разработческий конфиг на продуктивный сервер =)

Далеко меня уже занесло, постараемся вернуться назад. Итак. План теперь таков:

  1. Пишем код, тестируем, отлаживаем. Добиваемся работоспособности.
  2. Коммитим в svn
  3. В post-commit hook вызываем phing
  4. Phing пакует наш проект в продуктивный вид, заменяя файлики конфигов, убирая ненужные всякие фишки svn и Eclipse.
  5. Лезем (не сами, скриптом) на продуктив. Пакуем текущую версию сайта в архив. Сливаем себе.
  6. Заливаем изменения с помощью rsync over ssh.

По-моему неплохой план =) первые 2 пункта уже вроде как отлажены. Осталось разрбраться с остальными. Так как сегодня вечер воскресенья, пришлось взять самый маленький и скучный шестой пункт =)

Rsync over ssh

Ну наконец-то. Процедура беспарольного соединения с удаленным сервером обсосана уже вдоль и поперек (да, именно так =) на просторах инета и рунета. Например, здесь.

А дальше чистая bash-магия, которая выглядит вот так (подсмотрено здесь, одна строка!):
rsync -zrptL --delete-after -e "ssh" /local/folder/ remote-server.ru:/remote/folder

За разъяснениями — в man или источник. Только будте аккуратны. Оно удаляет без права переписки. Именно поэтому я хочу для начала бэкап наладить, а потом уже это использовать это заклинание =) Кстати, обращайте внимание на слэшики в конце путей. Они важнее, чем вы думаете.

Именно за это я люблю *nix. Весь вечер ты читаешь маны, бродишь по сайтам, читаешь чуть ли не китайские форумы. Зато потом одной строкой ты захватываешь мир. Продложение следует.

ExtJs. Многостраничный грид с фильтром и поиском. Часть 1.

Январь 23, 2008

Просматривая статистику поискового трафика, любезно предоставленную мне feedburner’ом, я замечаю, что основная масса трафика идет на тему ExtJS. Мне не совсем понятен этот момент 😉 Обычно, когда мне что-то надо узнать по ExtJs, я двигаю на их форум. Потому что именно там собрана вся информация, которая вообще может пригодиться (после документации, конечно). В гугле я ищу только конкретные ошибки, которые выдает мне FireBug. Потому что поисковая система форума далека от идеала.

Но, в свете того, что я чуть подправил вектор своего блога и ориентируюсь на пользователей больше, чем раньше, я начну серию статей, посвященных ExtJS. А точнее одному удобному виджету, который может быть применен во множестве ситуаций. Речь идет о многостраничном гриде с поиском и фильтром.

Работая с ещё с ExtJS 1.1, я нашел замечательный топик, в котором рассказывалось о подобном гриде. И приводился замечательный пример. В этом примере всё отлично. Но он написан на первой версии и использует в качестве бэк-энда python. В этой серии туториалов я опишу создание такого же грида, с использованием ExtJS 2.0, php5 и Oracle (для MySQL будут приведены примеры запросов, не сильно отличающиеся от ораклинских).

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

Итак. Наш грид будет состоять из:

  • grid.html — html-файл, содержащий разметку страницы
  • grid_data.php — файл, обслуживающий запросы к БД со стороны грида
  • grid.js — js-файл, содержащий основной код приложения

Архитектура будет банальной. Наш грид посредством AJAX-запросов, будет обращаться к php-файлику и тот будет передавать ему данные в формате JSON. Запросы к БД будут всего двух типов:

  • Запрос очередной страницы с данными
  • Поисковый запрос

Для простоты демонстрации, не будем сильно усложнять поиск и обойдемся LIKE. Но никто не мешает реализовать сложную поисковую логику. Просто это выходит за рамки этой серии статей. Ну а постраничная разбивка — это совсем просто (хотя на Oracle — чуть сложнее)

На сегодня всё. Stay on line.

Постраничная разбивка с Oracle.

Ноябрь 19, 2007

Ни для кого не секрет, что Oracle — это труЪ =) Но когда я «проапгрэйдился» на проекте до него с MySQL, то я не нашел там привычного сердцу LIMIT 0, 20 и расстроился. Как же так. Самая лучшая БД, а такой полезной функции нет.

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

В приведенном решении меня не устраивало 3 вещи:

  1. Для подсчета строк надо делать отдельный запрос
  2. Глючит при хитрых ORDER BY
  3. DBA сказал «мутная весчь этот rownum» =)

Решение было найдено довольно быстро. И оно было избавлено от всех 3х недостатков. Вместо «мутного» rownum была применена функция row_number(), которая дала нужный результат. Плюс доработав запрос, я получил в нем и колличество строк. Правда оно пишется в каждой строке ответа, но нам же оно нужно для постраничной разбивки, поэтому заботиться о количестве данных, передаваемых по сети не стоит. Вот готовый рецепт:

select * from (
select ROW_NUMBER() over(order by req.requests_date desc) as r,
count(tab.id) over() as total,
from table tab,
where tab.column = 'value'
) x
where x.r between '" . ($start + 1) . "' and '" . ($start + $limit) . "'

Ссылка на документацию по Oracle может внести дополнительную ясность, от себя добавлю лишь, что в over() пишем все ORDER BY, $start и $limit это с чего начинать(начинаем с 0) и на чем остановиться (передается количество записей на страницу). count() должен применяться на unique поле (что характерно ;). Вот, в принципе, всё. Если остаются вопросы или предложения по оптимизации — прошу в комменты.

Assertion failed: LDAP_VALID( ld ), file getentry.c, line 35.

Октябрь 31, 2007

Вот такими неприличными строками встретил меня мой сервер после перезагрузки. Ошибка из разряда «Ничего не менял. Только перезагрузил!»

После продолжительных поисков в гугле и нахождения ответов «Мы не знаем что это, но физическая перезагрузка сервера нам помогла», пришел к выводу, что это очень печально. Мне сервер перегрузить ну совсем никак. Это делается через RFC, а их выполняют долго.

Ошибка кроется в модуле ldap для php. Ошибка возникает, вроде, только под 64-битными SPARC’ами. На соляре. Вообщем редкая штука 😉

Решения проблемы я не нашел. Перекомпиляция с флагами оптимизации мне не помогла. Пришлось отрубать модуль ldap из конфигурации. Это мне ещё аукнется. Но в свете предстоящего на выходных внедрения, это малая кровь.

Изящный баг. Или как я чуть не сменил шаблонный движок.

Октябрь 10, 2007

Сегодня утром столкнулся с ситуацией, которая может ввергнуть в панику любого разработчика. Когда уходил вчера вечером, всё работало, бегало и жило. Сегодня утром пришёл…И что-то жизнь затихла.

В своем проекте я использую Smarty. Проверенный временем шаблонный движок, который при наличие прямых рук и склонности к чтению документации, способен выдать неплохую производительность и гибкость. И мы с ним хорошо ладили. Пока сегодня утром, Smarty не начал мне компилировать пустые страницы. Одну за одной. Если я заходил на одну страницу, то все остальные, на которые я пытался попасть по ссылкам, были пустые. Я удалял скомпилированные страницы, заходил снова и всё повторялось. Потом у страниц отвалился подвал, который жил в отдельном шаблоне. Вообщем сайт исчезал на глазах. У меня началась паника и я начал подумывать о смене шаблонного движка. Потом вспомнил, что можно накатить ночной backUp (все ведь делают бэкапы. Я УЖЕ делаю бэкапы.) и посмотреть что будет с ним. Для этого надо было сохранить то, что было сделано за утро и раскатать ночную версию.

Бэкап отказался создаваться, сославшись на то, что на сервере закончилось место. И тогда все встало на свои места. Просто за ночь кто-то что-то сделал с сервером. И место закончилось. И бедный Smarty не мог записывать свои скомпилированные шаблоны. И создавал их пустыми. Место расчистили и всё вернулось на круги своя.

Вот такой вот полезный опыт разработки в многокритериальных системах.

И снова Eclipse. Теперь PDT.

Сентябрь 20, 2007

Вступление

Давно не трогал Eclipse. Писал себе спокойно в ZDS. И, вдруг, прошел слух, что вышел PDT 1.0 Release. Надо попробовать, решил я.

И попробовал. К счастью, на сайте разработчиков есть собранная версия, и разбираться с зависимостями не пришлось. Всё заработало с первого раза. Но в любом случае, с выходом Eclipse 3.3 aka Europe, ситуация стала получше.

Основная часть

Для меня ZDS идеален. Кроме мелких огрехов и стоимости, меня всё устраивает. Да даже стоимость у него вполне вменяемая с учетом студенческих скидок. И без учета возможности украсть. Он помнит имена переменных. Он знает все (почти) основные функции. Он поддреживает ZF. Он знает что такое JavaScript. Он выдает прекрасные описания функций. Он хорошо работает с SVN…да много чего ещё.

Что же из этого можно обнаружить в PDT…Он слышал о функциях и способен напомнить порядок следования переменных, что для PHP важно. Ибо порядок часто сильно разниться. Haystack и Needle часто меняются местами. Он знает SVN благодаря plug-in’у. Если пересесть на Aptana и добавить Spket IDE, он будет знать что есть JavaScript и даже сможет подсказывать названия функций ExtJs (об этой библиотеке мы ешё поговорим). Да, можно настроить debugger. Да, помнит названия переменных. Но блин! Учитывая, что его создавали программисты из Zend, понятно, что они не будут создавать конкурента ZDS. И он не конкурент.

Заключение

Я не принадлежу к джедаям. Я не освоил Vi(m) или Emacs. Мне нравится легкость с которой можно писать в ZDS. Это та легкость, которая присуща самому PHP. И, к сожалению, пока я не вижу реальных альтернатив ZDS без потери удобства написания кода. Даже не смотря на то, что мне приходится часто обращаться к мануалу по ExtJs на сайте. Просто ZDS удобней. И всё.

П.С. Кто-то может сказать «Сделай лучше». И будет прав =) Может это достаточная причина, чтобы учить Java. Время покажет.

Сага про Solaris 5.9, Oracle 10 и PHP 5.2.3.

Август 14, 2007

Эта история является продолжением работы над славным и большим проектом. В честь которого я уже копал LDAP.

Поняв, что окончательно приложение будет крутиться на Solaris’е, я пришел к выводу, что и разработку лучще вести под этой славной операционной системой о чем смело заявил вышестоящим. С меня спросили конфигурацию сервера и количество свободного места. Долго раздумывая, я перечислил все модули для Apache и PHP, которые мне необходимы и привел примерную цифру всего этого софта в установленном виде плюс сам проект.

Решив, что скоро у меня будет свой серер под Solaris’ом, я продолжил ковырять LDAP и успел реализовать неплохую авторизацию. Правда с использованием mod_auth_sspi.so, который умеет крутиться только на виндовых серверах. А у меня будет Solaris. Но простота реализации мне очень понравилась.

Ждать пришлось не очень долго, и скоро мне прислали логин, пароль, имя сервера и имя папки. Подобное письмо вызвало у меня ряд вопросов. И меня отправили к специалисту. Специалист объяснил мне, чем коннектиться к серверу по SFTP (WinSCP) и показал как пользоваться PuTTY. Он же сказал мне, что root мне никогда не дадут, свой сервер тоже, и что он поднимал Apache с PHP под простой (не рутовой) учетной записью, и всё было номрально.

Так мне пришлось заняться чрезвычайно интересной задачей по поднятию сервера в маленькой локальной папочке на сервере под Solaris 5.9, где нет вообще ничего.
Если искать в инете книги по Solaris, то вы нигде не найдете в них способ установки софта без прав админа. Я знаю про сырцы, но у меня не было binutils, g++ и кучи библиотек.

Зато мне рассказали про команду pkgtrans. После прочтения по ней manа, лично мне понятнее не стало. Рассказы о ленте и других потоковых накопитилях совершенно меня расстроили. Но команда оказалась единственной полезной, и если бы не она, мне не удалось бы осуществить задуманное.

Установка софта без прав root

Идем на www.sunfreeware.com (пакеты вообще без расширений) или на www.blastwave.org (пакеты с расширением pkg). Там лежат большие архивы собранного софта. Для кучи версий Solaris’а. Качаем то, что нам нужно, копируем себе в дирректорию (обозначим её для краткости $HOME), распаковываем командой gunzip pack_name распаковываем его. А дальше вступает pkgtrans. В той же дирректории пишем
pkgtrans pack_name pack/
Эта комманда распакует наш пакет в поддиректорию $HOME/pack/SMCpack_name или pack/CSWpack_name, в зависимости от того, откуда качали файл.
Теперь у нас есть автомат. Т.е. скомпилированный софт. Т.е. хотя бы gcc =).

Сборка софта для сборки сервера.

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

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

Итак, у меня есть работающий GCC, т.е. оба компилятора и для C и для C++. Это уже хорошо. Теперь можно собрать binutils, в которых присутствуют необходимые для сборки инструменты. Единственный параметр, с которым я собирал был —prefix=/u01/users/php/tools. Т.е. я просил установить всё в папку tools, где у меня со временем образовалось почти полное дерево системы. Таким образом, собирая все инструменты в эту папку, я избавил себя от необходимости прописывать десятки путей в свой .profile. Важно прописать пути к этой папке до основных путей системы. Т.е. при задании переменных окружения надо писать export PATH=/u01/users/php/tools:$PATH.

После binutils, установим пакеты bison, flex, gawk, m4, make (все есть на gnu.org, кроме flex, он живет на flex.sourceforge.net). Эти пакеты необходимо собирать с тем же префиксом, что и binutils. Они собираются без проблем, насколько я помню. Чтобы понять что использует ваша система, когды вы говорите ей, допустим make, стоит набрать which make, и получите путь, откуда этот make запускается. Так стоит проверять, чтобы использовались нужные инструменты.

Сборка Apache 2.0.59

Собрать, как я уже говорил, мне необходимо работающий сервер Apache+PHP и связать его с Oracle. Я начал с Apache. Как с наиболее простого. По каким-то причинам Apache ветки 2.2 у меня собираться отказался. Поэтому я собирал проверенный Apache 2.0.59. Создаем простой файлик, куда пишем полный конфиг, делаем файлику chmod +x, или каждый раз пишем sh apache2_config. Вот содержимое файлика:


cd /u01/users/php/src/httpd-2.0.59
./configure \
—prefix=/u01/users/php/apache2 \
—enable-so \
—enable-mods-shared=’rewrite mime-magic ssl vhost-alias’ \
—disable-cgi \
—disable-autoindex \
—with-mpm=prefork \
—with-ssl=/u01/users/php/openssl \

Модулей не очень много. Для сборки Apache мне пришлось установить только собранный из сырцов OpenSSL. Хотя для сборки PHP, мне пришлось использовать скомпилированный openssl 0.9.7, потому что при сборке с текущим 0.9.8 выпадал ld, который под Solaris не очень стабилен. А заставить ПСС использовать GNU ld мне не удалось. Для этого пришлось бы пересобирать компилятор. Это мне не удалось. Вообщем, с Apache проблем особо не возникло.

Сборка PHP 5.2.3

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


cd /u01/users/php/src/php-5.2.3/
./configure \
—prefix=/u01/users/php/php5 \
—with-apxs2=/u01/users/php/apache2/bin/apxs \
—enable-bcmath \
—enable-calendar \
—enable-exif \
—enable-mbstring \
—enable-soap \
—enable-sockets \
—with-gd=/u01/users/php/tools \
—with-jpeg-dir=/u01/users/php/tools \
—with-png-dir=/u01/users/php/libpng \
—with-iconv \
—with-libxml-dir=/u01/users/php/tools \
—with-xsl=/u01/users/php/tools \
—enable-zip \
—with-zlib \
—with-ldap=/u01/users/php/tools \
—with-openssl=/u01/users/php/pack/SMCosslg/reloc \
—enable-soap \
—with-mcrypt=/u01/users/php/libmcrypt \
—disable-ipv6 \
—with-oci8=instantclient,/u01/users/php/instantclient_10_2 \
—enable-pdo \
—with-pdo-oci=instantclient,/u01/users/php/instantclient_10_2,10.2.0.3 \
—without-pdo-sqlite \
—without-sqlite

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

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

Дальше начинается GD. Для сборки GD, надо сначала собрать libpng (без проблем) и libjpeg. Собрав libjpeg командой ./configure —prefix=/u01/users/php/tools, самое главное на забыть после команды make install, скомандовать make install-lib. Без этого, GD будет конфигурироваться, но не будет собираться (отняло примерно день, решение нашлось на каком-то форуме).Если нужна поддержка ttf или xpm, их тоже надо собирать. Мне они нужны не были. После этого сборка GD проходит гладко, и в конфиге мы указываем его, и пути к библиотекам jpeg и png.

Дальше идет iconv, xml и xslt, для них необходимо собрать библиотеки, соответственно iconv, libxml2 и libxslt. Здесь проблем нет. Не забываем про prefix, иначе make install не пройдет.

Теперь ldap, openssl и mcrypt. LDAP собирается (правда, он у меня попросил Berkeley DB, но это проблемой не считается =)), а вот openssl, как я уже говорил, мне пришлось использовать готовый. Т.к. PHP отказывался делать make, вызывая панику у ld. Это проблема новой версии 0.9.8 и архитектуры SPARC. С mcrypt проблем не было.

И вот начинается самое интересное. Oracle. Достаем мануал The Underground PHP and Oracle® Manual с оракловского сайта. Читаем. Идем на тот же оракловский сайт и качаем instant client под Solaris Sparc. Почему он в zip, я не знаю. Разкатываем архив в нашу папочку. Теперь у нас есть оракловый клиент. С ним-то мы и будем собирать PHP. Это стоило мне где-то трех дней. PHP спокойно конфигурировался с OCI8, но отказывлся конфигурировать PDO_OCI. А он мне был очень нужен. Проблема скрывалась в Sun’овском SH (шелле), который немного отлично ведет себя от обычных. Я решил проблему, прописав в конфигурационном файле #!bin/bash вместо #!bin/sh. У меня всё собралось. Эту проблему обещали исправить в PHP 5.2.4 (Тред по этой проблеме на phpClub).

Соединяемся с Oracle

В принципе на этом проблемы со сборкой закончились. Всё собралось, запустилось и заработало. Не хватало только соединиться с Oracle. Здесь меня тоже ожидали сюрпризы (дня два). Не смотря на всё, что написано в Подземелье ПХП и Оракла, они никак не соединялись. У меня в наличие было два файлика sqlnet.ora и ldap.ora, которые объясняли Ораклу где искать сервер, но не смотря на всякие TNS_ADMIN, Oracke Instant Client не видел сервер. И файлики, видимо тоже. Всё решилось довольно хитро. Обычно, если устанавливать на компьютер обычный оракловый клиент, эти файлики лежат в папочке $ORACLE_HOME/network/admin/. Это и есть ключ. Пришлось в папке instantclietn_10_2, которая жила у меня, сделать эту структуру подпапок. И уже в подпапку admin положить два файлика. И он их нашёл. Я не знаю, зачем так всё сложно. Но мне кажется, что без программерской лени тут не обошлось.

Первый этап саги окончен. Сервер работает. Связь с БД есть. Но что-то мне подсказывает, что пересобирать я буду и Apache и PHP. Тогда, если будет о чем написать — буду дописывать сюда.

Zend Framework 1.0 и Oracle.

Август 3, 2007

На работе надо было связаться с оракловым сервером. Так как я решил поплотнее пообщаться с Zend Framework, было решено соединяться им. К тому же он предоставляет достаточно хороший каркас для создания приложений. И со временем, я думаю, я буду использовать его всё больше.

Ну так вот. Соединился я с базой. И всё, вроде, нормально, если писать запросы руками. Т.е. «SELECT * FROM USER». Но это не очень интересно. Так как ZF предоставляет достаточно классов для работы с базой в более прозрачном режиме. НО! При попытке создать запрос его средствами, я получал ошибку. 942 ORA-00942: table or view does not exist. И дальше шёл странный такой SQL-запрос. Слабо похожий на то, что любит Oracle.

Мне сразу не очень понравились все эти кавычки вокруг имени таблицы и полей. И Ораклу они тоже не нравятся.

В документации я решения проблемы не нашёл. Долго бродил по исходному коду. Безысходно. Спросил у умных. Те объяснили мне, что эти кавычки появляются автоматически и отвечает за это переменная $_autoQuoteIdentifiers в классе Zend_Db_Adapter_Abstract.

Поначалу я на радостях просто выставил ей false, но потом понял, что модификация фреймворка не есть гуд. Потому что проблемы с обновлениями не заставят себя ждать. И тогда мне очередные умные люди объяснили, что надо просто при инициализации подключения надо указать в параметрах опцию ‘options’ => array(Zend_Db::AUTO_QUOTE_IDENTIFIERS => false). И всё будет ок.