Jak použít PHP, když někdo neumí programovat v shellu?
19.1.2005 15:00 | Petr Zajíc | přečteno 34822×
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ě.
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.
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č "-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.
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: