Записки самоучки

Июль 13, 2007

Эпоха PHP4 официально заканчивается

Filed under: События,PHP — 4matic @ 12:01 пп

Все, PHP4 с нового года перестает обновляться, а с 08-08-2008 PHP4 перестанет поддерживаться вообще. Об этом сообщено на сайте http://php.net/. Там же выложены ссылки на документацию, которая поможет перейти с 4-ки на 5-ку.

Так что, кто еще не перешел на 5-ку, то у вас есть время и повод, что бы это сделать.

Мда, я стал интересоваться PHP, когда еще была ветка 4.3. Уже полтора года, как я перешел на 5ку и не жалею, а только рад бОльшим возможностям и бОльшей производительности. Теперь то, с чего начинал становится историей :-). Теперь ждем RC PHP6, в которой планируют реализовать много интересных и полезных вещей.

Июнь 11, 2007

PHP Open Air party 2007

Filed under: События,PHP — 4matic @ 9:59 пп

Если говорить по-русски то встреча PHP-программистов на свежем воздухе. Планируем встретиться 17 июня на Петровке,  а потом отправиться на Троещину — там и отдохнуть. В том году отлично отдохнули, даже дождь не помешал. Надеюсь, что в этом году будет не хуже. Пока сонная активность в ветке с обсуждением мероприятия. Небесная канцелярия что-то капризничает. Интересно, как на выходных с солнцем будет.

Май 28, 2007

Танцы с бубнами вокруг настройки сервера Windows 2003+Apache 2.2.4+PHP 5.2.2+MySQL 5.0.41

Filed under: Apache,Глюки,MySQL,PHP — 4matic @ 4:56 пп

Занимался настройкой веб-сервера. Давно не тратил столько времени на настройку!

Все сделал как обычно. Скачал свежие релизы. Установил каждый из продуктов. Начал настраивать совместную работу. И тут началось веселье.

При попытке установить расширения для работы с СУБД  получилось вот что. расширение для работы с MSSQL встало без капризов, а вот при попытке подключить расширение mysqli получил ошибку invalid access to memory location. Не буду рассказывать о всех танцах с бубнами на протяжении 4 часов, просто расскажу, в чем проблема и как решил.

Имею привычку разворачивать PHP и прописывать PHPRC=»C:\PHP\» в системных переменных окружения. И потом все подключаемые библиотеки хранить в  C:\PHP\. Так вот после гугиления нашел на одном форуме скромное замечание о том, что не смотря на то, что в документации PHP предлагает делать те действия, которые я и выполнил, в некоторых релизах Windows подключение библиотек для работы PHP по путям отличным от C:\Windows или C:\Windows\System32 происходит некорректно. Почему — этого науке не известно.

Как решил проблему. Просто перекинул файлы libmysql.dll и php5ts.dll в папку C:\Windows\System32 и проблема почти решилась. Почти, потому что возникили еще одни грабли. Имею привычку (дурную???) использовать libmysql.dll не из релиза PHP, а из релиза MySQL. Так вот, клиент от MySQL не захотел подключать расширение mysqli, а родной PHP-шный запустился без проблем. Т.е. пришлось в папку C:\Windows\System32 кидать libmysql.dll, которая шла вместе с PHP, а не MySQL.

P.S. Неприятно, что после того, как MySQL перестал оперативно выпускать бинарники для Windows, вообще перестали обновлять библиотеки API PHP.

Март 24, 2007

Хочу поехать на PHPConf2007

Filed under: События,PHP — 4matic @ 4:28 пп

В мае в Москве будет проходить конференция PHP-программистов. Более подробно на сайте http://www.phpconf.ru/. Так же в течение нескольких дней будут проходить мастер-классы. Хотелось бы и на них попасть. Темы, которые планируется озвучит на мероприятиях для меня очень актуальные и интересные. Жаль, что время на обсуждение вопросов очень мало. Смотрю, что на конференциях подобная практика — норма.

Прикинул стоимость посещения — получается где-то 1000-1200 доларов. Загрустил. Буду ходатайствовать на работе, что бы инвестировали в меня деньги.

Февраль 9, 2007

Вышел PHP 5.2.1

Filed under: События,PHP — 4matic @ 11:27 дп

Кто еще не в курсе: вышел релиз PHP 5.2.1. Разработчики PHP настоятельно рекомендуют обновиться до последней версии, которая стала еще более надежней и защищенней.

Февраль 6, 2007

WordPress 2.1 с поддержкой mysqli

Filed under: Движки,MySQL,PHP — 4matic @ 2:56 дп

