PHP vlastně vůbec nemusí běžet na webu. Ačkoli jeho použití jinde je
velmi vzácné, PHP může běžet z příkazové řádky na běžném počítači.
Nemusí se tedy jednat o server a úkolem PHP nemusí být vytváření
dynamického obsahu stránek. Ale popořadě.
PHP a shell
Především - toto můžete vyzkoušet, pokud máte k dispozici
spustitelnou (CGI) verzi PHP. Jestliže máte PHP zkompilován a
zkonfigurován jako modul serveru Apache, nebude Vám fungovat nic z
toho, co budeme popisovat dále. To, zda máte PHP spuštěn jako CGI či
jako modul Apache poznáte z výstupu funkce phpinfo(). Pokud je v
obecných informacích uveden v položce Server
API údaj CGI/FastCGI,
máte
vyhráno a můžete číst dál. Pakliže tam máte uvedeno Apache 2.0 Handler
či něco podobného, běží vám PHP jako modul Apache a to jej pak nemůžete
spouštět z příkazové řádky.
Což neznamená, že musíte zoufat. PHP je navrženo tak, že Vám
umožňuje instalaci jak spustitelné verze, tak i modulu na jednom
stroji. Takže, pokud pracujete na Linuxu, můžete zkusit štěstí a
vyhledat spustitelnou verzi PHP příkazem:
whereis php
Pakliže jste na Windows, můžete podobnou věc zkusit pomocí:
dir php.exe /s
V obou případech se Vám může podařit najít binárku PHP a tu pak
můžete vesele spustit (máte-li k tomu dostatečná práva). Některé
distribuce totiž instalují obě verze PHP - modulovou i spustitelnou.
Primitivní příklad
Jestliže existuje v systému binární soubor PHP, můžete napsat
"systémový" skript v PHP! Abyste viděli jak na to, použijeme jako
příklad
následující protřelý ;-)) shellový skript, který se pokusíme přepsat do
PHP:
#!/bin/sh
echo "Jsem to ale chytrej skript"
Kód je to velmi triviální - jen dodejme, že v tomto skriptu značí
echo vestavěný příkaz shellu.
Jeho spuštění samozřejmě vypíše text na standardní výstup. Do PHP se dá
přepsat velice jednoduše - prostě do první řádky napíšeme cestu k
binárnímu souboru PHP (a nastavíme soubor jako spustitelný) a zbytek
přepíšeme podle platné syntaxe PHP. Takže z toho bude něco ve smyslu:
#!/usr/bin/php
<?
echo "Jsem
to ale chytrej skript";
?>
Co je jinak? Především, sdělili jsme milému shellu, že má ke
spuštění skriptu použít php, to je ten první řádek. Potom, zbytek
skriptu musí mít platnou systaxi PHP - takže blok PHP kódu bude uzavřen
do odpovídajících závorek, řádky budou ukončeny středníky a tak dále. V
tomto případě je samozřejmě příkaz echo interpretován pomocí PHP,
nikoli pomocí shellu.
Pozn.: Když máte php jinde než v
/usr/bin/php, budete si muset první řádek skriptu odpovídajícím
způsobem upravit.
Pakliže to zkusíte spustit, nedopadne výsledek podle očekávání.
Namísto toho, aby se příkaz prostě provedl, vypsal co má a ukončil
nejspíš uvidíte něco jako:
Content-type: text/html
X-Powered-By: PHP/4.3.9
Sem to ale chytrej skript
Kde je chyba? Chyba není nikde, pouze PHP se snaží generovat
odpovídající hlavičky pro prohlížeč. Ty však v příkazové řádce nemají
využití a dají se potlačit pomocí přepínače "-q". Pro úplnost dodejme,
že tento přepínač lze použít v prvním řádku skriptu, který pak bude
vypadat takto:
#!/usr/bin/php -q
a celý skript bude dělat přesně to, co předpokládáme.
Přepínače a tipy
Přepínač "-q" není jediný, který můžeme při volání PHP z příkazové
řádky použít. Na stránkách
PHP je k dispozici tabulka s ostatními přepínači. Tak například
přepínač "-i" způsobí, že obdržíme výstup stejný, jako kdybychom
zavolali funkci phpinfo(). Volbou "-s" obdržíme výstup obarveného kódu,
jako kdybychom jej "prohnali" funkcí show_source.
Konečně další důležitá volba je "-f", která hledá v souboru chyby
syntaxe.
Dobrý tip pro použití řádkového PHP je třeba přesměrovat výstup do
souboru. Provede se to standardními prostředky operačního systému.
Takže, napíšete-li například něco ve smyslu:
php -i >>~/test.htm
vznikne vám v domovském adresáři de facto stejná html stránka, jakou
byste získali pomocí funkce phpinfo() a následným uložením zdrojového
kódu stránky, pokud by se tato činnost prováděla na serveru. Použitím
filtrů můžete získat jen část výstupu, ve smyslu:
php -i | grep "Server
API"
a použitím dalších technik lze docílit výsledků, jakých byste
docílili s klasickými příkazy shellu. Můžete třebas takto napsané
skripty spouštět pomocí příkazů at
a cron a tak dále.
Závěr
K čemu je spouštění PHP skriptů bez serveru dobré? Ačkoli by se
mohlo zdát, že k ničemu, v praxi se to přece jen někdy používá. Vybavil
bych si dva příklady:
- Když někdo neumí programovat v shellu, ale umí v PHP a potřebuje
rychle napsat nějaký shellový skript. Kvůli jednomu skriptu se asi
nikdo nebude chtít učit jiný jazyk, takže tohle je dobrá záchrana.
- Když se má zajistit, aby se určitý PHP skript spouštěl v nějakou
dobu. Může se jednat třeba o skript, který provede denní údržbu
databáze a podobně. Ten skript může klidně fungovat jako součást
existujícího webu s tím, že pro účely automatického zálohování bude
spouštěn pomocí binárního (CGI) modulu PHP.