본문으로 바로가기

PHP 비동기 처리

category PHP 2020. 2. 12. 18:42
반응형

 

 


php에서 비동기 처리로 작업할께 있어서 비동기 처리에 대해서 찾아봤습니다.

 

동기 / 비동기란?

동기 처리란
상대방의 일정 신호에 의해서 다음 동작이 이루어지면 동기
비동기 처리란
상대방의 상태와 관계없이 일방적으로 동작하면 비동기

 

1. curl 비동기 처리

저번에 curl을 공부해서 curl에 반환값을 받지 않게 설정하면(CURLOPT_RETURNTRANSFER) 비동기 처리가 되는줄 알았습니다..........

CURLOPT_RETURNTRANSFER 값을 false로 설정해 반환 값을 받지 않고 테스트를 해봤는데 10초가 걸리는 작업을 호출 후에 alter을 띄우게 만들었는데 10초가 지난 후에 alert창이 떠서 비동기 처리가 안됬구나 하고 구글링을 해서 찾아봤습니다.

PHP에서 cURL 라이브러리는 비동기 처리를 지원해주지 않는다는걸 알게되었습니다.

cURL로 사용하는 방법은 직접 소켓을 오픈해서 사용해야 합니다.

function curl_request_async($url, $params, $type='POST')  
{  
    foreach ($params as $key => &$val)  
    {  
        if (is_array($val)) 
		{
            $val = implode(',', $val);  
		}
        $post_params[] = $key.'='.urlencode($val);  
    }  
    $post_string = implode('&', $post_params);  
  
    $parts=parse_url($url);  
  
    if ($parts['scheme'] == 'http')  
    {  
        $fp = fsockopen($parts['host'], isset($parts['port'])?$parts['port']:80, $errno, $errstr, 30);  
    }  
    else if ($parts['scheme'] == 'https')  
    {  
        $fp = fsockopen("ssl://" . $parts['host'], isset($parts['port'])?$parts['port']:443, $errno, $errstr, 30);  
    }  
  
    // Data goes in the path for a GET request  
    if('GET' == $type)  
        $parts['path'] .= '?'.$post_string;  
  
    $out = "$type ".$parts['path']." HTTP/1.1\r\n";  
    $out.= "Host: ".$parts['host']."\r\n";  
    $out.= "Content-Type: application/x-www-form-urlencoded\r\n";  
    $out.= "Content-Length: ".strlen($post_string)."\r\n";  
    $out.= "Connection: Close\r\n\r\n";  
    // Data goes in the request body for a POST request  
    if ('POST' == $type && isset($post_string))  
        $out.= $post_string;  
  
    fwrite($fp, $out);  
    fclose($fp);  
}

 

2. 직접 호출

passthru ( string $command [, int &$return_var ] ) : void 
//The passthru() function is similar to the exec() function in that it executes a command. This function should be used in place of exec() or system() when the output from the Unix command is binary data which needs to be passed directly back to the browser. A common use for this is to execute something like the pbmplus utilities that can output an image stream directly. By setting the Content-type to image/gif and then calling a pbmplus program to output a gif, you can create PHP scripts that output images directly.
//passthru () 함수는 명령을 실행한다는 점에서 exec () 함수와 유사합니다. 이 함수는 Unix 명령의 출력이 이진 데이터이고 브라우저로 직접 전달되어야하는 경우 exec () 또는 system () 대신 사용해야합니다. 이를위한 일반적인 용도는 이미지 스트림을 직접 출력 할 수있는 pbmplus 유틸리티와 같은 것을 실행하는 것입니다. Content-type을 image / gif로 설정 한 다음 pbmplus 프로그램을 호출하여 gif를 출력하면 이미지를 직접 출력하는 PHP 스크립트를 작성할 수 있습니다.

passthru("php /경로/test.php > /dev/null 2>&1");

뒤에 붙은 /dev/null 2>&1

/dev/null

      표준출력을 기록하지 않음
2>&1

      에러출력도 기록하지 않음

 

 

<참조 https://brtech.tistory.com/99>

<참조 https://the7sign.github.io/php/2016/10/18/php-async-curl.html>

 

 

반응형