Zend’s PHP 5 Coding Contest - PRADO - Interval.cz
Na Interval.cz vyšel můj článek Zend’s PHP 5 Coding Contest - PRADO framework, který rozhodně doporučuji k přečtení, pokud PRADO neznáte.
Zend’s PHP 5 Coding Contest - Interval.cz
Na Interval.cz vyšel můj článek o Zend’s PHP 5 Coding Contest, první ze série pěti článků. S Vilémem Málkem jsem domluven i na napsání několika článků o JEditu a PHPEclipse.
PHP problém s mail()
Tedy, on to možná není ani tak problém s PHP, jako takový zajímavý problém (či bug?) skriptu. Podívejte se na tento kód:
$to = 'info@hulan.info'; $subject = 'New password requested'; $message = 'Hello Radek Hulan,'."\n". 'You have requested to have a new password '."\n". 'assigned to your account in the '."\n". 'discussion forum at http://forum.blogcms.com/. '."\n". 'Your new password is: abcdefgh'; $headers = 'From: BLOG:CMS <info@hulan.info>'."\n". 'Date: Sat, 13 Nov 2004 12:26:14 +0100'."\n". 'MIME-Version: 1.0'."\n". 'Content-transfer-encoding: 8bit'."\n". 'X-Mailer: PunBB Mailer'."\n". 'Content-Type: text/plain; charset=utf-8';
A nyní tento email pošleme:
mail($to, $subject, $message, $headers);
Vtip je v tom, že u mě na SUSE 9.1 s PHP 5.0.2 to email posílá, na xhost.cz s PHP 4.3.9 to email, rovněž posílá, ale na www.tojeono.cz s PHP 5.0.2 to email nepošle. Řešil jsem to s Ondřejem Svobodou asi hodinu, než nám to došlo, a přitom je to tak triviální…
A víte proč?
PHP: convert named entities to decimal Unicode
This script was written to overcome validation problems with RSS 0.9/1.0/2.0
and Atom 0.3 feeds which may not contain (X)HTML entities, otherwise widely
used. Usage is very simple, function entity_to_decimal_value() will return
a Unicode encoded string, with entities it does not recognise replaced for
spaces.
There are also other two useful functions, for converting (X)HTML entities
back to their original representation (makes < again <), and for Unicode
decoding of an URL string.
/* convert HTML entities back */ function unhtmlentities ($string) { $trans_tbl = get_html_translation_table (HTML_ENTITIES); $trans_tbl = array_flip ($trans_tbl); return strtr ($string, $trans_tbl); } /* decodes URL into Unicode string */ function unicode_decode($txt) { $txt = ereg_replace('%u0([[:alnum:]]{3})', '&#x\1;',$txt); $txt = ereg_replace('%([[:alnum:]]{2})', '&#x\1;',$txt); return urldecode($txt); }
GeSHi - obarvěte si svoje zdrojáky
Včera v noci, poté, co jedna milá kamarádka odešla domů k rodičům (musí zítra do školy), jsem se náhodou dostal ve dvě hodiny ráno na web GeSHi. GeSHi je prima věc, barevná. GeSHi umí obarvit automaticky Vaše zdrojáky v actionscript, ada, apache, asm, asp, bash, c, caddcl, cadlisp, cpp, css, delphi, geshi, html4strict, java, javascript, lisp, lua, nsis, oobas, pascal, perl, php-brief, php, python, qbasic, sql, vb, visualfoxpro, xml.
A ona GeSHi nejenom barví, ale rovněž, pokud ji k tomu mírně přinutíte, udělá třeba pro PHP funkce automaticky odkazy na manuál PHP. Dokonalé. Stejně se dá přinutit i k odkazům na HTML či CSS.
Použití je potom triviálně jednoduché, místo <pre> zadáte <pre language>.
Napsal jsem si k tomu samozřejmě plugin pro BLOG:CMS, pod názvem NP_GeSHi, funguje dvěma způsoby, buď při ukládání článku (parse-and-save), nebo online (realtime), používám přitom tu nej-geniálnější funkci PHP, tedy preg_replace_callback.
include('geshi.php'); class NP_Geshi extends NucleusPlugin { function parseString(&$content) { $keys=array('body','more'); foreach ($keys as $key) $content[$key] = preg_replace_callback ( '/<pre\s(.*?)>(.*?)<\/pre>/si', array(&$this,'replaceString'), $content[$key] ); } function replaceString($r){ global $DIR_PLUGINS; $geshi = new GeSHi($r[2],$r[1],$DIR_PLUGINS."geshi/"); $geshi->enable_classes(); $geshi->set_header_type(GESHI_HEADER_PRE); $geshi->set_overall_class('code'); $geshi->set_link_target($this->_linktarget); return $geshi->parse_code(); } } // NP_Geshi
Databázový layer
Představuji k volnému použití (licence GNU GPL) jednoduchý dababázový layer, který je určen pro MySQL 3.23 až 4.0 (mysql), MySQL 4.1 (mysqli), SQLite a PostgreSQL.
Tento layer je záměrně psán neobjektově. Proč? Je určen pro úpravu starých skriptů, které jsou natvrdo psány pro MySQL 4.0, aby co nejdříve fungovaly s DB-layerem (na libovolné open-source databázi).
Názvy funkcí layeru jsou navrženy tak, aby byly shodné se syntaxí MySQL funkcí,
jen místo mysql budete psát sql, tedy například místo mysql_connect budete
psát sql_connect. Teoreticky je tak možné na Vašem skriptu udělat
hromadný search-and-replace slov mysql_ na sql_,
a Vaše aplikace by měla fungovat s DB-layerem.
Pro nový vývoj je samozřejmě vhodnější použít DB-layer objektový, uvedu jej zde zítra.
Zdrojové kódy layeru jsou zde.
Použití layeru pro MySQL:
Typické použití pro MySQL 4.1 bude spočívat ve vytvoření souboru config.php s
tímto obsahem:
<?php include ('db.php'); $SQL_HOST='localhost'; // adresa DB $SQL_USERNAME='root'; // uzivatel $SQL_PASSWORD=''; // heslo $SQL_DATABASE='test'; // nazev databaze $SQL_TYPE=_MYSQL41; // typ databaze $SQL_PREFIX=''; // prefix tabulek ?>
Příklad pro SQLite:
<?php include ('db.php'); $SQL_DATABASE='/Dev/www/test.db'; // nazev souboru SQLite $SQL_TYPE=_SQLITE; // typ databaze $SQL_PREFIX=''; // prefix tabulek ?>
Prefix tabulek:
Uvedený skript počítá rovněž s prefixem tabulek. Ten je velice důležitý, typicky máte na web-hostingu povolenou jen jednu MySQL/PGSQL databázi, a potom je nezbytně nutné jednotlivé instalace stejné aplikace odlišit právě prefixem v názvech tabulek.
Použití tohoto skriptu?
Náš index.php může vypadat například takto, a bude fungovat na
MySQL 4.0, MySQL 4.1, SQLite a PostgreSQL:
<?php // DB layer include('config.php'); // pripojeni k DB sql_connect(true); // shutdown funkce register_shutdown_function('sql_disconnect'); // vlastni kod $query = sql_query( 'select * from '.sql_table('test') ); while ( $obj = sql_fetch_object($query) ) { // zpracovani vysledku } sql_free_result($query); ?>
Funkce SQLite se rozšiřují pomocí PHP
SQLite je ještě lepší, než jsem čekal. Nejenom má v 200KB podporu pro triggery a views, ale její SQL příkazy a funkce je díky integraci s PHP možno rozšiřovat o libovolné callbacky (na PHP funkce).
Pokud tedy SQLite nemá funkci UNIX_TIMESTAMP(), která převede
string na UNIX-like datum (počet sekund od 1.1.1970), tak si ji nadefinujete
v PHP, registrujete pro SQLite, a používáte ji potom zcela normálně ve Vašich
SQL příkazech.
Například takto můžete SQLite rozšířit o podporu pár funkcí, které oproti MySQL nativně nemá:
sqlite_create_function($db,'UNIX_TIMESTAMP','strtotime',1);
sqlite_create_function($db,'NOW','time',0);
sqlite_create_function($db,'DAYOFMONTH','_day',1);
sqlite_create_function($db,'MONTH','_month',1);
sqlite_create_function($db,'YEAR','_year',1);
sqlite_create_function($db,'SUBSTRING','substr',3);
function _day($time) {
return date("d",strtotime($time));
}
function _month($time) {
return date("m",strtotime($time));
}
function _year($time) {
return date("y",strtotime($time));
}
SQLite nebo MySQL?

