2017-09-10 3 views
0

Ich erstelle eine Ajax-Post-Methode, um Befehle an das PHP-Backend zu senden. Eine davon ist ein "Neustart". Ich versuche, die Antwort zurück zu bekommen, bevor das Skript endet:PHP-Antwort wird nicht gesendet, bevor das Skript endet

<?php 

set_time_limit(0); 

$json = file_get_contents('php://input'); 
$obj = json_decode($json); 

switch ($obj->{'action'}) { 
    case "reboot": 
    $data = '{"success" : true}'; 

    ob_start(); 
    header('Content-Type: application/json'); 
    echo json_encode($data); 
    ob_end_flush(); 
    ob_flush(); 
    flush(); 

    exec("sudo reboot"); 
    break; 

    default: 
    $data = '{"success": "fail"}'; 
    break; 
} 

Der Ajax-Aufruf (auf Client-Seite) mal aus und erhält nie die Antwort. Natürlich kann ich dem Neustartbefehl eine kleine Verzögerung hinzufügen, aber ich möchte verstehen, warum mein Code nicht funktioniert.

Ich bin es auf einem RPi mit Lighttpd und Fast-CGI ausgeführt.

+0

Es ist besser, wenn Sie nicht von hier aus Ihren "Neustart" aufrufen. Tun Sie alles andere, kehren Sie zu Ihrem Ajax-Rückruf zurück und rufen Sie innerhalb des Rückrufs eine andere PHP-Funktion über einen AJAX, der neu startet, auf. Plus, soweit ich weiß, können Sie nicht "System" -Befehl aus browserbasierten PHP-Funktionsaufruf ausgeben. –

+1

Eigentlich funktioniert es ... Ich gewährte 'www-data' die Sudoprivilegien für Neustart und halt. Wie auch immer, deine "Workaround" ist besser als meine :) – Mark

Antwort

0

Sie können einen Cron-Job definieren, der jede Sekunde ausgeführt wird und nach einer Einstellung, einem Neustart oder etwas Ähnlichem sucht. Wenn das der Fall ist, wird ein Neustart ausgelöst. Das von Ihrem AJAX-Aufruf ausgegebene Skript könnte diese Einstellung auf "True" setzen, damit das Skript auf die Clientseite reagieren kann. Wenn der Server neu gestartet wird, kann die Neustarteinstellung automatisch auf false zurückgesetzt werden. Dies scheint jedoch ein äußerst unsicherer Ansatz zu sein, da jeder Benutzer in der Lage sein könnte, eine solche Anfrage zu senden, wodurch der Server unbrauchbar wird.

+0

Danke für deinen Hinweis. Aber meine Frage ist nicht über verschiedene Methoden, in der Tat bin ich daran interessiert zu verstehen, warum mein Code nicht funktioniert. Es sollte die Antwort vor dem Neustart leeren. – Mark

Verwandte Themen