У меня возникают проблемы с 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."\" &");
, но также не работал.
Этого можно ожидать. Сообщение ok будет отправлено в буфер, а затем не будет выпущено до конца скрипта. –
Я предполагаю, что вы столкнулись с блокировкой сеанса, я не вижу переменную '$ _SESSION' в вашем скрипте, но я бы предположил ее в файлах' chkSession.php', чтобы ... решить это место в коде 'session_write_close(); 'над выражением' echo'. – cmorrissey
@cmorrissey На самом деле я не использую сеансы PHP для проверки пользователя, 'chkSession.php' - это сценарий, который я написал для простой проверки сеанса (в основном он просто проверяет, что ключ сеанса, отправленный пользователем, совпадает с тем, который хранится в сервер). –