Advertisement
ckpunmep

Untitled

Feb 1st, 2018
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 3.93 KB | None | 0 0
  1.     /**
  2.      * http post request
  3.      *
  4.      * @param string $url
  5.      * @param string $query
  6.      * @param integer $port
  7.      *
  8.      * @return mixed
  9.      */
  10.     public function sockPost($url, $query, $port = 80)
  11.     {
  12.         # ЗАДАЧА: сделать отправку данных на сервер через fsockopen, то есть используя только стандартные возможности php
  13.        # Если сервер с ответом тормозит, то обрывать соединение спустя 5 секунд и отдавать пользователю некий контент
  14.        # по умолчанию. Какую-то часть писал сам, кое-какой код нагуглил, поэтому не всё понимаю.
  15.        # Справился ли я с задачей? Какие недостатки? Что можно улучшить? Спасибо заранее, ОП.
  16.        $data = '';
  17.         $timeout = 5;
  18.         $urlInfo = parse_url($url);
  19.  
  20.         # С помощью @ подавляю ошибки fsockopen и возвращаю пустую $data
  21.        $fp = @fsockopen($urlInfo['host'], $port, $errno, $errstr, $timeout);
  22.         if (!$fp) {
  23.             return $data;
  24.         }
  25.  
  26.         # Какая разница между timeout в fsockopen и этой настройкой? Как правильно сделать?
  27.        stream_set_timeout($fp, $timeout);
  28.  
  29.         # Что значит non blocking mode? Зачем вообще нужна эта опция?
  30.        # Я только нашёл, что если его поставить в 0 то вместе с нужными мне данными
  31.        # от сервера придут ещё заголовки http запроса - не понятно как отделить их от нужных данных - получается
  32.        # лишний гемор, поэтому поставил в 1
  33.        stream_set_blocking($fp, 1);
  34.  
  35.         $metainfo = stream_get_meta_data($fp);
  36.  
  37.         # Эта часть мне полностью понятна. Единственное, что озадачивает: если я меняю версию HTTP на 1.1 то время
  38.        # ответа увеличивается в несколько раз! Почему так?
  39.        # Поэтому использую версию 1.0
  40.        $query = trim($query);
  41.         $head = 'POST ' . $urlInfo['path'] . " HTTP/1.0\r\n";
  42.         $head .= 'Host: ' . $urlInfo['host'] . "\r\n";
  43.         $head .= 'Referer: ' . $urlInfo['scheme'] . '://' . $urlInfo['host'] . $urlInfo['path'] . "\r\n";
  44.         $head .= "Content-type: application/x-www-form-urlencoded\r\n";
  45.         $head .= 'Content-Length: ' . mb_strlen($query) . "\r\n";
  46.         $head .= "\r\n";
  47.         $head .= $query;
  48.         fwrite($fp, $head);
  49.  
  50.         # Вот эту часть не понимаю - зачем вообще она нужна, но если её убрать то мне всегда вместе с данными с
  51.        # сервера приходят и заголовки, которые мне не нужны.
  52.        $header = '';
  53.         while ($str = trim(fgets($fp, 4096))) {
  54.             $header .= $str;
  55.         }
  56.  
  57.         # Если я правильно понял, metainfo['timed_out'] нужно, чтобы закрыть соединение,
  58.        # если ответ от сервера не пришёл за время, установленное stream_set_timeout.
  59.        # Собственно эта часть очень важна для меня, потому что мне нужно обрывать соединение при превышении таймаута.
  60.        while (!$metainfo['timed_out'] && !feof($fp)) {
  61.             $data .= fgets($fp, 4096);
  62.             $metainfo = stream_get_meta_data($fp);
  63.         }
  64.         return $data;
  65.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement