개요
PHP로 이루어진 웹 페이지 개발 도중 python 코드로 구현된 AI를 적용해야 하는 일이 있었다.
PHP에서 Python 코드를 호출하여 AI 실행 후 결과를 리턴받는 과정을 구현해보자.
방법
구현 방법은
- python 코드 구현
- python 로직 호출하는 PHP 코드 구현
- AI가 필요한 부분에 방법 2의 PHP 호출
3가지 순서로 이루어진다.
1. python 코드 구현
비지니스 로직에 맞춰 python 기반 AI를 구현한다.
이 때, print 문법을 활용하여 PHP코드로 결과 값을 리턴할 수 있다.
print("result")
2. python 호출하는 PHP 코드 구현
두 번째로 python 코드를 호출하고 값을 리턴 받을 수 있는 PHP를 작성한다.
AI가 필요한 부분에 호출을 직접 작성해도 되는거 아니냐 ! 뭐하러 PHP를 번거롭게 따로 만드나 !
라고 할 수도 있지만 ajax 사용을 위해 필수적인 작업이다.
ajax는 비동기 통신 문법으로써 문법 내에 호출한 PHP 작업을 실행한 채 리턴을 기다리지 않고 다음 라인을 바로 실행한다.
만약, ajax를 사용하지 않는다면 python작업이 끝날 때까지 코드가 진행되지 않고 멈출 것이다.
결과 도출까지 시간이 걸리는 AI라면 UX에 지장이 될 수 있다.
그럼, PHP 코드를 살펴보자
<?php
$branch_idx = $_POST['branch_idx'];
$student_idx = $_POST['student_idx'];
$python_output = shell_exec("python face_recog_dnn.py $branch_idx $student_idx");
echo $python_output;
?>
해당 코드는 브랜치, 학생 idx 값을 해당 PHP를 호출한 메소드로부터 POST 형식으로 받아와서 python 코드에 argv로 넣어서 실행시키는 로직이다.
shell_exec를 사용하면 쉘에서 파이썬 코드를 돌릴 때 처럼 파일명, argv를 지정할 수 있고,
좌측의 변수로 리턴 값을 가져올 수 있다. (여기서는 python 코드 내 print 값)
그 다음 echo를 활용하여 해당 PHP를 호출 한 부분에 결과를 리턴할 수 있다.
주의점 :
해당 코드에서는 python 코드가 같은 경로에 있어서 경로 이동 코드가 없었다.
만약 다른 경로에 있는 python 코드를 실행하고 싶을 때 쉘에서는
python ../a/b/face_recog_dnn.py
이렇게 사용하면 된다.
하지만 PHP에서
shell_exec("python ../a/b/face_recog_dnn.py");
이렇게 작성하면 동작하지 않는다.
아래와 같이 작성해야 다른 경로의 python 코드가 실행된다.
shell_exec("cd ../a/b/ && python face_recog_dnn.py");
3. AI가 필요한 부분에 방법 2의 PHP 호출
비지니스 로직 상 AI 활용(Python 코드 호출)이 필요한 부분에 $ajax 문법을 사용하여 방법 2의 PHP를 호출한다.
$.ajax({
type: "POST",
url: "../face_recog/run_face_recog.php",
data: {
branch_idx: <?=$_SESSION['st_branchId']?>,
student_idx: <?=$_SESSION['st_id']?>
},
success: function(response) {
console.log("python response : ", response);
// 얼굴 발견 못했을 때
if (response.includes("Not Found")) {
document.getElementById("ai_monitoring").style.display = "none";
document.getElementById("ai_monitoring_warning").style.display = "block";
} else {
document.getElementById("ai_monitoring_warning").style.display = "none";
document.getElementById("ai_monitoring").style.display = "block";
}
},
error: function(xhr, status, error) {
console.log("error : ", error);
alert("얼굴 인식 프로그램에 문제가 생겼습니다.");
}
});
type | 호출할 프로토콜을 지정한다. ex. GET, POST, PUT |
url | 호출할 PHP 경로 및 파일 이름을 지정한다. |
data | POST 프로토콜일 경우 호출한 PHP파일로 넘길 parameter data를 작성한다. |
success | PHP호출에 성공했다면, 해당 부분으로 리턴 값이 온다. 여기서 response 값으로는 호출한 PHP에서 echo로 작성한 내용이 넘어온다. |
error | PHP 호출에 실패했다면, 해당 부분이 실행된다. 사용자에게 에러가 났다는 사실을 알려준다. |
결론
PHP에서 Python 코드를 실행하는 방법을 알아보았다.
단계가 많아 복잡해 보이지만 한 번 보고 따라하면 이후부터는 쉬울 것이다.
요새는 React와 같은 편리한 프레임워크가 많이 나오고 보안상의 이유로 PHP를 사용할 일이 많지 않겠지만,
레거시 코드 유지보수를 위해서는 알아 둘 필요성은 있다.
이를 통해 PHP에서 Python을 활용하여 만든 여러 tool을 사용해보자