PHP » MyEgo.cz - Radek Hulán webzine

MyEgo.cz

home foto blogy mywindows.cz kontakt

SQLite nebo MySQL?

SQLite

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?

7 příspěvky PHP 19.10.2004

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

PHPEclipse

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)

4 příspěvky PHP 18.10.2004

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 a http://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 a mod_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

4 příspěvky PHP 07.10.2004

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

6 příspěvky PHP 16.08.2004

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í.