V PHP 5 je zahrnuta nativní podpora pro SQLite.
SQLite je velice zajímavá databáze. MySQL 4.1 má 25MB, zatímco SQLite má jen 200KB (ano, dvěstě kilobajtů). Navíc, nemusíte ji
nijak instalovat, pokud máte PHP 5, máte i SQLite. Dlouho jsem tuto databázi ignoroval, nicméně, včera jsem si napsal databázový
layer pro BLOG:CMS, podporující MySQL 4.0 (mysql) a MySQL 4.1 (mysqli), a začal jsem přidávat i SQLite.
Musím říci, že SQLite je fantastická databáze. Jaké jsou její hlavní výhody?
- SQLite se nemusí instalovat, je integrována přímo v jádře PHP 5,
- SQLite umí to samé, co MySQL, a navíc má podporu pro transakce (což MySQL pro MyISAM engine nikoliv), views a triggery (!),
- SQLite umí
in-memorytabulky, což je fantastická věc pro dočasné tabulky a některé složitější operace, - SQLite má k dispozici nástroje jako SQLite Control Center, či SQLite Web Admin.
Je zde ovšem i pár nevýhod, nelze například použít FULLTEXT klíč, je nutné používat SELECT LIKE ‘%slovo%’,
a kromě verze 3.0 (kterou ale zase neumí PHP 5.0.2) zde není nativní podpora UTF-8 (což ostatně neumí ani MySQL 4.0, umí to až 4.1).
Každopádně, podpora pro triggery a views a velikost jen 200KB SQLite je dobrým důvodem, abych SQLite začal používat místo MySQL pro své projekty.
SQLite je prostě fantastická a efektivní “příruční databáze”, navíc pro SELECT příkazy má být rychlejší než MySQL.
PHP na Windows - CGI, FastCGI nebo modul?
Webdesignérská komunita se asi shodne na tom, že nejrychlejší implementace PHP pro Apache, z možností CGI, FastCGI a modulu, by měl být právě modul, protože PHP modul pro Apache je psán pro nativní API Apache 2.0 serveru. Odtud tedy ona rychlost…
CGI naopak v teorii znamená, že CGI skript musí při každém použití PHP vyhledat
a parserovat php.ini,
spustit php-cgi.exe a natahovat spousty dll knihoven (extensions).
To je pomalé, nicméně, vzhledem k tomu, že jsou stejně všechny dll knihovny
v RAM paměti, a vzhledem k výkonu testovacího stroje (3.2GHz Pentium-4/HT
procesor, 1GB RAM), nebude to zpoždění až tak zásadní.
FastCGI ovšem CGI zlepšuje v tom, že při startu Apache serveru spustí definovaný
počet php-cgi.exe procesů v paměti a nechá je běžet po celou dobu,
a při požadavku na PHP interpret jim tento dotaz předá ke zpracování.
Tolik tedy teorie. Rozhodl jsem se v praxi otestovat, jak je Apache/PHP kombo rychlé v reálném provozu v režimech CGI, FastCGI a modul.
Testoval jsem funkci, která 1000x za sebou provede vytvoření dlouhého řetezce znaků. Práce s textem je základem PHP.
PHPeclipse - splněný sen programátora / webdesignéra

