PHP, GET/POST запрос без file_get_contents и curl

Бывает такое, что на дешёвых хостингах в PHP запрещено использование  file_get_contents и curl, а вам нужно получить данные с другого сервера. Для этого можно попробовать использовать сокеты с помощью fsockopen.

$fp = fsockopen("example.com", 80, $errno, $errstr, 30);
$result = "";

if (!$fp) 
{
  exit("ERROR");
}
else 
{
  $out = "GET /file.txt HTTP/1.1rn";
  $out .= "Host: example.comrn";
  $out .= "User-Agent: SomeBrowser v1.2.3rn";
  $out .= "Connection: Closernrn";
  fwrite($fp, $out);

  while (!feof($fp)) 
  {
    $result .= fgets($fp, 128);
  }

  fclose($fp);
}
$result = substr($result, strpos($result, "rnrn") + 1);

После выполнения, в переменной $result будет находиться ответ сервера на GET запрос. Если мы запрашивали файл, то в $result будет содержимое файла. В последней строке мы выполняем substr, чтобы отрезать заголовки ответа.

POST запрос выполняется аналогично, только нужно изменить в переменной $out GET на POST, добавить заголовок Content-Length, равный размеру посылаемых данных, добавить заголовок Content-Type и в конце дописать сами данные.

$post_data = "id=1&name=Alesha"

$out = "POST /api HTTP/1.1rn";
$out .= "Host: example.comrn";
$out .= "User-Agent: SomeBrowser v1.2.3rn";
$out .= "Content-Length:" . strlen($post_data) . "rn";
$out .= "Content-Type: application/x-www-form-urlencodedrn";
$out .= "Connection: Closernrn";
$out .= $post_data;

 

Оставьте комментарий