2011-09-03

Сравнение различных методов вызова функций в PHP

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

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

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

Вот исходный код скрипта.

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

generation_time 11.7576429844
php_version 5.3.2-1ubuntu4.9
Case try 1 try 2 try 3 try 4 middle
Same plain function called 10000 times 0.0166 0.0187 0.0183 0.0135 0.0168
Different plain functions called 10000 times 0.0163 0.0221 0.018 0.0163 0.0182
Same static method 10000 times 0.0193 0.0265 0.0206 0.0194 0.0214
Different static methods called 10000 times 0.0221 0.0283 0.0229 0.0229 0.024
Static methods of different classes called 10000 times 0.0236 0.0279 0.0251 0.0242 0.0252
Same dynamic method called 10000 times 0.0166 0.0193 0.0169 0.0169 0.0174
Different class methods called 10000 times 0.02 0.02 0.0202 0.02 0.02
Singleton method called 10000 times 0.0403 0.0446 0.0409 0.041 0.0417
Different singletons called 10000 times 0.0562 0.0631 0.0548 0.0572 0.0578

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

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

При этом выяснилось несколько дополнительных вещей: cтатические вызовы функций объявленных без модификатора "static" примерно в два раза медленнее, чем с ним, cтатические методы немного медленнее, чем динамические.

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

 

Оставить комментарий

 
  2011-09-01

Еще один странный глюк в PHP

Два дня бился со странным глюком  - в скрипте в определенном месте отваливается соединение с базой данных - выдает "MySQL server is gone away". При этом отваливается всегда в одном и том же месте после куска кода с большим объемом вычислений, но без единого вызова базы данных. И только на сервере - на локальном компьютере всё тип-топ. Путем небольших, почти шаманских манипуляций с кодом удалось проблему купировать, правда неизвестно, где она может всплыть в дальнейшем. Налицо проблема в самом интерпретаторе PHP.

Upd: Нашел источник проблемы

Такое себе позволял только PHP4. Похоже, PHP5 вступил в ту стадию зрелости за которой уже наступает старческий маразм...

 

Коментариев: 3

 
  2011-08-26

I need money, not a job

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

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

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

Занятно, что на людей которые более или менее имеют потенциал роста эти настроения влияют сильнее всего, они чувствуют, что что-то из себя представляют, это приводит к тому, что скорее всего они не пойдут работать на дядю - они чувствуют что есть другие способы получения денег. И в результате большинство оказывается выброшенными из нормального производственного процесса. С пивком у телевизора время пролетает веселее. Лишь единицы могут найти в себе силы начать что-либо делать.

Есть старомодное мнение, что чтобы стать классным специалистом - нужно развиваться, а как можно развиваться ни чем не занимаясь? Да, чтобы развиваться надо работать. Многие вчерашние студенты думают, что, чтобы добиться успеха нужно сразу начинать свое дело. Но успешно раскрутить своё дело получается у 0.00001 процента. Остальные промучившись год, два, так и не заработав ничего идут работать на дядю.

К чему я это? Просто периодически народ жалуется, что не может найти людей, желающих работать. Сам ищу - пока успехи довольно скромны. Люди не хотят работать, люди хотят денег. Много, сразу, и чтобы не работать.

Надеюсь, все же, что ситуация не настолько плоха, скорее всего, просто толковые люди никогда не появляются на рынке труда - они как нейтрино — неуловимы и не заметны, делают своё дело и не высовываются, а работодатели, которым посчастливилось найти таких людей помалкивают - а то как конкуренты переманят.

 

Коментариев: 8

 
  2011-08-24

Как поставить dav_svn если у вас cpanel

Опять возникла необходимость сделать репозиторий с доступом через http на сервере с cpanel. Ранее я уже об этом уже писал, но половина ссылок в том посте на сегодняшний день уже не работают, поэтому пришлось восстанавливать инструкцию заново, наступая на те же грабли повторно. На этот раз пост без ссылок - просто инструкция шаг за шагом:

Скачиваеме исходники Subversion и распаковываем:

> wget http://subversion.tigris.org/downloads/subversion-1.6.17.tar.gz

> tar -xzf subversion-1.6.17.tar.gz

Скачиваем SQLite распаковываем и копируем в папку с Subversion:

> wget http://www.sqlite.org/sqlite-amalgamation-3.6.13.tar.gz

> tar -xzf sqlite-autoconf-3070701.tar.gz

> cp -r sqlite-3.6.13 subversion-1.6.17/sqlite-amalgamation

Теперь компилируем и устанавливаем:

> ./configure --with-ssl --with-apxs=/usr/local/apache/bin/apxs --with-apr=/usr/local/apache/bin/apr-config --with-apr-util=/home/cpeasyapache/src/httpd-2.0.63/srclib/apr-util

> make

> make install

Создаем репозиторий:

> mkdir /home/username/data