У меня свой сервер. На нем поднят Apache и PHP 5.2.0. Так же есть сервер MySQL 5.0.27. У PHP стоят только те расширения, что мне нужно. В частности мне не нужно расширение mysql, но мне нужно расширение mysqli. Владея такой конфигурацией решил поставить Worpdress. К своему удивлению обнаружил, что WordPress не знает ничего о расширении mysqli. Так же есть пробелы при описании классов. В частности, при описании классов не описаны все поля класса, что для версий PHP5 не есть правильно. Но это на самом деле мелочи. Ниже я опишу процесс подключения поддержки расширения mysqli. Благодаря архитектуре WordPress, не составит большого труда наладить работу и с другими СУБД.

  1. Идем в директорию wp-includes. Делаем копию файла wp-db.php и даем копии имя db.php. Копию кладем в туже директорию, что и wp-db.php.
  2. Открываем файл и правим в нем все функции mysql_* на соответствующие им функции mysqli_*. При этом не забываем, что нужно обязательно указывать идентификатор ресурса результата запроса. Кстати, этот идентификатор не описан в классе. Поэтому выполняем пункт 3.
  3. Описываем в классе забытое, но нужное свойство $dbh, добавляя строку var $dbh где-то в районе дислокации всех var класса wpdb.
  4. Что-то какие-то непонятки с экранированием строк, которые поступают в запросы. Из-за каких-то непонятных мне причин разработчики решили просто прослешивать функцией addslashes():

    function escape($string) {
    return addslashes( $string ); // Disable rest for now, causing problems
    if( !$this->dbh || version_compare( phpversion(), ‘4.3.0’ ) == ‘-1’ )
    return mysql_escape_string( $string );
    else
    return mysql_real_escape_string( $string, $this->dbh );
    }

    Я вместо этого написал:

    function escape($string) {
    return mysqli_real_escape_string($this->dbh, $string);
    }

  5. Сохраняем изменения, закрываем файл. Или качаем db.php.
  6. Идем в директорию wp-admin.
  7. Делаем копию файл upgrade-functions.php и называем ее upgrade-ifunctions.php.
  8. Открываем upgrade-ifunctions.php и изменяем функцию:
  9. function wp_check_mysql_version() {
    global $wp_version;

    // Make sure the server has MySQL 4.0
    $mysql_version = preg_replace(‘|[^0-9\.]|’, », @mysql_get_server_info());
    if ( version_compare($mysql_version, ‘4.0.0’, ‘<‘) )
    die(sprintf(__(‘<strong>ERROR</strong>: WordPress %s requires MySQL 4.0.0 or higher’), $wp_version));
    }

    на

    function wp_check_mysqli_version() {
    global $wp_version;
    global $wpdb;

    // Make sure the server has MySQL 4.0
    $mysqli_version = preg_replace(‘|[^0-9\.]|’, », @mysqli_get_server_info($wpdb->dbh));
    if ( version_compare($mysqli_version, ‘4.0.0’, ‘<‘) )
    die(sprintf(__(‘<strong>ERROR</strong>: WordPress %s requires MySQL 4.0.0 or higher’), $wp_version));
    }

    Так же в этом файле поменяйте вызовы функции wp_check_mysql_version() на wp_check_mysqli_version() (2 раза).

  10. В директорию wp-admin находим файл setup-config.php и меняем в нем строку (у меня строка 154):

    require_once(‘../wp-includes/wp-db.php’);

    на:

    if ( file_exists(ABSPATH . ‘wp-content/db.php’) )
    require_once(‘../wp-includes/db.php’);
    else
    require_once(‘../wp-includes/wp-db.php’);

    Т.е. теперь, при наличии файла db.php — нашего враппера (обмертки) запросов к СУБД, WP попробует подключить его, а если не найдет этот файл, то подключит стандартный врапер, к которому и пальцем не прикасались.

  11. В той же директории находим файл install.php и меняем в нем строку (у меня строка 9):

    require_once(‘./upgrade-functions.php’);

    на:

    if ( file_exists(ABSPATH . ‘wp-admin/upgrade-ifunctions.php’) )
    require_once(ABSPATH . ‘wp-admin/upgrade-ifunctions.php’);
    else
    require_once(ABSPATH . ‘wp-admin/upgrade-functions.php’);

    Т.е. теперь, при наличии файла upgrade-ifunctions.php — «нашего файла», WP попробует подключить его, а если не найдет этот файл, то подключит стандартный файл upgrade-functions.php, к которому и пальцем не прикасались.

  12. В той же директории находим файл admin.php и меняем в нем строку (у меня строка 92):

    require_once(ABSPATH . ‘wp-admin/upgrade-functions.php’);

    на:

    if ( file_exists(ABSPATH . ‘wp-admin/upgrade-ifunctions.php’) )
    require_once(ABSPATH . ‘wp-admin/upgrade-ifunctions.php’);
    else
    require_once(ABSPATH . ‘wp-admin/upgrade-functions.php’);

  13. В той же директории находим файл upgrade.php и меняем в нем строку (у меня строка 8):

    require_once(ABSPATH . ‘/wp-admin/upgrade-functions.php’);

    на:

    if ( file_exists(ABSPATH . ‘wp-admin/upgrade-ifunctions.php’) )
    require_once(ABSPATH . ‘wp-admin/upgrade-ifunctions.php’);
    else
    require_once(ABSPATH . ‘wp-admin/upgrade-functions.php’);

    Кстати, обратите внимание, что лишний слеш, потому что ABSPATH заканчивается слешем, а тут еще один прицепили.

  14. Последний рывок. Идем в корневую директорию распакованного движка, открываем файл wp-settings.php, находим строку (у меня строка 100):

    require_once (ABSPATH . WPINC . ‘/wp-db.php’);

    на:

    if ( file_exists(ABSPATH . ‘wp-includes/db.php’) )
    require (ABSPATH . ‘wp-includes/db.php’);
    else
    require_once (ABSPATH . ‘wp-includes/wp-db.php’);

