2016-11-22 6 views
2

Raspberry Pi 3에서 WiFi 네트워크를 구성하는 데 사용하는 PHP 스크립트에 문제가 있습니다. POST에서 SSID 및 PW 변수를 가져오고 "ok" 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 초를 실행 : 여기에 코드입니다. 그렇지 않으면 응답이 도착하지 않습니다.

비슷한 질문을 검색했지만 유용한 (또는 비슷한) 것을 찾지 못했습니다.

편집 : 나는 아무 결과, 스티븐 - 잭슨 @ 대답 무엇을 시도했습니다

:

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

편집 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

수면을 호출하기 전에 flush()를하고 싶습니다.

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

PHP가 버퍼 플러시를 무시할 수없는 것처럼 보입니다. ob_flush()도 작동하지 않습니다. $ –

+0

브라우저가 아니라 CLI를 사용했습니다. 잘하면 뭔가가 나옵니다. 한 가지 생각은 응답을 얻은 후 JS가 5 초 후에 다른 PHP 스크립트를 호출하는 것입니다. 그러나 나는 당신이 그 질문에 대해 정확히 찾고있는 것이 아니라는 것을 알고 있습니다. –

+0

사실 나는 단지 대답을 무시하고 ok라고 가정한다고 가정 할 수도 있습니다. 또는 .sh 파일 안에 sleep (5)를 넣고 끝에 &를 써서 쉘을 이스케이프하고 PHP 스크립트 완성. 그걸 시험 해봐야 해. –