2013-03-08 3 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/ Таким образом, это дает мне еще большую уверенность в его использовании. TY – landed

Смежные вопросы