- <?php
- /**
- * 异步请求
- * @author
- * @see
- * @version 1.0.1 2023-07-11
- */
- namespace Classes\Function;
- class AsynRequest
- {
- /**
- * 获取URL各参数
- * @param string $url
- * @return array
- */
- private static function getUrlInfo(string $url): array
- {
- $url_arr = parse_url($url);
- $url_info = [
- 'hostname' => $url_arr['host'],
- 'host' => $url_arr['host'],
- 'port' => 80,
- 'path' => $url_arr['path'] ?? '/'
- ];
- if ('https' === $url_arr['scheme']) {
- $url_info['hostname'] = 'ssl://' . $url_arr['host'];
- $url_info['port'] = 443;
- }
- return $url_info;
- }
- /**
- * GET请求
- * @param string $url
- * @param array $data = []
- * @param int $timeout = 20
- * @return bool
- */
- public static function get(string $url, array $data = [], int $timeout = 20): bool
- {
- $url_info = self::getUrlInfo($url);
- $data = http_build_query($data);
- $fp = fsockopen($url_info['hostname'], $url_info['port'], $errno, $errstr, $timeout);
- if (!$fp) {
- return false;
- }
- stream_set_blocking($fp, true);
- stream_set_timeout($fp, $timeout);
- $out = 'GET ' . $url_info['path'] . '?' . $data . ' HTTP/1.1' . PHP_EOL;
- $out .= 'Host: ' . $url_info['host'] . PHP_EOL;
- $out .= 'Content-Type: text/xml; charset=utf-8' . PHP_EOL;
- $out .= 'Connection: Close' . PHP_EOL . PHP_EOL;
- fputs($fp, $out);
- while (!feof($fp)) {
- echo fgets($fp, 128);
- }
- usleep(10000);
- fclose($fp);
- return true;
- }
- /**
- * POST请求
- * @param string $url
- * @param array $data = []
- * @param int $timeout = 20
- * @param string $content_type = 'application/json'
- * @return bool
- */
- public static function post(string $url, array $data = [], int $timeout = 20, string $content_type = 'application/json'): bool
- {
- $url_info = self::getUrlInfo($url);
- $data = json_encode($data);
- $fp = fsockopen($url_info['hostname'], $url_info['port'], $errno, $errstr, $timeout);
- if (!$fp) {
- return false;
- }
- stream_set_blocking($fp, true);
- stream_set_timeout($fp, $timeout);
- $out = 'POST ' . $url_info['path'] . ' HTTP/1.1' . PHP_EOL;
- $out .= 'Host: ' . $url_info['host'] . PHP_EOL;
- $out .= 'Content-Type: ' . $content_type . '; charset=utf-8' . PHP_EOL;
- $out .= 'Content-Length: ' . strlen($data) . PHP_EOL;
- $out .= 'Connection: Close' . PHP_EOL . PHP_EOL;
- $out .= $data . PHP_EOL;
- fwrite($fp, $out);
- while (!feof($fp)) {
- echo fgets($fp, 128);
- }
- usleep(10000);
- fclose($fp);
- return true;
- }
- }
复制代码 |