O eclipse.org, open-source projektu v čele s IBM (podílí se na něm ale i Borland, SUSE, Red Hat, a mnozí další), každý již asi někdy slyšel. Eclipse.org je naprosto dokonalé vývojové prostředí, framework, multiplatformní, a to nejen pro Javu. Za pomocí pluginů je Eclipse možno rozšířit i o podporu například PHP, na což se zaměřuje projekt PHPeclipse.de.
Nutno říci, že Eclipse je skutečně dokonalé IDE. S editací PHP / CSS / SQL / XHTML zdrojového textu v editoru se to nedá srovnávat. Můžete používat PHP debugger, code browser Vám po stisku Ctrl+Space nabídne nejen vestavěné funkce PHP, ale i veškeré funkce, které si Vy deklarujete v include / require souborech, a jejich popis z PHPDoc kompatibilních komentářů (!), nabízí "Resource" a "Debug" perspektivu, real-time prohlížení PHP výstupu ve vestavěném browseru, real-time PHP parser, skvělou správu projektu, integrovanou spolupráci s CVS, včetně podpory pro ssh, přímý import projektu z CVS, podporu a code browser pro nejen PHP, ale i CSS (včetně CSS 2.0), XHTML, a SQL, a mraky dalších funkcí.
PHPEclipse je prostě splněný sen programátora / webdesignéra.
Instalace PHPeclipse a konfigurace debuggeru u celého tohoto komplexu je poněkud náročnější, ale vyplatí se.
Nejlepší na tom je, že tento skvělý projekt je k dispozici jako open-source. Projekt, se kterým se například Dreamweaver MX 2004, či FrontPage 2002 nemůže vůbec měřit. Nikdy. Tolik funkcí, skvěle podaných, prostě jiné IDE / Framework nenabídne.
