У меня сложная проблема для отладки. У меня есть веб-страница, которая делает несколько запросов ajax на наш сервер (apache / php — настолько просто, насколько это возможно). Мы реализовали функцию php, которая использует shell_exec для запуска небольшой программы на c ++ и чтения выходных данных. Во время тестирования у меня не было проблем. Однако на нашем реальном сервере есть большая проблема.
Каждый раз, когда я вызываю запрос ajax, который вызывает функцию php, которая вызывает shell_exec, я получаю хороший ответ, но после этого я больше не могу делать успешные вызовы ajax в этот файл php. Я проверил это в разных браузерах и на разных компьютерах, и поведение сохраняется каждый раз.
Если я удалю свои куки, я могу подключиться к файлу php.
Я проверил сетевые соединения с помощью инструментов разработчика Chrome, и ничего не сказано. Я получаю хороший ответ от запроса ajax, который вызывает shell_exec. Но потом его заблокировали. Я получаю ошибку соединения не удалось — но только на устройстве / сеансе, который вызвал эту функцию. Если я открою другой браузер, он все равно подключится.
Я гуглил блокировку сессии php, но я не понимаю, как это может быть проблемой. Это простой запрос ajax, и выполняется только один запрос за раз. Более того, я несколько раз вызывал другой ajax-запрос для воспроизведения поведения, и я не могу. Это происходит только тогда, когда я вызываю функцию php, которая вызывает shell_exec.
Если что-то пошло не так с shell_exec, я бы не ожидал хорошего ответа, но получаю хороший ответ.
Я знаю, что это расплывчато, но это большая проблема, и я понятия не имею, как отладить такую проблему. Любые идеи о том, что происходит или как я могу отладить это?
Пример кода:
function applyForCreditCards() {
if (!creditCardAppForm.isValid()) return;
$.ajax({
type: 'POST',
url: '../troystest/MobileServices/MobileValidationService.php',
data: {
'action': 'applyForCreditCard',
'ssn' : ssn,
... more variables...
'creditCardIds' : selectedCreditCards
},
success: function(msg){
results = JSON.parse(msg);
// Do something with response
});
}
});
}
Пример кода на стороне сервера
if (!$_SESSION)
session_start();
switch($_POST['action'] {
case 'applyForCreditCard': $this->applyForCreditCards($vars...);
break;
}
applyForCreditCards($vars...) {
$output = explode("\n", shell_exec($pathToExec." ".$commandLineArgs));
echo json_encode($output);
exit();
}
Настоящий код очень длинный, я попытался включить соответствующие части. Программа на c ++ небольшая и выдает примерно 10 строк вывода на стандартный вывод.
В зависимости от того, какая фактическая команда выполняется внутри shell_exec
Вам может потребоваться прервать процесс перед повторной попыткой или запустить каждый процесс в фоновом режиме.
Посмотрите здесь некоторые классы, которые помогут сделать это: http://php.net/manual/en/function.shell-exec.php
Других решений пока нет …