2013-03-08 4 views
-3

PHP 스크립트 내에서 외부 도메인을 호출하는 가장 좋은 방법은 무엇입니까? 그것은 컬 이냐? 그리고 만약 그렇다면 php는 우리가 반환 데이터를 확신 할 수 있도록 계속 진행하기 전에 라인이 처리 될 때까지 기다립니다.PHP는 API 호출의 응답을 기다리는가?

답변

4

외부 URL에서 응답을 얻는 가장 쉬운 방법은 file_get_contents()를 사용하는 것이지만 더 많은 옵션이 있거나 게시물 데이터를 보내려는 경우 cURL을 사용하는 것이 좋습니다. 두 기능 모두 응답을 기다립니다. PHP는 꽤 간단합니다.

+0

사실 비동기 요청을 만드는 몇 가지 해결 방법과 실험 라이브러리 [pthreads] (http://www.php.net/manual/en/book.pthreads.php)가 있습니다. – Leri

+0

API가 응답하지 않으면이 문제가 발생합니다. 다른 대답을 지금 확인합니다. – landed

0

Curl, file_get_contents (적절한 확장자가로드 된 상태) 또는 소켓 작업을 수행 할 수 있습니다.

class Tools 
{ 
public static function post_request($url, $datos) 
{ 
    $resultado=null; 
    $datos=http_build_query($datos); 
    $url=parse_url($url); 

    // extract host and path: 
    $host=$url['host']; 
    $ruta=$url['path']; 

    $socket=fsockopen($host, 80, $errno, $errstr, 30); 

    if($socket) 
    { 
     // send the request headers: 
     fputs($socket, "POST $ruta HTTP/1.1\r\n"); 
     fputs($socket, "Host: $host\r\n"); 
     fputs($socket, "Content-type: application/x-www-form-urlencoded\r\n"); 
     fputs($socket, "Content-length: ". strlen($datos) ."\r\n"); 
     fputs($socket, "Connection: close\r\n\r\n"); 
     fputs($socket, $datos); 

     while(!feof($socket)) 
     { 
      $resultado.= fgets($socket, 128); 
     } 
    } 
    else die('ERROR'); 

    fclose($socket); 

    $resultado=explode("\r\n\r\n", $resultado, 2); 
    $header=isset($resultado[0]) ? $resultado[0] : ''; 
    $contenido=isset($resultado[1]) ? $resultado[1] : ''; 

    return array(
     'status' => 'ok', 
     'header' => $header, 
     'content' => $contenido 
     ); 
    } 
}; 

올바르게 기억하면 요청이 처리 될 때까지 스크립트가 진행되지 않습니다.

0

예 - cURL을 사용하면 응답 (또는 실패)을 기다립니다.

+0

그래서 돌아오고 스크립트가 걸려있는 시나리오를 계속 멈추게합니다. 나는 우리가 얼마나 많은 통제력을 가지고 있는지 궁금해. 즉, 예를 들어 1 초 후 서버에서 응답이 없으면 오류가 반환됩니다. – landed

+0

cURL 옵션보기 CURLOPT_LOW_SPEED_TIME (http://www.php.net/manual/en/function.curl-setopt.php) –

+0

곱슬 곱슬 함과 함께 많은 옵션이 있으며 여기에 컬을 사용하는이 예제를 보았습니다. 클라이언트 PHP 스크립트 http://net.tutsplus.com/tutorials/php/creating-an-api-centric-web-application/ 그래서이 기능을 사용하면 훨씬 더 자신감을 가질 수 있습니다. 타이 – landed

관련 문제