November 3, 2009

Otesánok – druhé meno pre vašu PHP aplikáciu?

PHP aplikácii, pluginov, rozšírení a iných skriptov, sa nám dnes po svete potuluje viac než dosť. Autor dostane nápad, napíše kód a hurá. Pekne mu funguje na jeho notebooku s 1 GB RAM a php.ini memory limitom zdvihnutým na 128 MB.

Milý autor si ani nevšimne, ako mu aplikácia rastie, kysne a žerie drahocenné kilobajty pamäte. Problém nastane, keď sa jeho Otesánok vyberie do sveta. Najskôr ho autor veľmi jemne a decentne zavestí na nejaký webhosting.

Lenže tu nastane problém. Server má povolených len 25 MB na skript. Otesánok dostane bolesti brucha a odmieta spustiť čokoľvek. Ešte horší prípad však nastane, keď sa takýchto Otesánkov zíde viac. Systémový administrátor rozverne povolil 128 MB RAM a Otesánkovia chrochtajú blahom. Vždy sa jeden zobudí, vygeneruje stránku a ide spať.

Lenže tu nastane druhý problém. Do serveru sa oprú roboti. Google, Yahoo, Microsoft a im podobná robotická zberba. Treba predsa zvyšovať SEO. Neštastníci. Oni zobudia všetkých Otesánkov naraz. Začne vojna o zdroje. Apache nestíha Otesánkov upratovať na swap. Zo swapu sa mu neustále vracajú a dožadujú sa ďalšej a ďalšej pamäte. Hrôza, des, zmar a load average 78.

Veď je to tak jednoduché zístiť, koľko vaša aplikácia spotrebuje pamäte:

echo memory_get_usage() . "\n";

Dokonca PHP prináša so sebou sledovanie celého priebehu vykonávania skriptu a môžete si vypísať, aké bolo maximum v spotrebe bajtov počas behu skriptu:

echo memory_get_peak_usage() . "\n";

Jednoduché, účinné. Monitorujte stav pamäte a nenechajte, aby sa vaša aplikácia zmenila na Otesánka.

Dokumentácia memory_get_usage, memory_get_peak_usage

August 26, 2009

Pre koho je Python?

Keď Guido začal dávať dohromady nový jazyk Python, mal už za sebou skúsenosti z návrhu jazyka ABC. Najdôležitejšim kritériom pre vývoj tohoto jazyka bola čitateľnosť. Guido potreboval jazyk, ktorý by bol jednoducho pochopiteľný aj pre bežných ľudí. O Pythone prehlasujú autority, že je to multi-paradigmový programovací jazyk a majú veru pravdu.

Python je objektový. V čase keď Python začínal, objektové programovanie už malo za sebou nejaký ten rok, ale stále bolo odsúvané na okraj záujmu. Dôkazom toho sú napríklad jazyky ako Perl a PHP, ktoré odsunuli objektovosť naneskôr a potom ju pracne doháňali. V Pythone je proste všetko objekt a hotovo.

Python obsahuje prvky funkcionálneho programovania. Môj osobný pocit z funkcionálneho programovania je, že vlastne myslíte naruby. Človek musí úplne prevrátiť myslenie, pokiaľ sa chce dostať z procedurálnej paradigmy na funkcionálnu. A oplatí sa to. Získate kratší, účinnejší a čitateľnejší kód. Je síce pravda, že čitateľ musí trochu rozumieť princípom funkcionálneho programovania, ale aj bežný používateľ počítača viacmenej pochopí význam. Dobrá lambda abstrakcia môže výrazne skrátiť kód.

Python umožňuje použiť Aspektovo orientované programovanie – AOP. Pokiaľ vám táto téma nie je ešte známa, odporúčam si vypočuť diel podcastu z Software Engineering Radio – Úvod do AOP. Podstatnou vlastnosťou AOP je lepšia modularizácia kódu, čo má za dôsledok lepšiu znovupoužíteľnosť kódu.

Python umožňuje lietať.

A kde teda začať? Určite treba navštíviť stránky venované Pythonu. A pre začiatočníkov rozhodne odporúčam nainštalovať si IPython shell, ktorý vám môže ušetriť množstvo času. Pre priaznivcov Eclipse odporúčam PyDev s nádherným debuggerom. Pre nepriaznivcov Eclipse odporúčam prostredie Eric, ale mali by ste zvážiť, či sa náhodou nestanete radšej priaznivcami Eclipse 😉

Nezabudnite si po spustení Python shellu zadať príkaz: import this

August 9, 2009

Ladenie PHP aplikácie v Eclipse

