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-memory
tabulky, 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.
Úprava PHP skriptů pro MySQL 4.1 (mysqli)
Včera jsem psal o tom, že skripty psané pro MySQL 4.0 (mysql
PHP
rozšíření) nejsou
kompatibilní s MySQL 4.1 a vyšší (mysqli
PHP rozšíření). Nicméně,
úprava aktuálních PHP skriptů tak, aby byly funkční s libovolnou verzí MySQL
a PHP, je vcelku triviální.
Upravil jsem pro použití MySQL 4.1.6-gamma i manuály pro kompilaci a instalaci Apache, MySQL a PHP:
- Instalace Apache 2.0.52, MySQL 4.6.1-gamma a PHP 5.0.2 na Windows,
- Kompilace Apache 2.0.52, MySQL 4.6.1-gamma a PHP 5.0.2 na Linuxu,
- Compile from source Apache 2.0.52, MySQL 4.6.1-gamma and PHP 5.0.2 on Linux.
Nemám rád PHP (MySQL 4.0 versus 4.1)!
Představte si, že v roce 2004 zhruba 95% hostingů na celém světě používá MySQL
4.0.x, nebo nižší (z těch, co MySQL podporují). V PHP se k MySQL 4.0 přistupuje
například takto (pro získání veškerých položek článku číslo 1
):
// MySQL 4.0.x a nizsi $resource = mysql_connect('localhost','root','heslo'); mysql_select_db('blogcms',$resource); $query = mysql_query( 'select * from items where id=1', $resource); if ($row = mysql_fetch_object($query)) { // zpracovani vysledku }
Jednoduché a funkční. Nicméně, pak si nainstalujete PHP 5 a MySQL 4.1.6-gamma,
která je oficiálně doporučená pro veškerý nový vývoj, a veškeré Vaše současné
skripty přestanou fungovat, přestože používáte jak mysql
(pro vezi
4.0 a nižší) PHP extension, tak mysqli
(pro vezi 4.1.2 a vyšší)
PHP extensions. Prostě Vaše skripty musíte přepsat na mysqli
, zpětná
kompatibilita s mysql
neexistuje, přestože by měla (dle dokumentace)
fungovat.
MySQL ve verzi 4.1.2 a vyšší změnila svůj interní komunikační protokol. Podporuje
také pár funkcí navíc, zejména nativně znakové sady jako je utf-8
a unicode
,
a umožňuje nativní české řazení podle utf-8
. To je sám o sobě dost
dobrý důvod proč na MySQL 4.1 přejít.
SEO URL znovu a lépe
Trochu jsem zkoumal SEO URL, tedy URL pěkná pro člověka i pro vyhledávače.
V současnosti je moderní používat URL typu http://domena.com/clanek/nazev-clanku
.
Tato SEO URL mají smysl jak pro vyhledávače, tak pro člověka, a mnohem lépe
se pamatují než index.php?id=a12d45eef789b
.
Jsou zde ale jisté nevýhody:
- Některé browsery, jmenovitě MSIE, načítají při shlédnutí článku CSS znovu,
nedrží je v cache, přestože již mají v cache CSS z domény, pokud je URL
/clanek/nazev-clanku
zpracováváno pomocí FilesMatch, tedy:
<FilesMatch "^clanek$">
ForceType application/x-httpd-php
</FilesMatch> - FilesMatch se nedá použít na Microsoftím IIS, umí jej jenom Apache, čímž se omezuje portabilita zdrojového kódu projektu, u open-source projektů je to poměrně závažná věc,
- Protože
http://domena.com/clanek/nazev-clanku
ahttp://domena.com/
jsou pro search-engines různé, nesčítá se jejich page-rank, pokud někdo odkazuje na článek, neposiluje tím přímo page-rank domény, a naopak.
Řešením je začít používat SEO URL typu:
http://domena.com/?clanek=nazev-clanku
Výhody?
- Není nutná podpora pro
.htaccess
amod_rewrite
. - Není nutná podpora FilesMatch, SEO URL budou tedy fungovat i na IIS.
- CSS nebude žádným browserem znovu načítáno.
- Pro vyhledávače by toto řešení mělo být ekvivalentní s FilesMatch řešením.
Implementuji tyto URL jako alternativní do BLOG:CMS…
Nastavte si lépe phpMyAdmin
phpMyAdmin 2.6.0 je jedna z nejužitečnějších PHP aplikací, pod GNU GPL licencí. Umožňuje spravovat vaše MySQL servery, a provádět na nich prakticky veškeré myslitelné operace.
Nová verze 2.6.0 má přepracované rozhraní, podporuje nativně češtinu v UTF-8
(cs-utf-8
), odstraňuje řadu bugů, a má nové funkce. Jednou z tradičních
funkcí phpMyAdmina je i vytváření relací mezi tabulkami, jejich popis, historie
SQL příkazů, bookmarky a export do PDF. Tyto funkce jsou, nicméně, v základu
zakázány. Jak je aktivovat?
V phpMyAdminu spusťte skript /scripts/create_tables.sql
, vytvoří
se Vám 7 tabulek, v nové databázi nazvané phpmyadmin, kam se budou dané informace
ukládat. Následně je nutné modifikovat soubor config.inc.php
:
// nastaveni URL na phpMyAdmina $cfg['PmaAbsoluteUri'] = 'http://localhost/myadmin/'; // nastaveni hesla $cfg['Servers'][$i]['auth_type'] = 'config'; $cfg['Servers'][$i]['user'] = 'root'; $cfg['Servers'][$i]['password'] = 'xxxxxx'; // nastavení relací pro PMA $cfg['Servers'][$i]['pmadb'] = 'phpmyadmin'; $cfg['Servers'][$i]['bookmarktable'] = 'pma_bookmark'; $cfg['Servers'][$i]['relation'] = 'pma_relation'; $cfg['Servers'][$i]['table_info'] = 'pma_table_info'; $cfg['Servers'][$i]['table_coords'] = 'pma_table_coords'; $cfg['Servers'][$i]['pdf_pages'] = 'pma_pdf_pages'; $cfg['Servers'][$i]['column_info'] = 'pma_column_info'; $cfg['Servers'][$i]['history'] = 'pma_history'; $cfg['Servers'][$i]['verbose_check'] = FALSE;
A můžeme doplnit i pár vizuálních úprav (odstranění loga), nastavení default jazyka a kódování, a zobrazování informací o běhu MySQL a PHP:
// persistent connections $cfg['PersistentConnections'] = TRUE; // nezobrazovat logo $cfg['LeftDisplayLogo'] = FALSE; // zobrazuj info o MySQL a PHP $cfg['ShowMysqlInfo'] = TRUE; $cfg['ShowMysqlVars'] = TRUE; $cfg['ShowPhpInfo'] = TRUE; // zobrazuj BLOBy $cfg['ShowBlob'] = TRUE; // default jazyk a charset $cfg['DefaultLang'] = 'cs-utf-8'; $cfg['DefaultCharset'] = 'utf-8';
Užitečné funkce pro PHP - díl 5.
Znáte CURL
PHP extension? Pokud ne, doporučuji se s ním seznámit, je to jedno
z nejužitečnějších (pro určité úkoly) PHP rozšíření pro práci na úrovni
http, https, ftp, gopher,
telnet, dict, file a ldap protokolů. Například tímto kódem jste schopni poslat
HTTP POST
request (tedy to samé, co se stane při stisknutí tlačítka SUBMIT formuláře).
// HTTT POST function postit(&$data,$url,$verbose){ $s=""; foreach($data as $key=>$val) { if (!empty($s)) $s.= '&'; $s.= $key.'='.urlencode($val); } // init $ch = curl_init($url); // set options curl_setopt($ch, CURLOPT_HTTP_VERSION, 1.0); curl_setopt($ch, CURLOPT_VERBOSE, $verbose); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 100); curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $s); // perform post $rr=curl_exec($ch); if ($verbose) echo $rr; curl_close($ch); }
// příklad použití $data['jmeno'] = 'Radek Hulan'; $data['komentar'] = 'Toto je komentar'; postit($data,'http://vase.domena.com',1);
Zajímavé je i použití parametru CURLOPT_PROXY
, například následovně:
$proxy = 'http://81.5.140.49:80'; curl_setopt($ch, CURLOPT_PROXY, $proxy);
Užitečné funkce pro PHP - díl 4.
Dnes jsem řešil takový zábavný problém, automatický převod cyriliky na latinku,
kvůli SEO URL, tedy aby to místo
Советский Союз
zcela automaticky vytvořilo sovetskij-sojuz
.
Fonetický přepis do latinky. A vyšla mi z toho tato funkce pro PHP, doufám, že se bude hodit i
ostatním:
$global_utf= explode(',', "КВ,кв,КС,кс,А,а,Б,б,Ц,ц,Д,д,Э,Е,е,Ф,ф,Г,г,Х,х,". "И,и,Й,й,К,к,Л,л,М,м,Н,н,О,о,П,п,Р,р,С,с,". "Т,т,У,у,В,в,В,в,Ы,ы,З,з,Ч,ч,Ш,ш,Щ,щ,Ж,ж,". "я,ь,ю,Ю"); $global_asc= explode(',', "Q,q,X,x,A,a,B,b,C,c,D,d,E,E,e,F,f,G,g,H,". "h,I,i,J,j,K,k,L,l,M,m,N,n,O,o,P,p,R,r,S,". "s,T,t,U,u,V,v,W,w,Y,y,Z,z,Ch,ch,Sh,sh,Sht,". "sht,Zh,zh,ja"); function utf2ascii($title){ global $global_utf,$global_asc; $i=0; foreach ($global_utf as $s) $title= str_replace(trim($s),trim($global_asc[$i++]),$title); return $title; }
Teď by bylo ještě zajímavé vyřešit takový fonetický přepis japonštiny, korejštiny a čínštiny :-)
PHP, setlocale(), strftime() a UTF-8
Tak tu řeším jeden problém s locale a češtinou v UTF-8
, a nemohu se
k tomu dopracovat.
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN'> <html><body> <?php setlocale(LC_TIME,$_GET['a']); header('Content-Type: text/html; charset=utf-8'); echo "<h1>".strftime("%A, %d.%m.%y",time())."</h1>"; ?> </body></html>
Problém je v tom, že pokud zadám do setlocale
cokoliv jiného než czech
, je vše
anglicky. Toto všechno nefunguje:
Czech_Czech Republic.UTF8 Czech_Czech Republic.65001 Czech_Czech Republic.UTF-8 cs_CZ.utf8 czech.65001 Czech_Czech Republic.UTF
Předpokládám, že řešení bude naprosto triviální, ale teď je prostě nevidím.
Možnost je napsat iconv('iso8859-2','utf-8',strftime(..))
,
ale to není řešení koncepční.