2017-09-10 12 views
0

phpバックエンドにコマンドを送信するためのajax postメソッドを発行します。 1つは「再起動」です。タイムアウトを(クライアント側)スクリプトが終了する前にPHP応答が送信されない

<?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; 
} 

AJAX呼び出しをし、答えを受けることはありません:私は、スクリプトが終了する前に戻って答えを取得しようとしています。 もちろん、rebootコマンドにわずかな遅延を追加することはできますが、私のコードが動作しない理由を理解したいと思います。

私はlighttpdとfast-cgiを備えたRPi上で実行しています。

+0

「再起動」をここから呼び出さない方が良いでしょう。他のすべてを行い、あなたのajaxコールバックに戻り、コールバックの中から、リブートするajax経由で別のPHP関数を呼び出します。さらに、私が知る限り、ブラウザベースのPHP関数呼び出しから "システム"コマンドを発行することはできません。 –

+1

実際には動作します...私は 'www-data'に再起動と停止のsudo権限を与えました。とにかくあなたの "回避策"は私より優れています:) – Mark

答えて

0

毎秒実行されるcronジョブを定義して、設定や再起動などを確認できます。そうであれば、リブートが発行されます。 AJAX呼び出しによって発行されたスクリプトは、この設定をtrueに設定して、スクリプトがクライアント側に応答できるようにすることができます。サーバーが再起動されると、再起動設定は自動的にfalseに戻されます。しかし、これは非常に危険な方法であると思われます。ユーザーがこのような要求を送信してサーバーを使用できなくする可能性があるからです。

+0

あなたのヒントをありがとう。しかし、私の質問は異なる方法ではなく、実際に私のコードがうまくいかない理由を理解することに興味があります。再起動する前に応答をフラッシュする必要があります。 – Mark

関連する問題