[php] PHP에서 비동기 GET 요청을 어떻게합니까?

다른 서버의 다른 스크립트에 간단한 GET 요청을 만들고 싶습니다. 어떻게해야합니까?

어떤 경우에는 출력없이 외부 스크립트를 요청하기 만하면됩니다.

make_request('http://www.externalsite.com/script1.php?variable=45'); //example usage

두 번째 경우에는 텍스트 출력이 필요합니다.

$output = make_request('http://www.externalsite.com/script2.php?variable=45');
echo $output; //string output

솔직히 말해서 CURL이 실제로 CURL의 일이 아니기 때문에 CURL을 엉망으로 만들고 싶지 않습니다. 또한 PECL 확장이 없기 때문에 http_get을 사용하고 싶지 않습니다.

fsockopen이 작동할까요? 그렇다면 파일 내용을 읽지 않고 어떻게해야합니까? 다른 방법은 없나요?

모두 감사합니다

최신 정보

첫 번째 경우 스크립트가 아무것도 반환 할 때까지 기다릴 필요가 없습니다. 내가 이해했듯이 file_get_contents ()는 페이지가 완전히로드 될 때까지 기다릴 것입니다.



답변

file_get_contents 당신이 원하는 것을 할 것입니다

$output = file_get_contents('http://www.example.com/');
echo $output;

편집 : GET 요청을 시작하고 즉시 반환하는 한 가지 방법입니다.

http://petewarden.typepad.com/searchbrowser/2008/06/how-to-post-an.html 에서 인용

function curl_post_async($url, $params)
{
    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);

    $fp = fsockopen($parts['host'],
        isset($parts['port'])?$parts['port']:80,
        $errno, $errstr, 30);

    $out = "POST ".$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";
    if (isset($post_string)) $out.= $post_string;

    fwrite($fp, $out);
    fclose($fp);
}

이것이하는 일은 소켓을 열고 get 요청을 실행 한 다음 즉시 소켓을 닫고 반환하는 것입니다.


답변

이것은 Marquis의 답변이 POST 및 GET 요청 모두에서 작동하도록하는 방법입니다.

  // $type must equal 'GET' or 'POST'
  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);

      $fp = fsockopen($parts['host'],
          isset($parts['port'])?$parts['port']:80,
          $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);
  }


답변

업데이트와 관련하여 전체 페이지가로드 될 때까지 기다리지 않고 HTTP HEAD요청이 필요한 것 같습니다.

get_headers 는이 작업을 수행해야합니다. 헤더 만 요청하므로 전체 페이지 콘텐츠가 전송되지 않습니다.

“PHP / Curl : 일부 사이트에서 HEAD 요청이 오래 걸립니다”HEADPHP / Curl을 사용하여 요청 을 수행하는 방법을 설명합니다.

요청을 트리거하고 스크립트를 전혀 유지하지 않으려는 경우 다양한 복잡성의 몇 가지 방법이 있습니다.

  • HTTP 요청을 백그라운드 프로세스로 실행하고 , PHP는 백그라운드 프로세스를 실행합니다. 기본적으로 다음과 같은 것을 실행합니다. "wget -O /dev/null $carefully_escaped_url"이는 플랫폼에 따라 다르며 매개 변수를 명령으로 이스케이프 하는 데 매우 주의해야합니다.
  • 백그라운드에서 PHP 스크립트 실행 -기본적으로 UNIX 프로세스 방법과 동일하지만 쉘 명령이 아닌 PHP 스크립트 실행
  • 데이터베이스 (또는 과잉 일 가능성이있는 beanstalkd 와 같은 것)를 사용하여 “작업 대기열”을 만드십시오 . 대기열에 URL을 추가하면 백그라운드 프로세스 또는 cron-job이 정기적으로 새 작업을 확인하고 URL에 대한 요청을 수행합니다.

답변

당신은하지 않습니다. PHP는 URL을 호출하는 많은 방법을 제공하지만 요청 / 실행주기마다 모든 종류의 비동기 / 스레드 처리를 수행하는 즉시 지원을 제공하지 않습니다. 의 URL (또는 SQL 문, 또는 등)에 대한 요청을 보내는 모든 방법을 기다릴 것입니다 어떤 반응의 종류. 이를 위해서는 로컬 컴퓨터에서 실행되는 일종의 보조 시스템이 필요합니다 ( “php 작업 대기열”에 대한 Google 검색).


답변

잘 테스트 된 PHP 라이브러리를 추천합니다. curl-easy

<?php
$request = new cURL\Request('http://www.externalsite.com/script2.php?variable=45');
$request->getOptions()
    ->set(CURLOPT_TIMEOUT, 5)
    ->set(CURLOPT_RETURNTRANSFER, true);

// add callback when the request will be completed
$request->addListener('complete', function (cURL\Event $event) {
    $response = $event->response;
    $content = $response->getContent();
    echo $content;
});

while ($request->socketPerform()) {
    // do anything else when the request is processed
}


답변

Linux 환경을 사용하는 경우 PHP의 exec 명령을 사용하여 linux curl을 호출 할 수 있습니다. 다음은 비동기 HTTP 게시물을 만드는 샘플 코드입니다.

function _async_http_post($url, $json_string) {
  $run = "curl -X POST -H 'Content-Type: application/json'";
  $run.= " -d '" .$json_string. "' " . "'" . $url . "'";
  $run.= " > /dev/null 2>&1 &";
  exec($run, $output, $exit);
  return $exit == 0;
}

이 코드는 추가 PHP 라이브러리가 필요하지 않으며 10 밀리 초 이내에 http 게시물을 완료 할 수 있습니다.


답변

function make_request($url, $waitResult=true){
    $cmi = curl_multi_init();

    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

    curl_multi_add_handle($cmi, $curl);

    $running = null;
    do {
        curl_multi_exec($cmi, $running);
        sleep(.1);
        if(!$waitResult)
        break;
    } while ($running > 0);
    curl_multi_remove_handle($cmi, $curl);
    if($waitResult){
        $curlInfos = curl_getinfo($curl);
        if((int) $curlInfos['http_code'] == 200){
            curl_multi_close($cmi);
            return curl_multi_getcontent($curl);
        }
    }
    curl_multi_close($cmi);
}