Eclipse je výborné IDE, ktoré môže ušetriť veľa času. Napríklad v prípade, že pracujete súčasne na projektoch vo viacerých jazykoch ako Java, Python, Perl, či nebodaj PHP. S konfiguráciou Eclipse a PDT pluginom som dlho nemal úspech. Vždy došlo k nejakej neočakávanej chybe. Problémy boli rôzne, nedostupný server, halušky v Eclipse. Ale to už bolo dávno. Tak som sa pustil do zisťovania, či sa v tomto smere niečo nezmenilo. Milé deti, zmenilo a k lepšiemu. 😉

Lokálne ladenie PHP aplikácie v Eclipse je brnkačka, nepotrebujete ani nainštalovaného Apache, či inú web potvoru. Postup je jednoduchý, ale zradný. Ak šliapnete mimo vyznačenej cesty, hrozí vám prepad do bažiny, kde vás zožerie nejaká chyba.

  1. stiahnite Eclipse for PHP developer (návod je písany na Eclipse 3.5)
  2. rozbaľte ho, vytvorí sa adresár eclipse (pre Windows odporúčam použiť na rozbaľovanie 7zip, natívny rozzipátor akosi nefunguje správne, aspoň mne nerozbalil všetko)
  3. doinštalujte Zend Debugger, EclipseHelpInstall new softwareAdd
  4. Name: PDT, URL: http://downloads.zend.com/pdt, Ok, vyberte Zend Debugger a pokračujte v inštalácii
  5. presvedčte sa, že po reštarte Eclipse máte zvolený správny debugger, EclipseWindowPreferencesPHPPHP Executables, mali by ste mať zvolené niečo ako PHP 5.2.9 CGI z adresára, kde je Eclipse

A hurá debuggovať. EclipseNewPHP Project – zadať Project name – Finish. Pozor! Ak dáte Next namiesto Finish, je možné, že skončíte s chybovým hlásením duplicated entry. Pravdepodobne chyba vo workflow.

Vytvorte si nový PHP súbor, napríklad pozdrav.php:

<?php
echo “Ahoj Georgik!”;
?>

Dvojkliknite na pásik panelu vľavo na riadku 2, čím nastavíte break point.

eclipse-php-break-poing

A môžeme s chuťou debuggovat. Pravý klik v editovacom okne – Debug asPHP script. Eclipse sa prepne do PHP Debug perspektívy a zastaví sa na break pointe. Ovládanie debuggera som už popisoval :-).

Takto nastavený Eclipse môžete použiť na lokálne ladenie. Nezabudnite používať vhodný framework na písanie PHP aplikácii. Skupina zubných lekárov odporúča framework Nette. 😉

Január 10, 2009

Odosielanie mailu s diakritikou z PHP

Narazil som na drobný problém pri odosielaní mailov z PHP. A síce, že maily s diakritikou chodili označené ako corrupted a nie veľmi čitateľné. Povedal, som si, že na odosielanie skúsim použiť triedy z Pear. Tu som narazil na prvý problém, že include Pear súborov, bol zablokovaný safe módom. Riešenie bolo jednoduché, stačilo pridať správne premenné do konfigurácie Apacha. Finta bola v tom, že adresár, kde sa nachádajú Pear kódy musí byť zároveň v open_basedir aj v safe_mode_include.

php_admin_value open_basedir /home/georgik/www:/usr/local/share/pear
php_admin_value safe_mode_include_dir /usr/local/share/pear

Pear síce nevyrišiel problém s odosielaním UTF-8 mailov, ale minimálne použitie tried v PHP prospieva k udržateľnosti kódu. To podstatné boli hlavičky, ktoré bolo nutné do e-mailu pridať.

Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit

No a celý kód vyzerá nasledovne.

/**
 * Send UTF-8 formated e-mail using PHP Pear Mail classes.
 * 
 * @param recipient E-mail address where you want to deliver e-mail.
 * @param subject Subject of e-mail.
 * @param text UTF-8 content of e-mail.
 */
function sendEmail($recipient, $subject, $text)
{
    include('Mail.php');
    include('Mail/mime.php');

    $mail = Mail::factory("mail");

    $headers = array(
        'From' => "priklad-z-blogu@asinus.cz",
        'Subject' => $subject,
        'Content-Type' => 'text/plain; charset=UTF-8; format=flowed',
        'Content-Transfer-Encoding' => '8bit',
    );

    $mime = new Mail_mime("\n");

    $mime->setTXTBody($text);

    $body = $mime->get( array ('head_charset' => 'UTF-8',
        'head_encoding' => 'quoted-printable',
        'text_charset' => 'UTF-8',
        'html_charset' => 'UTF-8'));

    $mail->send($recipient, $headers, $body);
}

sendEmail('objednavky@asinus.org', 'Objednavka',
          'Dobrý deň. Rád by som si u Vás objednal hosting a žinčicu. S pozdravom Janko Paľko z Malužinej');