2016-11-22 3 views
2

У меня возникают проблемы с PHP-скриптом, который я использую для настройки сети WiFi в малиновом Pi 3. Предполагается, что SSID и переменные PW должны получать POST, ответьте «нормально», к вызову 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 ... ну, исполняется пять секунд после отправки «ОК» ответ. Или должно быть, но ответ не поступает.

Я искал похожие вопросы, но на самом деле не нашел ничего полезного (или подобного).

EDIT:

Я пытался что @ Стивенса-Джексоне ответил, без результатов:

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

EDIT 2:

попытался изменить sleep из сценария PHP в оболочке сценарий, выполняющий его как 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

Вы хотите сбросить() перед вызовом сна.

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

Похоже, что PHP не может переопределить флеш-буфер, даже 'ob_flush()' работает: $ –

+0

Я попробовал его CLI, а не браузер. Надеюсь, что-то придет. Одна вещь, о которой я думаю, это после того, как вы получите ответ, используйте JS для вызова другого скрипта PHP через 5 секунд. Тем не менее, я знаю, что это не совсем то, что вы ищете. –

+0

На самом деле я мог просто проигнорировать ответ и предположить, что он прошел нормально ... или, возможно, поместил сон (5) в файл .sh и выполнил его с «&» в конце, чтобы он ускользнул от оболочки и позволил php завершение скрипта. Должен проверить это. –

Смежные вопросы