티스토리 뷰

Develope/PHP

PHP 비동기 처리하기

Jason park@ 2018. 5. 20. 18:16
반응형

프로그램 코드를 짜면서 제일 중요하게 생각하는게 처리시간이다.


사용자가 특정 액션을 취했을때 응답이 느려지면 답답함을 느낄것이고 이게 반복이 되다보면 짜증이 날것이다.


디비 설계를 잘하고 프로그램을 잘 짜면서 처리시간을 최소화 하면 가장 좋겠지만 

항상 뜻대로만은 잘 되지 않는것같다. 

비즈니스 로직이 바뀌거나, 큰 데이터를 처리해야하거나, 오랜 시간 여러사람에 걸쳐서 쉽게 프로그램을 수정하지 못하는 등등 여러가지 상황이 있을것이다.


PHP 에서 한번의 페이지 호출로 여러가지를 동시에 처리해야 할때 이때 우리는 여러가지 방법을 이용하여 문제를 해결할수 있다.


프로세스 단위로 쪼개어 분산처리를 한다던지, 

웹서버에 영향을 줄만한 로직은 서드파티 방식으로 타서버에서 처리하도록 한다던지, 

비동기 방식을 이용한다던지,

크론탭과 함께 큐스택 방식으로 처리한다던지등등 생각하면 방법은 무수히 많을 것이다.


이중 PHP의 비동기 처리방식에 대해 다뤄보려고 한다.


PHP 에서는 비동기 처리방식이 조금은 까다로운 편이다. 

jQuery ajax 처럼 쓰기 편하면 좋을텐데 PHP 비동기 처리방식은 써도 써도 불편하며 한번 더 기존 코드를 확인해가며 맞는지 확인하면서 하고있다.


만약 프로세스단위로 쪼개어 본 요청에 영향이 없도록 처리를 하려고 할때 우리는 두가지 방식을 이용하여 처리 할 수 있다.


그중 첫번째. 

1. Curl 을 이용한 방식 


주로, 타 서버에 처리를 맡길때에 사용한다. 

또는 많은 파라메터로 데이터를 넘길때에도 사용한다. 


필자는 쉘 명령어를 이용하여 처리하기를 좋아한다.


아래는 사이트의 모든 트래픽을 타 서버로 보내기위해 코드이그나이터의 index.php 의 중간에 삽입한 실제 예이다.


$post_data=array(
'log_id' => date('YmdHis'),
'log_ip' => isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? ip2long($_SERVER['HTTP_X_FORWARDED_FOR']) : ip2long($_SERVER['REMOTE_ADDR']),
'server_info' => json_encode($_SERVER),
'request_info' => json_encode($_REQUEST),
"cookie_info" => json_encode($_COOKIE)
);

$url = 'http://brtech/logger.php';

$command = "curl ";
foreach ($post_data as $key => &$val)
$command .= "-F '$key=$val' ";
$command .= "$uri -s > /dev/null 2>&1 &"; passthru($command);



페이지 호출이 있을때 본 처리가 완료되기까지 기다릴 필요가 없는 프로세스를 위처럼 분리시키면 된다.


2. php 자가 호출


마찬가지로 처리되기를 기다릴 필요가없고 타 서버로 보낼 필요가 없는 프로세스에 적용하는 방식이다.


$command = "php -f /home/brtech/public_html/index.php main/set_log_with_json/{$data} > /dev/null 2>&1 & ";
passthru($command);


이처럼 해당 프로그램을 쉘명령어를 통해 직접 호출하는 방식이다.


위와 같이 했을때 코드이그나이터는 http://aaa.aa/main/set_log_with_json/data 를 호출한것과 같이 처리할수 있다.

네이티브 코드에 파라메터를 보낼 때에는 

$command = "php -f /home/brtech/public_html/index.php main {$data} > /dev/null 2>&1 & ";
passthru($command);

이렇게 띄어쓰기를 이용하여 보내고, 받는곳 프로그램에는 $argv 라는 변수에 순번대로 담겨서 온다.

print_r($argv) 로 변수를 확인해보면 된다.



이 두가지 방식의 공통점은 passthru 라는 php 명령어를 이용한것이고 명령어의 끝에 > /dev/null 2>&1 & 옵션을 주는것이다. 

뒤에 옵션이 프로세스를 비동기 상태로 만들어주는 핵심 역할을 한다. 


이것만 가지고도 프로세스를 잘 쪼갤수 있다.

다만 남용하면 안될것이며 느린 프로그램은 느리지 않도록 원초적인 문제를 해결하는것이 좋을것이다. 


반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함