Valery's Mlog

Mindlog of a Freak

Archive for the ‘Development’ Category

November 5th, 2006 by Valery Dachev

Chalga-Man

Благодарение на Julie Lerman (лектор на DevReach) разбрахме, че се издирва емблематичният български програмист Светлин “The Chalga-Man” Наков. След като е бил награден от президента на Република България, е забелязван и документиран нееднократно да пропива наградата и мята гюбеци под звуците на Манго Намбър Файв в някоя квартална кръчма, от където е докарал и прозвището си. Ако някой го забележи, да се обади незабавно в най-близката психиатрия. :P

June 24th, 2006 by Valery Dachev

MS Days 2006

Събитието се състоя в изминалите вече 21во и 23то число на месеца на територията на кино Арена-Младост. Посещаемостта надмина всичките ми очаквания, а предполагам и тези на организаторите. Макар и резервирано цялото, киното едвам се справи с над 1700 тикви. Клекна и разработената специално за случая система. Организацията бе??е добра, въпреки натовареността на събитието – като изключим блъсканицата при регистрацията, блъсканицата за сутри??ното кафе, блъсканицата за обяд, блъсканицата за feedback, блъсканицата за безплатен филм/мач, блъсканицата за награди… и въобще… блъсканицата. Лекциите иначе бяха добри. Новото бе??е съвсем свободния избор на сесия и лекция. Духът като цяло бе??е приповдигнат, вероятно защото и познатите физиономии бяха не малко. Събитието придвидливо бе сложено в дните преди заплата, а кетърингът бе??е много много приличен, за да може гладните мечки да поиграят хоро. :-P Противно на очакванията ми да се раздават DVDта с Windows Vista beta 2, подаръците бяха два безплатни билета за Арена до края на септември. ??наче първата вечер имахме възможност съвсем безплатно на питие и пуканки да гледаме филм или футболен мач. С Драо се прецакахме да гледаме The Omen (2006). Дано много други да се прецакат, че да не се чувствам прекаран само аз. Чувството се доближава до това след War of The Worlds (2005). Ултра кух филм. Здраве да е…

Сега сериозно… Темите бяха интригуващи, наистина. А и, слава Богу, въведението на Теодор Милев този път бе??е кратко и набързо започнахме по същество. Наблегнах на сесията за разработчици и логично изборът за първа лекция падна върху “Бъдещето на софтуерните фабрики във Microsoft Visual Studio 2005 Team System” на Мартин Кулов. Основната теза бе, че софтуерните фабрики са чудото, което ще реализира мечтата за reusability на кода. До колко това ще стане, времето ще покаже. Скептик съм по отно??ение на поредната мана небесна, защото проблемът за мен не е технологичен. Все още съм поддръжник на свободния софтуер. Мисля си дали кодът на един продукт не трябва да има някаква давност, след която авторът му да е длъжен да го отвори. Заради тази затвореност понякога хората преоткриват неща, които са написани отдавна. За разнообразие ре??ихме да чуем и “Въведение в Microsoft Exchange Server 2007” на Владимир Александров, може би основно защото лекторът е атрактивен (съдейки по представянето на последния Microsoft ISA Server по време на дните на Microsoft във ФМ?? преди известно време). Хората са преоткрили конзолите, администрацията е улеснена, нова архитектура за “изстрелване на совалки” и още бла-бла… Така или иначе, надявам се, няма да ми се налага да базирам ре??ения на нещо подобно. От фанатизъм. Точно след обилният почти свински коктейл-обяд (само заради нас няколко програмисти сигурно са останали гладни :)) последва отново Мартин Кулов с лекцията за “Подобряване бързодействието и качеството на приложенията с Microsoft Visual Studio 2005 Team Edition for Software Testers“. С други думи, разбрахме как да натоварим един сайт с добре зададени custom заявки и да гледаме как пада. Добре, че не е отделен инструмент, защото със сигурност някой добре би интегрирал тази сладост в някой свой вирус. :) Темата за “Microsoft Visual Studio Team Suite: Архитектура на SOA-базирани приложения на практика” подхвана Бранимир Гюров (от холандската фирма Ти-Ри-Ри-Рам или нещо подобно). Започна да ми намирисва на изгоряло… от UML. Хората са минали много напред с материала и моделирането на една система е станало играчка с ми??ка за един кадърен архитект. На следващата сутрин започнахме със “Запълването на пропастта между създателите на един софтуер и хората, които ще го администрират” на Владимир Чалков – един от също впечатляващите лектори. В думите му припознах честа комуникация между поддръжката и програмистите във фирмата ни. ??наче успяхме да направим един простичък пример support-friendly. Ужас ! Сетих се за факта, че ASP.NET рестартира приложението, в момента в който от директориите му изчезне файл (било то и временен записан от самото приложение). ?? ах как се дразня на това, че сесиите изтичат в произволни моменти, макар да са с Timeout от 60 мин. … От там минахме към “Сигурност с WinFX: Identity 2.0 и InfoCard” на Цъфа и колегите му. Много радващо проведоха презентацията си. Евалата ! Разбрах, че WinFX става .NET 3.0. Харесват ми и идеите за Identity 2.0, но не знам колко сайтове ще се възползват от това, което се предлага. Като цяло преходът към Web 2.0 ми изглежда като прехода от IPv4 към IPv6… Поне докато не изпукат тези, дето правят сайтовете си “както баба знае, както баба бае”. “Разработката на мобилни ре??ения с .NET Compact Framework” бе представена от Тихомир ??гнатов и Руслан Трифонов. Най-хубавото, което направиха хората, е, че разсеяха представата за мобилните приложения като игрички и органайзъри. А иначе Microsoft наистина са се постарали като среда и предстарали в създаването на мобилна версия на своя SQL Server. Браво де – не спят. За финал бе??е очакваната от мен “WWF, WCF или кактрибуквените съкращения помагат за създаването на сайта за регистрация….” на Владимир Чалков. За мое удоволствие лекцията бе??е по-концептуално насочена и подкрепена с доста примери. С инструментите в .NET 3.0 архитектите и разработчиците се доближават на броени крачки разстояние. Всичко изглежда толкова ??арено и лесно. Мислих си, че блок-схемите са отживелица, а те са се преродили във вида на workflows. Въобще видях някакви зароди??ни в мен идеи вече реализирани. Яд ме хваща, че в други операционни системи такива инструменти за разработка не съществуват… или поне аз не знам за такива. Притеснява ме този Microsoft-центризъм…

P.S. За сметка на MS Days 2006, пропуснах семинара на LUG-BG – нещо, което пропуснах да отбележа. Освен факта, че трябва??е да обърна внимание на софийските си колеги, докато бяха в Казанлък по това време, бях разочарован от липсата на лекции и лектори. Яд ме е, че интересът като че ли намалява. Надявам се да е за сметка на OpenFest. Все пак съм си наумил до следващия LUG-BG семинар да разуча малко материали и да на базата на получените знания да направя някоя интересна лекцийка. Смятам да скалъпя едно Mono-базирано desktop приложение за обработка на ID3/ID3v2 тагове, с помощта на MonoDevelop. Ще видя разуча и работата с бози-данни и разработката на ASP.NET приложения, така че да направя някакво индексиране. Ако така компилираното чудо успее да заживее и на Windows ма??ина, ще е страхотно постижение. А защо не и обратното ? Но.. да не говоря предварително.

April 16th, 2006 by Valery Dachev

Ден на Microsoft в СУ

Знаех си, че ще прибера поне някоя книжка от днешния семинар на Microsoft. Всъщност, освен с Assessing Network Security, се сдобих с Microsoft Visual Studio 2005 Professional Edition (наред с Standard Edition от предния семинар, който посетих), още едно копие на Microsoft SQL Server 2005 Standard Edition, както и още едно копие на MSDN Library. Така и не подариха един легален Windows XP ! :) За сметка на това си имам DVDта с февруарската бета-версия на Microsoft Windows Vista (за x86 и x64) и със spam-dvd с информация за Imagine Cup 2006. Имали бол, дали… :-P