Если я ничего не забыл, то все готово для инсталяции WordPress на сервере с конфиграцией PHP5 с расширением mysqli, но без расширения mysql, а так же самой СУБД MySQL. Если что-то упустил — комментируйте, но сначала попробуйте отладить самостоятельно!

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

Предупреждение. Если вы выделяете и копируете тексты из блога, то исправляйте кавычки. В блоге кавычки обратные и скрипт с такими кавычками корректно работать не будет!!!!!

Январь 21, 2007

Denver — зло

Filed under: Это жизнь,PHP — 4matic @ 2:46 пп

Чем больше хожу по форумам, тем больше убеждаюсь, что Денвер Дмитрия Котерова — это зло. Новичкам Денвер просто противопоказан — они не различают, что такое клиент, что такое сервер, как отношение PHP имеет к Apache, а Apache к MySQL.

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

Очередная привлекательная идея заплёвана семечками.

P.S. Есть достойная альтернатива Денвера — это TopServer. Сегодня наткнулся на Belarusian PHP Group. Сам ручками не крутил, но по описанию — интересное решение. Кстати, там есть интересные книги в электронном варианте — рекомендую.

Ноябрь 3, 2006

Release PHP 5.2.0

Filed under: PHP — 4matic @ 11:31 дп

[02-Nov-2006] The PHP development team is proud to announce the immediate release of PHP 5.2.0. This release is a major improvement in the 5.X series, which includes a large number of new features, bug fixes and security enhancements. Further details about this release can be found in the release announcement 5.2.0, the full list of changes is available in the ChangeLog PHP 5.

All users of PHP, especially those using earlier PHP 5 releases are advised to upgrade to this release as soon as possible. This release also obsoletes the 5.1 branch of PHP.

For users upgrading from PHP 5.0 and PHP 5.1 there is an upgrading guide available here, detailing the changes between those releases and PHP 5.2.0.

Сильно в логи изменений не вчитывался. Но изменений и доработок достаточно много. В частности обратил внимание на расширение JSON. PHP 5.2.0 уже скомпилирован с поддержкой JSON. Это расширение имеет всего две функции, которые немного упростят работу с объектами JavaScript.
Так же обратил внимание на расширение ZIP было оно раньше в виде расширения или в виде класса — не знаю — никогда им не пользовался.
Так что качаем новую версию PHP, обновляем маны по языку.

Август 16, 2006

Стиль программирования помогает избегать ошибок

Filed under: Идеи,PHP — 4matic @ 7:50 пп

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

Ошибка в коде оказалась рядовой. В условном операторе if вместо сравнения происходит присвоение. Т.е. написано:

if ($var = 0)
{
   ...
}

вместо

if ($var == 0)
{
   ...
}

Я для себя выработал одно правило — при сравнении константу переносить в левую часть, т.е. код, который я пишу выглядит так:

if (0 == $var)
{
   ...
}

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

А у вас подобные привыки при написании кода?

Август 15, 2006

В Windows функция glob() чувствительна к регистру

Filed under: PHP — 4matic @ 11:12 дп

Потратил где-то полчаса, прежде, чем обнаружил что в Windows функция glob() чувствительная к регистру букв в имени файла. Потом прочел ман по glob() и нашел в комментариях:

Note that on Windows, glob distinguishes between uppercase and lowercase extensions, so if the directory contains a file «test.txt» and you glob for «*.TXT» then the file will not be found!
That bug only happens when you use patterns containing «*», like the example above. If you for example search for the full filename «test.TXT» then everything works correctly.

Я понимаю, что эта особенность связана с тем, что в *NIX системах регистр имеет значение, но пока не знаю, как красиво решить проблему. На данный момент решил так, что прохожусь двумя циклами для каждого из регистров.
Если есть я туплю, то подскажите, как решить проблему?
Еще, как вариант, не производить поиск по маске *., а проивзодить поиск всех файлов и выбирать нужные, сравнивая имена файлов с помощью обычных регулярных выражений или пользовать fnmatch(), но все равно как-то некрасиво.

Блог на WordPress.com.