개요

PHP로 이루어진 웹 페이지 개발 도중 python 코드로 구현된 AI를 적용해야 하는 일이 있었다.

PHP에서 Python 코드를 호출하여 AI 실행 후 결과를 리턴받는 과정을 구현해보자.

 

방법

구현 방법은

  1. python 코드 구현
  2. python 로직 호출하는 PHP 코드 구현
  3. 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을 사용해보자

반응형

+ Recent posts