> mkdir /home/username/data/svn

> cd /home/username/data/svn

> svnadmin create --fs-type fsfs repo

Настраиваем конфигурационные файлы апача:

> vi /usr/local/apache/conf/userdata/std/2/username/svn.hostname.com/custom.conf

Содержимое файла:

LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
<Location /svn>
        DAV svn
        SVNParentPath /home/svncleve/data/svn
        SVNListParentPath on
        SVNPathAuthz off
        AuthType Basic
        AuthName "Private SVN repositories"
        AuthUserFile /home/username/svn.passw
        Require valid-user
</Location>

Задаем пароль для пользователя SVN:

/usr/local/apache/bin/htpasswd  /home/svncleve/svn.passw svnuser

Проверяем конфигурацию сервера, пересобираем конфиги и рестаруем сервер:

/scripts/verify_vhost_includes

/scripts/rebuildhttpdconf

/scripts/restartsrv_httpd

Делаем чистый чекаут на локальной машине:

> svn checkout http://hostname.com/svn/repo .

Если svn update работает хорошо а svn commit выдает 403 ошибку то проверьте .htaccess в document root - cpanel по умолчанию пишет в .htaccess правила, ограничивающие использование методов PUT и DELETE - а именно они как раз и используются в WEBDAW через который работает Subversion. Несколько раз уже на это напарывался.

 

Оставить комментарий

 
  2011-08-12

Обновление прелоадера

Создал английскую версию прелоадера. Обновил внешний вид компонентов.

Теперь не стыдно показывать англоговорящим товарищам.

 

Оставить комментарий

 
  2011-08-12

DNS сервер на домашнем компьютере

Собственный DNS сервер для веб-разработчиков очень удобная вещь. Если локальный компьютер используется для разработки и на нем установлен Apache с несколькими десятками виртуальных доменов то прописывать все виртуальные домены в файле hosts довольно кропотливо. Со временем hosts превращается в полнейшую свалку а собственный DNS сервер позволяет организовать все гораздо компактнее и удобнее.

Обычно, чтобы отличать локальные сайты от всех других я им даю фиксированный суффикс по имени компьютера на котором они крутятся, например: ztools.maxhome - это локальная версия ztools.org на домашенем компьютере, maxistar.maxhome - локальная версия maxistar.ru, ztools.maxbook - версия ztools.org на ноутбуке и так далее.

Рассмотрим пример установки DNS сервера на локальный компьютер под управлением Linux, сделаем так, чтобы ВСЕ сайты с суффиксом .maxhome ссылались на локальный компьютер, с суффиксом .maxbook на ноутбук и так далее.

Итак, имеем машину с Ubuntu, устанавливаем на него DNS сервер:

> apt-get install bind9

добавляем в /etc/named.conf.local следующее:

zone "maxhome" {
     type master;
     file "/etc/bind/db.maxhome";
};

/etc/bind/db.maxhome - это файл зоны который нам предстоит создать, чтобы не создавать с нуля скопируем один из файлов в папке /etc/bind и отредактируем:

> cp db.local db.maxhome

после редактирования файл выглядит следующим образом (изменения помечены жёлтым):

; BIND data file for local loopback interface
;
$TTL    604800
@       IN      SOA     localhost. root.localhost. (
                             2         ; Serial
                        604800         ; Refresh
                         86400         ; Retry
                       2419200         ; Expire
                        604800 )       ; Negative Cache TTL
;
@       IN      NS      maxhome.
@       IN      A       192.168.1.101
@       IN      AAAA    ::1
*       IN      A       192.168.1.101

Обратите внимание на последнюю строку со звездочкой - она самая главная! Аналогичным образом создаём файлы зон для других компьютеров.

Теперь перегружаем наш DNS сервер:

maxim@maxim-desktop:~$ sudo /etc/init.d/bind9 restart
* Stopping domain name service... bind9                                 [ OK ]
* Starting domain name service... bind9                                 [ OK ]

На всех машинах на которых мы хотим иметь доступ к локальным ресурсам в свойствах сетевого подключения ставим IP адрес машины с установленным DNS сервером в качестве DNS сервера и проверяем как работает:

maxim@maxim-desktop:~$ ping dfdfd.maxhome
PING dfdfd.maxhome (192.168.1.101) 56(84) bytes of data.
64 bytes from 192.168.1.101: icmp_seq=1 ttl=64 time=0.044 ms
64 bytes from 192.168.1.101: icmp_seq=2 ttl=64 time=0.050 ms
64 bytes from 192.168.1.101: icmp_seq=3 ttl=64 time=0.044 ms
^C
--- dfdfd.maxhome ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2179ms
rtt min/avg/max/mdev = 0.044/0.046/0.050/0.003 ms

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

 

Коментариев: 1

 
  2011-08-07

Как поставить автомагнитолу в Hyundai Getz

Штатная аудиоподготовка у Hyundai Getz имеет нестандартный разъем, поэтому, подключить в него магнитолу сразу не получится. Поиск в интернет подсказывает, что для этого лучше всего воспользоваться специальным переходником Hyundai-ISO, который можно купить на Митинском рынке, в Москве. К сожалению, в Саратове нет ни одного Митинского рынка а про переходник не знают даже в специализированных магазинах. Специалисты в сервисе, просто обрезают родные разъемы и скручивают провода как надо, за все удовольствие берут 650-1000 рублей.

Но мне вариант со скручиванием почему то не понравился, да и захотелось самому повозиться :)  Я поступил так:

Снял заглушку на месте автомагнитолы при помощи отвертки аккуратно поддев последнюю сверху.

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

Вот распиновка оригинального разъема на Hyundai Getz:

На всякий случай прозвонил разъем тестером - контакт 15 оказался не подсветкой дисплея (+) а скорее землей, поэтому его я не стал использовать.

Распиновка разъема ISO автомагнитолы:

После подключения всех контактов разъем стал выглядить вот так:

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

Все заработало с первого раза без проблем.

UPD. На схеме разъема M16 изображена ответная часть а не сам разъём - реальный разъем соответственно имеет зеркальное расположение контактов, что без труда видно по форме выемок на разъеме - мне было лень зеркалить изображение разъема - думал это очевидно :) Будьте внимательнее!

 

Коментариев: 5

 
  2011-07-27

Хопёр 2011

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

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

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

Но самый страшный зверь на Хопре — это человек, по этой причине не хочу его сильно рекламировать — трошкi е тiлько для себе :) Места куда может подъехать машина так загажены, что хочется спросить господ автомобилистов — ну неужели нельзя увезти свой мусор с собой, на худой конец просто сжечь или закопать?

К счастью, сплав по реке имеет одно неоспоримое преимущество — можно найти такие места куда не подъезжала ни одна машина а попасть можно лишь по воде, таких мест на Хопре очень много  в силу его отдаленности от больших населенных пунктов.

 

Оставить комментарий

 
  2011-07-13

Неплохой багтрекер

При создании любого проекта нужно как то управлять процессом отладки, а для этого необходим багтрекер. Багтрекер это как секс - плохой багтрекер лучше чем совсем никакого. Долгое время использовал phpBugtracker - хотя он последний раз обновлялся в 2007 году, если внести в него парочку исправлений получается вполне себе ничего багтрекер.

Ну вот для одного нового проекта решил попробовать Mantis Bugtracker. Понравилось, аккуратненько так, и ничего лишнего. Может кто порекомендует чего лучше?

 

Коментариев: 2

 
  2011-07-13

Странный глюк в PHP

Не знаю, сталкивался ли кто или это мне повезло, но вчера поймал загадочный баг, похоже, что в движке PHP, хотя, пока до конца не уверен.

Предыстория такая - работаю над проектом, над которым потрудились индийские программисты. Сам проект сделан на движке Symphony - добротный такой движок, вполне приятный. В качестве библиотеки работы с базой данных используется Creole - тоже довольно приятная штука. В качестве ORM используется Propel — штука громоздкая, но тем не менее тоже весьма мощная и простая. Вообще Symphony показался мне весьма неплохим движком, весьма простым и удобным. Наверно, потому, что он почти один в один копирует Ruby on Rails - те же хелперы, тот же yml в конфигах, такой же подход к MVC - в общем очень похоже.

Так вот, доблестные индийские программисты, вместо того, чтобы использовать оснастку из Symphony навставляли везде mysql_connect и mysql_query. И все бы ничего, но mysql_connect у них вставляется ВЕЗДЕ перед mysql_query — в одном скрипте может быть создано несколько десятков соединений, а каждый mysql_query дополняется проверкой "or die(mysql_error())", поэтому любая ошибка в sql ведет к скоропостижной кончине всего скрипта.

Чтобы хоть как то исправить это безобразие я сначала удалил все mysql_connect. Затем, все mysql_query поиском и заменой заменил на собственную функцию, использующую оснастку creole, поместил её в глобально видимый класс myTools::query():

static function query($sql){
         $connection = Propel::getConnection();
         $r = $connection->executeQuery($sql);
         return $r->getResource();
}

Странное дело код ведь тривиальный, но ресурс возвращаемый этой функцией оказался невалидным! Причем внутри функции ресурс еще остаётся рабочим а возвращённый во вне оказывается сломанным. Тот же код ВНЕ функции идеально работает, но как только выношу его в функцию — перестаёт работать.

Что это — глюк самого PHP или глюк Simphony я так и не понял, пришлось немного модифицировать класс MySQLConnection и добавить туда метод возвращающий MySQL ресурс непосредственно, минуя всякие PHP обёртки, но осадочек все же остался...

 

Оставить комментарий