PHP-Skript im Hintergrund auf Apache starten / neustarten (Windows Server)

7

Ich habe Apache 2.4 mit PHP 5.4 unter Windows Server 2008 gemäß den Anweisungen in diesem Handbuch installiert: Apache-Installationshandbuch . Apache läuft jetzt als Dienst.

Meine Anwendung benötigt ein PHP-Websocket-Skript, das im Hintergrund ausgeführt wird. Ich führe es manuell mit:

%Vor%

Die Frage ist: Gibt es eine Möglichkeit, ein Hintergrundskript automatisch beim Neustart des Systems (Apache) zu starten?

Ich habe das folgende Thema , aber ich wusste nicht, wo ich ein Apache-Startup-Skript für Windows finden konnte.

Jede Hilfe wird sehr geschätzt.

    
gxx 05.02.2013, 23:24
quelle

9 Antworten

11

Ich habe eine Lösung :)

  • Erstellen Sie eine Umgebungsvariable, die auf Ihr Apache-Verzeichnis verweist %Vor%

  • Umbenennen %APACHE_HOME%\bin\httpd.exe bis %APACHE_HOME%\bin\httpdVendor.exe
  • Erstellen Sie eine Batch-Datei und fügen Sie den folgenden Code ein: %Vor%

  • Laden / installieren die kostenlose Software BatToExeConverter (nächste, nächste, ...)
  • Öffnen Sie den installierten Konverter und öffnen Ihre frisch erstellte Batch-Datei
  • Klicken Sie auf Build EXE (lassen Sie die Standardkonfiguration)
  • Speichern Sie die Datei: %APACHE_HOME%\bin\httpd.exe
  • Starten Sie Ihren Apache-Server
  • Getestet auf: Windows 7, Apache 2.4, Advanced Bat zu Exe Converter 2.92

        
    Halayem Anis 21.01.2015 22:24
    quelle
    2

    Verwenden Sie den eingebauten Windows-Taskplaner, der .bat script auslöst, der curl mit einer definierten URL aufruft.

    1. Laden Sie curl aus Ссылка herunter und extrahieren Sie curl.exe in einem beliebigen Verzeichnis, aber wir verwenden c:\backgroundtasks
    2. Passen Sie das Skript unten an Ihre Bedürfnisse an:

      cd c: \

      cd c: \ Hintergrundaufgaben

      curl Ссылка

      beenden

    3. Konfigurieren Sie den Taskplaner so, dass er als Basisaufgabe ausgeführt wird:

      • Registerkarte "Allgemein" - als Systemkonto (wird ausgeführt, wenn Sie nicht am Server angemeldet sind)
      • Registerkarte "Trigger" - Frequenz anpassen
      • Registerkarte "Einstellungen" - unten setzen Sie If the task is already running... auf Stop the existing instance
    Pilskalns 22.01.2015 17:38
    quelle
    2

    Die beste Methode wäre hier, Windows-Dienstabhängigkeiten zu verwenden.

    Machen Sie eine php-websocket-server.cmd -Datei mit allen notwendigen Umgebungseinstellungen (z. B. Wechsel zu einem Verzeichnis, Einstellen von PATH, etc ...) mit der letzten Zeile:

    %Vor%

    Installieren Sie die Windows Server Resource Kit-Tools , um% zu erhalten. co_de% und srvany , um einen benutzerdefinierten Dienst zu erstellen. Notieren Sie den Installationspfad so, wie Sie ihn im nächsten Schritt benötigen.

    Öffne eine instsrv Shell und starte:

    %Vor%

    Erstellen Sie als Nächstes eine Datei cmd , die folgendes enthält (Update für Ihre Umgebung):

    %Vor%

    Importieren Sie es mit einem Doppelklick oder php-websocket-server.reg

    Zurück in Ihrer regedit /s php-websocket-server.reg Shell:

    %Vor%

    Damit der Apache2.4 * -Dienst von Ihrem PHP-Dienst abhängig ist. Jetzt, wenn Apache gestartet wird, wird der php-Dienst zuerst aufgerufen. Und ebenso, wenn Sie den PHP-Dienst stoppen, wird Apache damit aufhören.

    * Das Howto zeigt an, dass der Service "Apache2.4" heißt, aber Sie möchten dies möglicherweise in Ihrer Installation überprüfen.

        
    Ben Grimm 27.01.2015 18:19
    quelle
    1

    Wenn Sie als Dienst ausgeführt werden, haben Sie kein Startscript.

    Führen Sie eine Dienstimplementierung aus, die es ermöglicht, andere Programme als Dienste auszuführen, und machen Sie dann den neuen Dienst (der das Skript ausführt) eine Abhängigkeit vom Apache-Dienst. Dies wird jedoch das Skript nicht neu starten, wenn Apache neu gestartet wird.

    Eine mögliche Lösung mit SrvStart und ein anderes, das ServiceEx verwendet .

    Installieren Sie Apache möglicherweise nicht als Dienst und bearbeiten Sie dann das Start / Neustart-Skript und verwenden Sie die obige Methode, um Apache als Dienst auszuführen (anstatt das Apache-eigene Installationsprogramm zu verwenden).

        
    Jari Karppanen 06.02.2013 08:07
    quelle
    1

    Erstellen Sie eine Bat-Datei, zB 'myphp.bat' mit path/php myscript.php . Enthalten Sie den richtigen Pfad zu PHP, wenn es nicht Pfad ist.

    Erstellen Sie eine Bat-Datei, zB runmyphp.bat mit

      

    AT 00:00 / alle: M, T, W, Th, F "cmd / c /pfad/myphp.bat", wiederum einschließlich des korrekten Pfades.

    Verwenden Sie dann den Explorer, um runmyphp in den Autostart-Ordner zu ziehen, damit er beim Systemstart immer ausgeführt wird.

    Google 'windows at command' oder 'windows cron', um die korrekte Syntax für den 'at' Befehl zu erhalten, aber Sie können im Moment eine detaillierte Erklärung finden hier .

        
    Gavin Simpson 23.01.2015 06:44
    quelle
    1

    Ich habe eine andere Antwort gefunden C: \ wamp \ scripts \ wampserver.lib.php Diese Datei wird jedes Mal ausgeführt, wenn Ihre wamp startet

    Fügen Sie Ihren Dateipfad include_once("file_path"); zu dieser Datei hinzu und es ist fertig. das ist die perfekte Lösung, die Sie wollen

    Viel Spaß !!!!!!!!!

        
    Chintan Gor 23.01.2015 13:46
    quelle
    0

    Fügen Sie alle erforderlichen Prozesse in einer Batch-Datei zusammen und verwenden Sie RunAsService Mit einigen Optimierungen können Sie sicherstellen, dass Ihr Dienst vor Apache gestartet wird.

        
    Nehal Dattani 26.01.2015 03:44
    quelle
    0

    Obwohl die Lösung von Halayem Anis sehr kreativ ist, ist es wichtig zu beachten, dass Sie nie sicher sein können, dass ein PHP Skript im Hintergrund läuft. Also, wenn Sie Ihr Skript auf "Apache Start" starten, dann beenden Sie wahrscheinlich Op Apache ziemlich oft, einfach, Ihr Skript neu zu starten.

    Ich gehe davon aus, dass Sie sogar zu dieser Frage gekommen sind, da Sie auf einem normalen Server nie die Apache-Reset-Schaltfläche berühren müssen. Es startet beim Systemstart und läuft dann einfach. Wenn das der Fall wäre, könnten Sie einfach den Befehl php myscript.php beim Start ausführen.

    Da es keine Möglichkeit gibt, sicherzustellen, dass das Skript weiterläuft, würde ich einen anderen Ansatz verwenden, bei dem ich überprüfe, ob es läuft, und falls nicht, starte es neu.

    Der erste Schritt besteht also darin, zu verfolgen, ob das Skript läuft. Ich würde für den einfachen Ansatz gehen, wo Ihr myscript.php alle 5 Sekunden oder so ein einzelnes Byte in eine Datei schreibt. Auf diese Weise kann ich die letzte geänderte Zeit für die Datei verwenden, um zu sehen, ob sie noch läuft, weil last modified time + 5 seconds < now == not running .

    Sie können die letzte Zugriffszeit auch alle 5 Sekunden in einer Datenbank speichern. Ist möglicherweise etwas schneller als der Zugriff auf Dateien, wenn Sie viel Verkehr haben.

    Der zweite Teil besteht darin, dass jede Anfrage prüft, ob das Skript läuft. Für diese beiden Arbeiten würde ich das PHP.ini verwenden, um bei jeder Anfrage ein PHP-Skript voranzustellen. Sie können es mit der auto_append_file Option machen.

    Dieses Vorlaufskript würde folgendermaßen funktionieren:

    %Vor%

    Überprüfen Sie, wie filemtime und exec arbeiten und was Sie beachten müssen. Sie arbeiten etwas anders auf Windows / * nix.

        
    Hugo Delsing 27.01.2015 09:06
    quelle
    0

    Erstellen Sie Windows Batch-Dateien, um Apache und das PHP-Skript zu starten:

    %Vor%

    Sie können auch eine Batch-Datei erstellen, die das PHP-Skript beendet und Apache stoppt:

    %Vor%

    In den obigen Beispielen:

    • Apache ist der Name des Dienstes, der in Services.msc angezeigt wird. könnte stattdessen Apache2.1 oder Apache2.2 sein
    • C:\inetpub\scripts ist das Verzeichnis, das das Skript enthält. Der Befehl Start wechselt in dieses Verzeichnis
    • PHP Script 01 ist ein Label, das im Befehl Taskkill verwendet wird, um den Prozess zu finden
    Salman A 26.01.2015 06:06
    quelle