Inhalt

 


Menü Ausschalten

MEngelke.de / Projekte / PHP Batch

Rocks 'n' Diamonds

Suchen Drucken eMail 

PHP Batch

PHP-Scripte werden normalerweise vom einen Webserver aus gestartet, aber es ist auch möglich diese direkt in der Eingabeaufforderung zu starten. Warum sollte man das tun? - PHP hat hervorragende Dateisystem-Funktionen, Reguläre Ausdrücke, einfache http-Funktionen und ist mit Modulen erweiterbar. Damit kein unnötiger HTML-Code ausgegeben wird, gibt es ein spezielle CLI-Version (Command Line Interface). Zusätzlich wird noch eine DLL-Datei (php4ts.dll bzw. php5ts.dll) benötigt, wo die Grundfunktionen von PHP enthalten sind. Dummerweise kann man PHP-Scripe nicht direkt starten. Unter Linux muß man nur in der ersten Zeile: #!/pfad/php eintragen und schon kann das Script direkt gestartet werden.

Beispiel:
#!/bin/php
<?php

 echo "Hello World!";

?>

Unter Windows geht das so nicht. Der normale weg, wäre über die Eingabeaufforderung: php -f c:\php\script.php -- arg1 arg2, was aber nicht wirklich komfortabel ist, da man es jedes mal neu eingeben muss. Die einzige Lösung ist, PHP über DOS (Win32) zu starten! PHP wird mit einen Mini-Script gestartet, das das eigentliche PHP-Script automatisch mit den Optionalen Eingabe-Parametern ausführt.

 

Das funktioniert unter folgenden Bedingungen:

  • Der Zeilenvorschub muss wie bei MS-DOS/Windows üblich: CR LF sein!
  • Das Script muss auf .bat enden, damit es als DOS-Script gestartet werden kann.
  • Es können nur maximal 9 Parameter übergeben werden (alle weiteren werden Ignoriert)
 Einfache Beispiellösung:
@php -r"eval(preg_replace('/.+<\?\w*(.+)\?>/s','\1',implode('',file('%0'))));" -- %1 %2 %3 %4 %5 %6 %7 %8 %9
@goto:eof
<?php

 echo "Hello World!";

?>

Zuerst wird das Script mit PHP geladen und anschließend wird das eigentliche PHP-Script mit Regulären Ausdrücken extrahiert, was dann an eval zusammen mit 9 optionalen Argumenten übergeben wird.

 

Für einfache Aufgaben wird es sicherlich reichen, aber beim Einsatz von Erweiterungen oder anderen Speziellen Aufgaben wird es Probleme geben:

  • Beim Aufruf muss das Script vollständig angegeben werden: (z.B. test.bat statt nur test)
  • php.exe muss sich im aktuellen Verzeichnis befinden
 

Da DOS und PHP Umgebungsvariablen beherrschen kann man viele Probleme praktisch

umgehen. Die folgene Lösung ist etwas komplexer aber auch Komfortabler:
@set self=%0
@if %php%*==* set php=php
@if exist php.ini set phpini=-cphp.ini
@if "%phpini%"=="" set phpini=-dextension_dir=./
@%php% %phpini% -r"$_SERVER['argv'][0]=str_replace(chr(34),'',getenv('self'));if($var=implode('',file($_SERVER['argv'][0].((file_exists($_SERVER['argv'][0]))?'':'.bat'))))eval(preg_replace('/([\S](?=.*<\?)|^<\?\w*|^\?>\s*$)/ms','',$var));if(substr(getenv('self'),1,-1)==$_SERVER['argv'][0])passthru('pause');" -- %1 %2 %3 %4 %5 %6 %7 %8 %9
@goto:eof
<?php

 echo "Hello World!";

?>
 

Als erstes wird von DOS der Pfad zum Script gesichert, anschließend wird die Variable PHP gesetzt, wenn sie noch nicht gesetzt war und zuletzt wird geprüft, ob sich eine PHP.ini im aktuellen Verzeichnis befindet und entsprechend wird die Variable phpini gesetzt. Nun wird alles an PHP übergeben: PHP wertet diese Parameter aus, und startet das PHP-Script. Zum Schluss wird noch auf ein Tastendruck gewartet, wenn das Script vom Explorer gestartet wurde.

 

Es können zwei Umgebungsvariablen gesetzt werden:

  • php - Pfad zu php.exe (z.B. c:\php\cli\php.exe)
  • phpini - Optionen für php.exe (z.B. -c c:\php\php.ini)
 

Weitere Funktionen:

  • Die Zeilennummern im eigentlich Script werden bei Scriptfehler korrekt berechnet.
  • Script kann auch ohne Angabe von .bat ausgeführt werden (Aber der Dateiname muss weiterhin auf .bat enden!)
  • Erweiterungen werden ohne php.ini oder phpini Angabe im aktuellen Verzeichnis gesucht.
  • In der PHP-Variable $_SERVER['argv'] werden die Optionalen Argumente und der Script-Pfad (was sonst in $_SERVER['PHP_SELF'] stehen würde) in ein Array übergeben.
  • Wird das Script mit Anführungsstrichen gestartet, (z.B. c:\test\script.bat) wie es der Explorer immer macht, dann wird auf ein Tastendruck gewartet, so ist es möglich scripte einfach vom Explorer zu starten ohne dass die Ausgaben verloren gehen.
 

Download


 << Links | Home | Serien >><< LAN Check | Projekte | Rocks 'n' Diamonds >>