Повечето лекции бяха зарибяващи. Снощи писах тук за AJAX и само в заключение споменах проекта Atlas (с който всъщност се запознах съвсем бегло преди няколко дни). Една от лекциите днес бе посветена на него. Очертава се той да бъде една голяма крачка за ASP.NET в посока Web 2.0. Учудваща лекота за работа и моментално превръщане на един съвсем обикновен сайт в значително по-интерактивен, при това без никакво познаване на JavaScript. Нещо подобно може да бъде намерено и сред компонентите на Telerik. Последните като че ли разучават възможностите за интегриране на Atlas в .NET Framework 2.0 имплементацията си…

Другата доста любопитна за мен лекция бе на Стефан Добрев и Деян Варчев посветена на LINQ – проект в ранен beta стадий, чиято цел е да унифицира и значително да олесни достъпа до данни съхранявани в обикновени колекции от обекти, SQL бази (DLinq), в XML файлове (XLinq)… Това става със значителни разширения в синтаксиса на C# и VB (както и компилаторите им). Част от нещата, които вероятно ще се появят в C# 3.0 и респективно в .NET Framework 3.0, са:

  • локални обекти от анонимен клас (зависещ от инициализацията на обекта);
  • разширяващи методи, които дават възможност за добавяне на статични методи към съществуващ клас, без той да бъде онаследяван;
  • ламбда-изрази;
  • инициализация на обекти и колекции без нужда от извикване на конструктор;
  • анонимни типове и възможност за създаването им с new;
  • масиви от имплицитно зададен тип (според инициализацията им);
  • не на последно място са query-изразите – SQL-подобни изрази за извличане на данни от различни източници;
  • неописаните в PDC 2005 Technology Preview изразни дървета;

Въобще множество нови заклинания оптимизиращи старите. Просто великолепно !

Иначе имаше представяне на възможностите на ISA Server 2006, Windows 2003, Windows Vista, WinFX… али-бали… всякакви неща, които (не мога да си изкривя душата) показват, че Microsoft дърпат напред. Този път нямаше запой ! :(

P.S. За пореден път оставам замислен за миродавността на аналогията между морското свинче и жената-програмист…

April 16th, 2006 by Valery Dachev

PHP: AJAX

Ще започна от това що е и що не е AJAX…

  • е “Asynchronous JavaScript and XML”;
  • е технология;
  • не е конкретен софтуер;
  • не е панацеа;

Имплементациите на AJAX придобиха много широка популярност в последно време… Най-очеизваден и често даван пример за използване на AJAX са много от услугите на Google: предложенията изскачащи при попълването на полето за търсене в Google Suggest, целият Gmail… Основната цел на AJAX е да създаде по-динамично web приложение без да се налага презареждане на цялата страница. На мен например ми се наложи със списъка с блогове, където цялата първа страница, заедно с въведенията към публикациите достигаше до 600 kB. Това, което спестих е въведението, което въобще излезе от кода и вече се зарежда, само когато е нужно. Спестих трафик на потребителите и със спестеното посетителите, които са на трафик, могат да ме почерпят. :) Иначе има някои страшно мазни демонстрацийки: AJAX Шах, PHP+AJAX Chat Server, Upload Progress Meter, Странички с AJAX… Е, за пълната мазнотия се препоръчва CSS2 поддръжка.

Всяка имплементация на AJAX има своята клиентска и сървърна част. От потребителска страна е нужена основно JavaScript поддържка в браузъра (каквато има в повечето инсталирани такива). И това всъщност е основното изискване. Останалото е технологията от сървърна страна, която може да бъде всякаква: от чист HTML, през CGIки на Perl, Python… до PHP, ASP.NET и т.н.. Попаднах на два примера за съвсем простичка реализация на AJAX без всякакви допълнителни щуротии: тук и там. Разбира се, описаните подходи са малко несериозни, макар че на много места биха свършили страхотна работа. След огъня, колелото и картофите, цивилизацията достигна до XML. И тъй като напоследък всичко е XML, логично бе заявките от браузъра да се подават до сървърното приложение (каквото и да е то) през XML, давайки възможност от страната да стои каквото и да е обработващо XML. За целта в JavaScript се появи обектът XMLHttpRequest.

Аз обаче съм PHP, а не JavaScript, гуру (бах мааму и скромност!.. пошегувах се), а и всеки допир до последното ме кара да си мия ръцете с оцет. За щастие има и такива, които произнасят заклинанията си и на двата езика, като в резултат са се появили поне няколко свитъка (библиотеки, frameworks, все тая), чудесно систематизирани ето тук. В началото не повярвах, но после опитах… с AJAX Agent. За съжаление обаче, начинът, по който е написан ме изправи пред предопределени имена на променливите и почти никаква гъвкавост… а и нуждата все пак да поназнайвам JavaScript. Хубавото е, че позволява лесното реализиране на синхронни заявки. Те хората са си показали що може и що не в своите Cool Demos. Аз все пак се спрях на нещо друго: xajax. JavaScript-ът се кешира, работата е повече от елементарна, възможности за debugging, доста много примери и най-вече възможност за отделяне на презентацията от останалата логика, комуникация с повечето типове данни в PHP… Въобще… муцка ! :-P

AJAX е чудесно решение в кутийки за навигация например, за реализиране на потребителска кошница в е-магазин, за извършване на операции, за които не е необходимо потребителят да чака презареждането на цяла страница… AJAX обаче има един основен недостатък: същото съдържание не може да се възпроизведе само с помощта на URL (вярно е, че bgmaps.com демонстрират, как същият ефект може да се постигне и без AJAX, но това е друга тема…). От тук е и следствието, че AJAX трябва да се избягва за визуализация на основното съдържание на съответната страница…

… Опааа, 02:38 е ! Много се разприказвах…

P.S.: Casting spells in ASP.NET.

April 6th, 2006 by Valery Dachev

Багерист

Поводът е тази обява за работа. Вече не помня кой я подхвърли, но разговорът с Дени тръгна от там, че тръгнала да пи??е краткото есе на тема “Що станах JAVA програмист, като може??е да съм багерист”. След известно дискутиране, стигнахме до извода, че всъщност и двамата с нея сме багеристи:

  • нива – като дългогоди??ен селскостопанин на различни ниви съм копал – както на DOS, Windows и Linux, помагал съм и на *BSD и HP-UX ниви, но… в крайна сметка нивата си е нива и целта и е да дава възможно най-много и най-качествен мат’риал. За целта се използват различни…
  • семена – аз например съм садил C/C++, Perl, веднъж гледах и Java, напоследък предимно C#… С някои от тях човек може да си покъса нервите направо, поради тънкостите на отглеждането им, но те си имат своите бенефити. Работата се извър??ва върху различна…
  • почва – най-??ироко разпространени са Intel-оземните почви и техните производни. Не че няма и други, но често това е свързано с проблеми при отглеждането на специфични култури и използване на някои торове там. ??ма и ограничен брой почви с ограничена употреба, но пък за целите си вър??ат чудесна работа. Често обаче за отглеждането е необходимa специална…
  • наторителна ма??ина – при Java това е Java Virtual Machine, която е оптимизирана за използване на максималния възможен поливен ресурс, като изхожда от спецификата на Java семената да консумират всичко възможно. За съжаление, това е причината почвата да се изтощава лесно и да става трудно използваема за нещо друго. За сметка поливната ма??ина претендира, че инсталирана на друга почва, семената пак ще виреят. За същото претендира и .NET Framework, като това обаче са си само претенции на производителя и, доколкото поливната им ма??ината е разработена само за няколко вида ниви. ??ма ентусиасти обаче създаващи неин аналог наречен Mono (аналог и по претенции :)). В крайна сметка семена като Perl и PHP се оказват по почвонезависими. Освен всичко казано, от голяма важност е…
  • багерът – карал съм много и различни. Някои предлагат възможността за преораване, поливане и въобще всякаква обработка на семената чак до израстването им. Понякога, идиоти като мен, ползват съвсем простички уреди като vim, gcc… Напоследък обаче се обучих да ползвам трактор Visual Studio (наречен заради големите прозорци на кабината). Друг такъв, но специализиран за PHP, е Zend Studio (в духа на повсеместното лепване на рекламни стикери с надпис “Zend”). За Java пък масово се ползват трактори марка Eclipse и NetBeans (последният отразява спецификата на културата).

Ето затова аз не съм просто Java програмист, а тракторист ! :)

