Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * http post request
- *
- * @param string $url
- * @param string $query
- * @param integer $port
- *
- * @return mixed
- */
- public function sockPost($url, $query, $port = 80)
- {
- # ЗАДАЧА: сделать отправку данных на сервер через fsockopen, то есть используя только стандартные возможности php
- # Если сервер с ответом тормозит, то обрывать соединение спустя 5 секунд и отдавать пользователю некий контент
- # по умолчанию. Какую-то часть писал сам, кое-какой код нагуглил, поэтому не всё понимаю.
- # Справился ли я с задачей? Какие недостатки? Что можно улучшить? Спасибо заранее, ОП.
- $data = '';
- $timeout = 5;
- $urlInfo = parse_url($url);
- # С помощью @ подавляю ошибки fsockopen и возвращаю пустую $data
- $fp = @fsockopen($urlInfo['host'], $port, $errno, $errstr, $timeout);
- if (!$fp) {
- return $data;
- }
- # Какая разница между timeout в fsockopen и этой настройкой? Как правильно сделать?
- stream_set_timeout($fp, $timeout);
- # Что значит non blocking mode? Зачем вообще нужна эта опция?
- # Я только нашёл, что если его поставить в 0 то вместе с нужными мне данными
- # от сервера придут ещё заголовки http запроса - не понятно как отделить их от нужных данных - получается
- # лишний гемор, поэтому поставил в 1
- stream_set_blocking($fp, 1);
- $metainfo = stream_get_meta_data($fp);
- # Эта часть мне полностью понятна. Единственное, что озадачивает: если я меняю версию HTTP на 1.1 то время
- # ответа увеличивается в несколько раз! Почему так?
- # Поэтому использую версию 1.0
- $query = trim($query);
- $head = 'POST ' . $urlInfo['path'] . " HTTP/1.0\r\n";
- $head .= 'Host: ' . $urlInfo['host'] . "\r\n";
- $head .= 'Referer: ' . $urlInfo['scheme'] . '://' . $urlInfo['host'] . $urlInfo['path'] . "\r\n";
- $head .= "Content-type: application/x-www-form-urlencoded\r\n";
- $head .= 'Content-Length: ' . mb_strlen($query) . "\r\n";
- $head .= "\r\n";
- $head .= $query;
- fwrite($fp, $head);
- # Вот эту часть не понимаю - зачем вообще она нужна, но если её убрать то мне всегда вместе с данными с
- # сервера приходят и заголовки, которые мне не нужны.
- $header = '';
- while ($str = trim(fgets($fp, 4096))) {
- $header .= $str;
- }
- # Если я правильно понял, metainfo['timed_out'] нужно, чтобы закрыть соединение,
- # если ответ от сервера не пришёл за время, установленное stream_set_timeout.
- # Собственно эта часть очень важна для меня, потому что мне нужно обрывать соединение при превышении таймаута.
- while (!$metainfo['timed_out'] && !feof($fp)) {
- $data .= fgets($fp, 4096);
- $metainfo = stream_get_meta_data($fp);
- }
- return $data;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement