Dotaz: Skloňování a synonyma (v PHP)
Pro jeden projekt potřebuji získat pro každé slovo nejen databázi všech jeho možných tvarů, ale i synonyma. Takže třeba pro slovo "zelená" získat i tvary "zelený", "zelené" a další, pro slovo "gauč" získat ekvivalentní "sedací souprava". Potřeboval bych ideálně poznat i kořen slova.
Zkoušel jsem pspell_suggest
a podobné funkce v PHP, ale jsou zcela nespolehlivé, české slovníkové podklady pspellu jsou strašné.
Teoreticky by šel vzít slovník třeba z OpenOffice.org, převést jej do databázové podoby a používat alespoň pro ona synonyma.
Řešil jste někdo podobný problém?
Automatické ukládání a obnova libovolných HTML formulářů pomocí jQuery
Pro jednoho klienta dodáváme analyticky i programátorsky hodně zajímavý projekt - Monitoring druhů. Jedná se o sledování parametrů u stovek druhů, přičemž každý druh má nejen velice rozsáhlou, ale také rozdílnou množinu často unikátních parametrů. Realizace je provedena pomocí uživatelské definice formulářů administrátorem systému. Tyto formuláře používají před-definované datové typy, číselníky, našeptávače, subformuláře (včetně neomezeného zanořování) a další prvky. Veškeré hodnoty mohou mít jak 1:1, tak 1:N relace, mohou být povinné či nepovinné. Data z těchto formulářů se ukládají jako XMLType do Oracle 10g.
Samotné řešení XML formulářů je tak zajímavé, že bude předmětem několika dalších článků, ale v tomto budu psát o něčem jiném - automatickém ukládání těchto formulářů při jejich editaci uživatelem.
Poslání embedované fotky v HTML emailu
Pokud posíláte email s obrázky klientům, máte v zásadě tři možnosti:
- odkázat se v HTML na váš externí server, čímž sice zmenšíte velikost emailu, ale email aplikace externí obrázky většinou blokují (takže se stránka zobrazí neúplná)
- dát obrázek jako přílohu emailu, jenže to také vyžaduje aktivitu klienta (kliknutí na obrázek)
- embedovat obrázky přímo do HTML
Ta poslední metoda je často ideální, protože typická emailová aplikace takovýto obrázek zobrazí bez jakékoliv požadované aktivity na straně příjemce.
Pro snadnou tvorbu takovéhoto emailu je možné použít třeba knihovnu phpMailer:
require("class.phpmailer.php");
$mail = new PHPMailer();
$mail->IsMail();
$mail->From="vas email";
$mail->FromName="vase jmeno";
$mail->AddAddress("prijemce email");
$mail->Subject = "Subjekt emailu";
$mail->IsHTML(true);
$mail->AddEmbeddedImage( '/dir/soubor.jpg', // lokalni soubor 'logoimg', // ID shodné s HTML 'fotografie.jpg', // zobrazený název souboru 'base64', 'image/jpeg'); // MIME typ
$mail->Body = "<p><img src=\"cid:logoimg\" /></p>";
$mail->AltBody="Fotografie";
$mail->Send();
Základem je uvedení anchoru v HTML pro daný obrázek, zde cid:logoimg
, na který se poté odkážete v metodě AddEmbeddedImage()
. Důležité je také správné uvedení MIME Type (pátý parametr) a volitelné jméno souboru (třetí parametr).
PHP skript pro posílání SMS z sms.sluzba.cz
Téměř identická služba ke KlikniaVolej.cz je i sms.sluzba.cz. Posílání SMS (na základě dokumentace z tohoto PDF) přes tuto bránu můžete v PHP zajistit třeba následovně:
$action = 'send';
$body = 'Text SMS zpravy';
$vars = array(
'msg' => $body,
'msisdn' => $telefon,
'act' => $action,
'login' => $username,
'auth' => md5(md5($passwd).$username.$action.substr($body,0,31))
);
$data = http_build_query($vars);
$url = '//smsgateapi.sluzba.cz/apipost10/sms';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, 180);
curl_setopt($ch, CURLOPT_HEADER , false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER , true);
curl_setopt($ch, CURLOPT_VERBOSE , false);
curl_setopt($ch, CURLOPT_POST , true);
curl_setopt($ch, CURLOPT_POSTFIELDS , $data);
$response = curl_exec($ch);
curl_close($ch);
PHP skript pro posílání SMS z KlikniaVolej.cz
KlikniaVolej.cz je služba pod hlavičkou MAFRA a.s. (iDNES), která umožňuje posílat SMS přes jejich webovou bránu s tím, že dostupné je i API pro aplikační napojení. API je opravdu triviální, popsané je v tomto PDF, jedná se o prostý POST na dané URL s několika položkami.
Máte následující proměnné obsahující vaše údaje k přihášení:
$username = přihlašovací jméno
$passwd = přihlašovací heslo
$sender = vaše jméno
$telefon = číslo, na které chcete poslat SMS
Poté odešlete SMS pomocí CURL následovně:
srand((double)microtime()*1000000);
$id = strval(time()).rand(0, 999); // jedinečné ID
$vars = array(
'user' => $username,
'number' => $telefon,
'sender' => $sender,
'text' => "Text SMS zpravy",
'encoding' => 'ascii',
'test' => '0',
'id' => $id,
'hash' => sha1( $username . ':' . $id . ':' . sha1($passwd) ),
'flash' => '0'
);
$data = http_build_query($vars);
$url = 'http://kavremote.mobil.cz:80/smsgateway.pl';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, 180);
curl_setopt($ch, CURLOPT_HEADER , false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER , true);
curl_setopt($ch, CURLOPT_VERBOSE , false);
curl_setopt($ch, CURLOPT_POST , true);
curl_setopt($ch, CURLOPT_POSTFIELDS , $data);
$response = curl_exec($ch);
curl_close($ch);
Hostujeme PHP aplikace na Windows (namísto Linuxu)
Naprostá většina webových programátorů v PHP / MySQL hostuje své aplikace na Linuxu, využívajíce LAMP platformu, nicméně vytvářejí je většinou na Windows. Řada z nich si nedokáže představit jiný postup. Tento článek by měl popsat výhody a nevýhody Windows hostingu pro PHP aplikace a zkušenosti s migrací aplikací mezi Apache -> IIS a MySQL -> SQL Server 2008.
Windows hosting versus Linux hosting (pro PHP)
Přestože osobně také preferuji na desktopu Windows (a aplikace pro ně), pro hostování PHP / MySQL aplikací jsem řadu let používal jen a pouze Linuxové webhostingy. Od spousty lidí nakonec stále není problém slyšet "axiom" na server patří Linux (aniž ovšem dodávají proč), a o Windows webhostingu vůbec neuvažují.
Výhody Windows 2008 Server hostingu
K přechodu na Windows hosting vás může přimět:
- potřeba využívat i jiné databáze než MySQL, například Microsoft SQL Server 2008, které mají lepší možnosti programování,
- potřeba provozovat současně PHP i ASP.NET aplikace na jednom serveru,
- pokud chcete hostovat větší množství domén, a vyplatí se vám tedy fyzický či virtualizovaný vlastní server, ale je pro vás (jako pro většinu lidí programujících na Windows) snazší administrovat si Windows 2008 Server než třeba Gentoo Linux,
- výrazná nespokojenost (podpořená zkušeností) s low-cost LAMP hostingy s "neomezeným" počtem domén, které se sice tváří jako ve všem nelimitované, ale v důsledku vás stojí spoustu nervů a zbytečného úsilí,
- potřeba ovlivnit nastavení serveru, které sdílená LAMP platforma nenabídne,
- snadná správa serveru i aplikací z Windows desktopu i mobilního telefonu,
- používání aplikací, které znáte z desktopu (správce souborů, editor, atd.), i pro práci na serveru,
- stabilní systém a "nezbořené" MySQL tabulky, jak je známe snad ze všech sdílených LAMP webhostingů.
SQL Server 2008 - dotaz pro vypsání parametrů tabulky
Jedna ze základních funkcí každého redakčního systému je editor číselníků. V každé aplikaci jich existuje spousta, a mají mezi sebou různé relace. Máme jej napsaný pro různé databáze, od MySQL, přes Oracle po SQL Server 2008.
V praxi to funguje tak, že se skript napojí na INFORMATION_SCHEME, načte si automaticky strukturu tabulky, datové typy, délky polí, autoincrementy, komentář k polím, přidá k tomu případné odkazy na jiné číselníky (třeba tabulka měst se odkazuje na tabulku krajů), a tyto umožní pohodlně editovat. Textová pole jsou samozřejmě zpracovávána WYSIWYG editorem. Je to prostě komfortní možnost jak rychle upravit parametry aplikace pro běžné uživatele.
V případě MySQL existuje INFORMATION_SCHEME.COLUMNS
tabulka, v níž je vše potřebné. Na SQL Server 2008 musíte použít poněkud složitější dotaz, a to třeba takovýto:
CREATE VIEW [dbo].[dbscheme] AS
SELECT t.name AS TabulkaNazev, c.colid AS SloupecPozice, c.name AS SloupecNazev, ISNULL(i.CHARACTER_MAXIMUM_LENGTH, i.NUMERIC_PRECISION) AS SloupecDelka, i.DATA_TYPE AS SloupecTyp, i.COLUMN_DEFAULT AS SloupecDefault, CAST(cd.value AS varchar(255)) AS SloupecPopis,
COLUMNPROPERTY(OBJECT_ID(i.TABLE_NAME), i.COLUMN_NAME, 'IsIdentity') AS IsIdentity
FROM sys.sysobjects AS t JOIN sys.syscolumns AS c ON c.id = t.id JOIN INFORMATION_SCHEMA.COLUMNS AS i ON i.TABLE_CATALOG = 'databáze' AND i.TABLE_SCHEMA = 'dbo' AND i.TABLE_NAME = t.name AND i.COLUMN_NAME = c.name LEFT JOIN sys.extended_properties AS cd ON cd.major_id = c.id AND cd.minor_id = c.colid AND cd.name = 'MS_Description'
WHERE t.type = 'u'
Výsledkem bude pohled, který vám nabídne název tabulky, jméno a datový typ sloupce, jeho defaultní hodnotu, velikost datového pole a description ke sloupci (SloupecPopis
), který následně můžete zobrazit uživateli jako textový popis (takže namísto technického itemid
aplikace vypisuje automaticky sloupec jako Číslo článku).
WinCache - výborný PHP akcelerátor od Microsoftu
Microsoft vydal finální verzi WinCache rozšíření pro PHP, což je akcelerátor podobné funkčnosti jako eAccelerator, XCache, Zend Optimizer+ či APC, jen dokonale optimalizovaný pro Windows, IIS7.x a PHP 5.2/5.3 provozované jako FastCGI modul.
Podle prvních reakcí na fóru to vypadá, že se WinCache rychlostně dostal před konkurenci, a kombinace PHP + IIS + WinCache by tak mohla být top platforma i pro hostování open-source PHP aplikací, nejen pro .NET. Dokumentace k WinCache je dostupná přímo na PHP.net.
Osobně vyzkouším nasadit WinCache na MyEgo.cz a dalších webech, a udělat srovnání na Zend Server CE.
Související: Hostujeme PHP aplikace na Windows (namísto Linuxu)
Zend Server (PHP) na Windows s SQL Server 1.1 driverem, kompilovaný pomocí VC8 (Visual Studio 2005)
Před nedávnem vydané PHP 5.3 je díky spolupráci Microsoftu a Zendu výrazně lépe optimalizované pro Windows než předchozí verze, a netýká se to jen nativní podpory pro kompilaci ve Visual Studiu 2008 či 2005 oproti stařičkému Visual Studiu 6.0 z roku 1998, v němž jako jediném dosud šla oficiálně zkompilovat verze PHP 5.2 a starší.
PHP je na Windows s IIS 7.5 provozováno zásadně jako FastCGI proces, a to nejlépe v kombinaci s nějakým kompilátorem do bytecode a optimalizátorem jako je Zend Optimizer+. Zend Optimizer+ je součástí speciální distribuce PHP od Zendu, která je zdarma dostupná pod názvem Zend Server CE. Na Windows rozhodně nepoužívejte běžné binárky z PHP.net.
Provozovat PHP na Windows většinou také znamená, že potřebujete nativně a co nejrychleji propojit PHP s SQL Server 2008 databázi. Microsoft nabízí na Codeplexu SQL Server Driver for PHP, což je rozšížení pro PHP, které je v současné verzi 1.1 tím nejlepším (z pohledu funkčnosti i rychlosti), jak propojit PHP s SQL Server 2005 / 2008 databázovým serverem.
Problém je pouze v tom, že zatímco Zend Server CE je kompilován ve Visual Studiu 2005 (VC8), tak SQL Server Driver for PHP se v binární podobě dodává jen jako VC6 anebo VC9. Naštěstí celý projekt na Codeplexu je dostupný včetně zdrojových kódů a není tedy problém si VC8 verzi zkompilovat.
Co budete potřebovat pro kompilaci?
- PHP 5.3 zdrojový kód
- bindlib_w32
- win32build
- SQL Server driver zdrojový kód
- Visual Studio 2005 (C++)
Jak migrovat z MySQL na Oracle 10g databázi + PHP
Před pár měsíci jsem zde popisoval 10 bodů jak migrovat z MySQL na SQL Server 2008 + IIS7 + PHP. SQL Server 2008 považuji za současnou nejlepší databázi. Pro jeden projekt si klient přál použít Oracle 10g (má v ní obrovské skladiště jiných dat), takže bylo nutné pracovat s etalonem a matkou všech databází, a to na úrovni poměrně starého OCI8 rozhraní v PHP verze 5.1.6.
Náš redační systém tak už běží na MySQL 4.x (mysql), MySQL 5.x (mysqli), SQLite 2.0, SQLite 3.0 (přes PDO), SQL Server 2008 databázi (přes sqlsrv) a nově i na Oracle 10g (přes oci8).
Práce s Oraclem je v PHP poměrně dobře zaběhnutá a stabilní, přesto se hodí sumarizace hlavních rozdílů, pokud předěláváte redakční systém (kromě doplnění databázového layeru) z MySQL na Oracle.
1. Neexistuje LIMIT start, offset
Podobně jako SQL Server, tak ani Oracle nemá pohodlné stránkování v SQL přes LIMIT start, offset
příkaz, jako umí (jinak velice primitivní) MySQL. Obejít se to dá ale snadno za použití sub-selectu a magické funkce ROWNUM, tedy obdoby ROW_NUMBER() z SQL Serveru:
SELECT * FROM ( SELECT ROWNUM as CisloSloupce, fieldsX ORDER BY fieldsY ) WHERE CisloSloupce BETWEEN ($offset+1) AND ($offset+$limit)
Dobré je upravit si vaši metodu pro SQL příkaz v databázovém layeru, která SQL dotaz s LIMIT klauzulí automaticky modifikuje na vnořený SELECT, takže se nemusí nic dalšího přepisovat v CMS.