April 3rd, 2006 by Valery Dachev

Статични недоумици

Вчера цял ден (изключая гостите, което Аби ми направи, та междувременно да и помогна с някои неща в сайта и за конкурса) си блъсках главата как да преработя класовете, които задвижват списъка с блогове (това бе??е причината цял уийкенд да хвърчат гре??ки там). Хванах се да пренаписвам всичко на PHP5. ??мах едни много добри идеи за персистенцията на данни, но… стигнах до тъкмо две задънени улици.

Опитвам се да направя имплементация на Factory Design Pattern, като обектите се създават в статичен метод, чието ре??ение да зависи от класа на наследника, през който е извикан. Това като че ли се оказва невъзможно. Демонстрирам с пример:

class A
{
   public static function show()
   {
      // PROBLEM HERE
      echo 'Should show the corresponding class...';
   }
}
class B extends A
{
}
B::show();

В статичния метод A::show() нямам как да разбера дали методът е извикан чрез A::show() или чрез B::show(). След усърдно ровене из Google установих, че пряк начин това да стане просто няма. ??ма??е едно псевдо-ре??ение с помощта на debug_backtrace(), но ми изглежда тъпичко. С допълнително тормозене на на търсачките установих, че същият проблем съществува и в Java, и в C#… Свидетелски показания сочат, че проблемът не съществува в Delphi… тъпичко. Може би просто не трябва да правя наследяване на обектите, ами някакъв вид агрегация… току-що ми хрумна !

January 18th, 2006 by Valery Dachev

lighttpd + fastcgi + php

Както е известно, на??ата мрежа приютява може би най-големия webchat, който може да съществува. Написани от dzver на PHP и разчитащ изключително на javascript чат обаче товари ужасно. 800 постоянно висящи процеси (за всяка връзка по един) в Apache ядат безкрайно много памет и карат всеки сървър да клекне. След всички оптимизации на Apache и на ма??ината въобще, Mantra е като че ли неспособна да понесе повече. Затова тези дни тръгнах да експериментирам на гърба на горките потребители и тази вечер ще се види доколко съм успял.

Доколкото на ма??ината работят стра??но много сайтове с всевъзможни изисквания, модулите на Apache и раз??иренията на PHP са значително повече от тези идеално оптимизираното количество необходимо за самия webchat. Опитът показва, че всеки потребител заема около 3 Мб оперативна памет. Затова целта бе??е да пусна самия webchat някак отделно. В крайния вариант на установката съм се спрял на lighttpd и PHP стартирано от неговия FastCGI модул. На сайта на lighttpd могат да се намерят много полезни публикации за настройката на FastCGI и оптимизирането на сървъра. Ето и някои специфични настройки в lighttpd.conf със съответните коментари към тях:

### включен е само един единствен модул и това е FastCGI
server.modules              = (
           "mod_fastcgi",
)

### този ред увеличава максималния брой отворени файлови дескриптори на lighttpd
### и не включва тези на CGI програмите, които работят. за всеки случай тук са
### увеличени, макар това да се препоръчва само в случаите, когато в error.log на
### lighttpd се появят гре??ки от типа на "... accept() failed: Too many open files"
server.max-fds = 1024

### "Keepalive Requests" фунционалността дава възможност в рамките на една връзка
### да се обработят няколко заявки една след друга. Тъй като в самия webchat има
### доста картинки, давам възможност 10 от тях да се заредят една след друга.
server.max-keep-alive-requests  = 10

### макс. изчакване след обработка на заявка до подаването на следващата е 2 сек.
server.max-keep-alive-idle = 2

### този ред дава възможност lighttpd да си спести извикването на stat() функцията
### за всеки файл, като ке??ира състоянието му и го следи с помощта на FAM
### (http://savannah.nongnu.org/projects/fam/)
server.stat-cache-engine = "fam"

### проследяването на символичните връзки и проверката на правата за достъп до
### всеки клон, както и зациклянето на връзките, отнема време. ако няма такива,
### както е в случая, е добре тази функционалност да е изключена.
server.follow-symlink = "disable"

