2016-11-22 22 views
2

私はRaspberry Pi 3でWiFiネットワークを設定するために使用しているPHPスクリプトに問題があります。POSTからSSIDとPW変数を取得し、 ajax呼び出しに接続し、スクリプトを実行します(その順番で、RPiがリブートして接続が失われます)。問題は、 "ok"応答を送信する前にスクリプトが実行されていることです。ここでは、コードは次のとおりです。PHPが順番に実行されていません

<?php 
    header('Access-Control-Allow-Origin: *'); 
    header('content-type: text/html; charset:utf-8'); 
    require_once "chkSession.php"; 
    ini_set('display_errors', 1); 

    $servername = "localhost"; 
    $username_db = "xxx"; 
    $password_db = "xxx"; 
    $dbname = "xxx"; 

    $conn = new mysqli($servername, $username_db, $password_db, $dbname); 
    if ($conn->connect_error) { 
     die("died" . $conn->connect_error); 
    } 

    $username = $_POST['username']; 
    $sessionKey = $_POST['sessionKey']; 

    if (chkSession($conn,$username,$sessionKey)){ 
     $ssid = $_POST['ssid']; 
     $wifipwd = $_POST['wifipwd']; 
     echo json_encode(["auth"=>"ok"]); 
     sleep(5); 
     exec("sudo /var/www/scripts/configwifi.sh \"".$ssid."\" \"".$wifipwd."\""); 
    } else { 
     echo json_encode(["auth"=>"skErr"]); 
    } 
?> 

あなたが見ることができるように、execは...よく、「OK」応答を送信した後、5秒に実行されます。そうでなければなりませんが、応答は到着していません。

私は同様の質問を検索しましたが、有用な(または類似した)ものは実際には見つかりませんでした。

EDIT:

echo json_encode(["auth"=>"ok"]); 
flush(); 
ob_flush(); 
sleep(5); 
exec("sudo /var/www/scripts/configwifi.sh \"".$ssid."\" \"".$wifipwd."\""); 

EDIT 2:シェルへのPHPスクリプトからsleepを変更しようとしました

私はスティーブン・ジャクソンは結果なしで、答え@何

試してみましたスクリプトをexec("sudo /var/www/scripts/configwifi.sh \"".$ssid."\" \"".$wifipwd."\" &");として実行しましたが、どちらもうまくいきませんでした。

+0

これは予想されます。 okメッセージはバッファに送信され、スクリプトの最後まで解放されません。 –

+0

私はあなたがセッションロックを経験していると思いますが、あなたのスクリプトに '$ _SESSION'変数は見当たりませんが、' chkSession.php'ファイルの中にあると仮定します...これを解決するには 'session_write_close (); 'あなたの' echo'文の上に。 – cmorrissey

+0

@cmorrissey実際に私はユーザーの検証にPHPセッションを使用していません、 'chkSession.php'は単純なセッション検証用に書いたスクリプトです(基本的には、ユーザーが送信したセッションキーがサーバ)。 –

答えて

0

sleepを呼び出す前にflush()する必要があります。

echo json_encode(["auth"=>"ok"]); 
flush(); 
sleep(5); 
exec("sudo /var/www/scripts/configwifi.sh \"".$ssid."\" \"".$wifipwd."\""); 
+1

PHPはバッファフラッシュをオーバーライドすることができないようですが、 'ob_flush()'さえ動作していないようです:$ –

+0

ブラウザではなくCLIを試しました。うまくいけば何かが現れます。私が考えていることの1つは、応答を得た後、5秒後にJSが別のPHPスクリプトを呼び出すことです。しかし、あなたが探しているのはそれが正確ではないということです。 –

+0

実際には、私はちょうど答えを無視して、それがOKになったと仮定することができます...またはおそらくsleepファイル(5)を.shファイルの中に入れて、最後に '&'を実行してシェルをエスケープし、スクリプトの仕上げ。それをテストしなければならない。 –

関連する問題