48 Stimmen

Wie führt man eine .bat-Datei in PHP aus?

Kann mir jemand sagen, wie ich eine .bat-Datei aus einem PHP-Skript heraus ausführen kann?

Ich habe es versucht:

exec("C:\[path to file]");
system("C:\[path to file]");

Nichts funktioniert. Ich habe in den PHP-Handbüchern nachgesehen und gegoogelt, aber ich kann keine gute Antwort finden. Weiß jemand, was ich falsch mache?

Ich verwende Windows 2003 Server und habe die .bat-Datei erfolgreich manuell ausgeführt, und sie tut, was ich brauche; ich muss nur in der Lage sein, sie programmatisch zu starten.

0voto

Alex Khimich Punkte 648

Dieser Ausschnitt stammt aus dem Arbeitscode.

Sie können die Bat-Datei nicht nur über die Windows-GUI oder den Taskplaner auslösen, sondern auch direkt aus dem PHP-Skript, wenn Sie es brauchen. In den meisten Fällen dauert die Ausführung jedoch 30-60 Sekunden, abhängig von Ihrer PHP-Konfiguration. Wenn der Job in der BAT-Datei lang ist und Sie Ihre PHP-Skripte nicht einfrieren wollen, müssen Sie den BAT-Job als einen anderen Prozess forken, indem Sie php.exe und von Apache nicht verlässlich sein.

Dies läuft in Hintergrund Modus in Windows, die als separate Prozesse betrachtet werden cmd.exe y php.exe vom Task-Manager, der Ihre Apache-PHP-Skripte nicht anhält. Die von Ihrem Skript erzeugten Meldungen können gespeichert und über Protokolldateien wieder abgerufen werden.

In meinem Fall in file_scanner.php Ich tue einige schwere Berechnungen in Schleife für große Array von Dateien, die für einige Stunden mit php-Funktion dauern kann sleep() um die CPU nicht zu überlasten.

Das Ergebnis des Erfolgspointers aus der Datei $r die Sie per Ajax abfragen können, wenn Sie den Erfolg oder Fehlstart wissen wollen. In meinem Fall file_scanner.php schreibt Logdatei mit Meldungen somefile.jpg - OK die Sie alle paar Sekunden mit AJAX in Ihre Benutzeroberfläche laden können, um den Fortschritt anzuzeigen.

PHP

/**
 * Runs bat file in background mode
 *
 */
 function run_scanner() {

    $c='start /b D:\Web\example.com\tasks\file_scanner.bat'; 
    $r=pclose(popen($c, 'r')); 
    return json_encode(array('result'=>$r));

 }

BAT

@echo Off
D:\PHP\php.exe D:\Web\example.com\tasks\file_scanner.php > D:\Web\example.com\tasks\file_scanner.log
exit

0voto

Ken Computers Punkte 1

Für alle, die ein Programm im Hintergrund laufen lassen wollen, ohne dass PHP auf dessen Beendigung warten muss, ist dies die Lösung:

 pclose(popen("start /B ".$cmd, "r")); 

wobei $cmd ist der String-Befehl für das Programm, das Sie ausführen müssen (z. B. $cmd kann gleich sein notepad.exe o node Path\to\server.js ).

Quelle: https://www.php.net/manual/en/function.exec.php (siehe den Hinweis von Arno van den Brink im Abschnitt "Von Benutzern beigetragene Hinweise").

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X