fastcgi.server              = (
        ".php" => ((
### следващите два реда указват съответно минималния и максималния брой
### стартирани FastCGI процеси. за PHP всяка от тези две стойности трябва да се
### умножи по стойността на PHP_FCGI_CHILDREN променливата, която, ако не е
### установена по-долу, има стойност по подразбиране - 8.
                "min-procs"             => 1,
                "max-procs"             => 1,
### това задава граничната бройка на чакащи заявки за един процес, за да
### се стартира друг, който да започне обработката. 1 не е добра стойност
### по принцип, но, заради незавър??ващите PHP процеси, не мога да си
### позволя заявки, които да ги изчакват
                "max-load-per-proc"     => 1,
### дава броя секунди, след които неизползван процес да замре. прекаленото
### намаляване на тази стойност води до увеличаване на натоварването при
### непостоянна честота на заявките. увеличаването и пък води до прекалено
### използване на системните ресурси, така че трябва да се търси баланс
                "idle-timeout"          => 10,
                "socket"                => "/tmp/php-fastcgi.sock",
### тази настройка изключва проверката за съществуване на документа преди
### подаването му към скрипта. от една страна наличието на тази настройка е
### добре, защото не се задейства изли??но PHP процес, който да обработва
### нещо несъществуващо. от друга изключването на проверката спестява
### извикването на stat() за съответния файл. добре е да е изключен при малък
### брой обръщения към несъществуващи документи (с това раз??ирение)
                "check-local"           => "disable",
### към извикването на PHP интерпретатора е подаден допълнителен параметър
### за пътя към специфичния за сървъра php.ini файл.
                "bin-path"              => "/usr/bin/php5-cgi -c /path/to/php.ini",
                "bin-environment" => (
### следват настройки на самото PHP. първата променлива на средата определя
### броя PHP процеси, които да се пуснат. в моя случай бройката е по-голяма,
### броят висящи процеси е минимум броя на online потребителите. втората
### променлива определя броя заявки, които PHP процесът да обработи преди
### да погине. кончината му води до автомагично разчистване на използваната
### от него памет, но и до малко натоварване необходимо за стартиране на нов
### процес
                        "PHP_FCGI_CHILDREN" => "1024",
                        "PHP_FCGI_MAX_REQUESTS" => "40"
                )
        ))
)
January 9th, 2006 by Valery Dachev

Записки по Apache, PHP и eAccelerator

Днес се хванах най-накрая да обновя PHP на ма??ината си, което бях замразил на 5.0.4(-3 в Debian), заради проблемите с референциите, които се пръкваха във всевъзможен софтуер. Гре??ки от типа на “Fatal error: Only variables can be passed by reference in…” останаха само в инсталирания от пакет SquirrelMail 1.4.5(-2), които поправих наръка. ??нсталирах PHP 5.0.5(-3). На пръв поглед – никакви проблеми. Два сайта обаче прописнаха, че не работи file upload. Явно някакъв проблем с функциите за качване на файлове. ?? то мълчалив, просто защото файловете не се копират…

Проблемът бе оправен радикално – PHP 5.1.1(-1) от Debian Unstable. Ето тук започнаха големите мъки. Старият стабилен eAccelerator 0.9.3 явно е поизостанал с промените в PHP. Около версия 5.0.1 на PHP е garbage manager-ът е изваден от Zend Engine, а някои оп-кодове ползвани от оптимизатора са преименувани/премахнати. За първото просто затрих редовете работещи с garbage от content.c, а самият eAccelerator компилирах без оптимизатора – така или иначе ползвам само криптиращата част. Задънена улица: Apache 1.3 и Apache 2 трещят със “Segmentation fault“. Не съм фен да debug-вам Apache, sorry.

Последната излязла версия на eAccelerator е 0.9.4rc1. Че и тази версия не се компилира е ясно. Нанесох същите промени, пак стигнах до задънена улица: “[eAccelerator] Can not create shared memory area“. Нулирах големината отбелязана от променливата eaccelerator.shm_size и като че ли запали. Първият отворен сайт с PHP накара съответния child процес на Apache да изплюе “Segmentation fault“.

??звод: Да не правя ъпгрейди за глупости, защото никога не е ясно дали ще се оправя след това с тях. Търси се безплатна алтернатива на eAccelerator…

January 6th, 2006 by Valery Dachev

VS.NET: Property Debugging Hell

Цял следобед изкарах да си блъскам главата в странните и противоречиви резултати от debugging-а на мой код. Оказа се, че причината за това е в опитите ми да видя стойността, която някое Property връща. Благодарение на това се изпълнява целия код зад get-блока му и ми се оплита цялата на приложението. Трябва да поровя, за да видя дали няма начин да го изключа, за да правя подобни грешки…

November 5th, 2005 by Valery Dachev

PHP референции

PHP 5.0.5 излезе преди точно два месеца. Влизането на тази версия Debian (testing и unstable) бе форсирано, въпреки всичките проблеми, които излязоха наяве. Това направи по-старите версии недостъпни по сървърите. Целият хаос, който се създаде, обаче е заради несъобразителността на разработчиците и първоначалната толерантност на PHP към гре??ките им. За да има някаква съвместимост с преди??ни версии, има опции, с които да се поддържа този толеранс. Част от проблемите при работата на различен PHP софтуер са пряк резултат от неразбирането на разработчиците на референциите в PHP. Те са аналог на указателите в други езици и на Perl-референциите. Референциите се указват със знака амперсанд (&) пред доларовия знак за променлива. Ако в декларацията на дадена функция се укаже, че някой от аргументите е референция, то от там насетне се работи със съдържанието на реално подадената променлива, а не с копието и. Това дава две сериозни предимства:

  • не се прави копие на съдържанието на променливата при извикване на функцията. Това е особено важно, когато променливата съдържа големи по обем данни (например съдържанието на файл), защото спестява паметта необходима за копието, както и натоварването от самото копиране;
  • промяната на съдържанието се отразява и в контекста, където е извикана функцията, без да се налага тя да се връща като резултат;

Ще илюстрирам най-честите гре??ки, станали причина за това писание:

<?
    // NOTE: first parameter is a reference to the variable, not the variable itself
    function display( &$arr )
    {
       var_dump( $arr );
    }
    function &explode1( $delimiter, $str )
    {
       return explode( $delimiter, $str );
    }
    $str = ’1|2|3′;
    $exploded = explode( ‘|’, $str );
    // ERROR: the result of a function can’t be referenced
    //! display( explode( ‘|’, $str ) );
    // WARNING: old syntax. references can now declared in function declarations only.
    //! display( &$exploded );
    // CORRECT: the variable $tmp holds the result, so we can pass it
    display( $tmp = explode( ‘|’, $str ) );
    // CORRECT: $exploded variable can be references
    display( $exploded );
    // CORRECT: the result of explode1() is declared to be a reference
    display( explode1( ‘|’, $str ) );
?>

Промяната в PHP 5.0.5 е, че първото извикване предизвиква гре??ка "Fatal error: Only variables can be passed by reference in…". Всъщност това е правилното поведение, защото резултатът от функцията не може да бъде достигнат с референция, макар в по-стари версии това да работе??е. При последния пример това обаче работи, функцията explode1() връща референция, която може директно да се подаде като аргумент на display(). Това е и най-често допусканата гре??ка в редица софтуер… като например SquirrelMail, Drupal, phpBB, много PEAR библиотеки и какво ли още не… Ре??ението е, или да се изчакат по-нови версии на софтуера, или да се запази по-старата PHP версия. ??стинска срамота е обаче за квалифицирани програмисти да проявяват такова неразбиране. На всичко отгоре имам и сериозното подозрение, че документацията на част от вградените в PHP функции не показва, че част от аргументите им трябва да са референции.

Примерът със стария синтаксис, в зависимост от настройките на самото PHP може да доведе до предупреждение "Call-time pass-by-reference has been deprecated – argument passed by value". Това означава, че поведението ще е различно от очакваното. Причината за това предупреждение е изключването или липсата на опцията "allow_call_time_pass_reference" в php.ini.

За съжаление обаче, тази промяна в PHP 5.0.5 поставя доста несъвместимости с по-стар или несъобразен PHP софтуер. Аз лично извадих късмет, че имам старите пакети (PHP 5.0.4) във /var/cache/apt/archives. Не знам какво ще правя по-нататък…