#python #php
#python #php
Вопрос:
У меня есть страница PHP и программа на Python. Программа Python выполняет внутренний вызов API для получения информации, необходимой для отображения на странице PHP.
Программа Python настроена на принятие аргумента и обработку вызова API с использованием этого аргумента. Например myPythonProgram 12345
— получает информацию, относящуюся к учетной записи 12345.
Я хотел бы вызвать это со своей страницы PHP через Ajax, но если я вызываю программу так, как она должна вызываться, я получаю 404 (между программой и аргументом есть пробел). Я изменил скрипт Python для приема запросов (я думаю), но когда я делаю это, отображается код Python, а не результат. Следующий сбой:
$.ajax({
type: 'POST',
url: "myPythonProgram",
data: { id: '12345' },
success: function(response) {
// Stuff
},
fail: function() {
alert('Error');
},
complete: function() {
// Stuff
}
});
Я подумал, что, возможно, я мог бы вызвать другую страницу PHP для выполнения программы Python через shell_exec()
, но, похоже, страница отображается до того, как программа Python завершит свой запрос. Что-то вроде:
$.ajax({
type: 'POST',
url: "callPy.php",
data: { id: '12345' },
success: function(response) {
// Stuff
},
....
});
с callPy.php быть:
<?php
$data = $_REQUEST['data'];
if (isset($data) amp;amp; $data['id'] != NULL) {
$info = shell_exec("myPythonProgram " . $data['id']);
print_r(json_encode($info));
}
?>
Если бы я запустил эту точную команду myPythonProgram 12345
в оболочке, это сработало. Если я изменю callPy.php чтобы жестко закодировать идентификатор, а затем вызвать php callPy.php
оболочку, это работает. Но вызов этого в браузере приводит к нулевому значению.
Как я могу заставить python принять запрос POST или GET или заставить PHP ждать завершения работы программы на Python, прежде чем она отобразит страницу?
Ответ №1:
Это было решено путем изменения разрешений для файлов, необходимых для вызова API.
Сначала я проверил, какой пользователь используется для веб-браузера: ps aux | egrep '(apache|httpd)'
, который показал мне, что это «apache». Затем я попытался запустить программу python от имени этого пользователя : sudo -u apache ./myPythonProgram 12345
. Это привело к ошибке в сертификате, который требовался для вызова API.
При shell_exec()
этом PHP будет ждать завершения процесса. Таким образом, изменение разрешений для этого сертификата позволило мне запустить программу от имени пользователя apache, и я смог добиться желаемого эффекта.