如何从 PHP 发送 GET 请求?
Posted
技术标签:
【中文标题】如何从 PHP 发送 GET 请求?【英文标题】:How to send a GET request from PHP? 【发布时间】:2010-10-31 20:07:09 【问题描述】:我打算将 php 用于一个简单的需求。我需要从 URL 下载 XML 内容,为此我需要向该 URL 发送 HTTP GET 请求。
我如何在 PHP 中做到这一点?
【问题讨论】:
对于所有不需要下载文件的人,请尝试get_headers($url);
有没有办法从 PHP 同步调用 html 文件? HTML 文件除了链接到使用 document.write() 返回值的 javascript 文件外什么都不做。换句话说,我想通过 PHP 在同一台服务器上运行 JavaScript 代码。我已经尝试了 file_get_contents 和 cURL,并且都返回 JavaScript 文件而不是它的输出。
【参考方案1】:
除非您需要的不仅仅是文件的内容,否则您可以使用file_get_contents
。
$xml = file_get_contents("http://www.example.com/file.xml");
对于更复杂的事情,我会使用cURL。
【讨论】:
这是正确的,除非你需要使用查询字符串参数。 @musicfreak:查询字符串有时会被某些服务器忽略以进行安全设置。此外,跨服务器查询可能会导致此错误:failed to open stream: HTTP request failed!
@ShivanRaptor:我不确定你在说什么......查询字符串只是字符串的一部分。服务器没有理由忽略它。现在,很明显,file_get_contents
不允许您使用自定义 cookie、标头和浏览器通常会发送的其他内容发出请求,因此您可能无法获得所需的响应。在这种情况下,你最好还是使用 CURL。 (但这不是 OP 的情况。)
Curl 比 file_get_contents 快得多。在高流量环境中更喜欢 Curl 而不是 file_get_contents
@Sasha - 我在许多生产环境中都遇到过这个问题,但你现在可以看到这些链接:haltiko.blogspot.com/2013/02/… 或 mdb9.wordpress.com/2011/03/06/…【参考方案2】:
对于更高级的 GET/POST 请求,您可以安装 CURL 库 (http://us3.php.net/curl):
$ch = curl_init("REMOTE XML FILE URL GOES HERE"); // such as http://example.com/example.xml
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, 0);
$data = curl_exec($ch);
curl_close($ch);
【讨论】:
虽然对于“简单的要求”确实没有任何必要使用 CURL,但 +1,因为它确实是在 PHP 中使用 HTTP 请求进行更高级操作的最佳解决方案。 如前所述,curl 比file_get_contents()
快得多。一个简单的 4 个字母的字符串大约需要 10 秒,而 curl 需要更合理的大约 1 秒。
@pgmann 你确定这个结果吗?这与引用的其他统计数据不符。确实,CURL 更快,但它不应该更快。也许这种响应时间的下降来自某些资源的服务器端缓存等?也许你应该重复测试?
@Rauni 恐怕我无法重新测试,但我总是使用 cURL 以提高速度等。请求时间是近似的,加载页面时的感觉。我确实尝试了多次。
注意!用于调试使用curl_setopt($ch, CURLOPT_VERBOSE, true);
。请注意,HTTPS 可能无法开箱即用。您需要下载并设置 CA 文件路径。见:***.com/a/14064903/333296【参考方案3】:
http_get
应该可以解决问题。 http_get
相对于file_get_contents
的优势包括能够查看 HTTP 标头、访问请求详细信息以及控制连接超时。
$response = http_get("http://www.example.com/file.xml");
【讨论】:
http 扩展未与 PHP 绑定,并且通常在共享主机中不可用。 这需要 pecl_http >= 0.1.0 ,默认不安装。 “您要查找的手册页 (us2.php.net/manual/en/function.http-get.php) 目前在此服务器上不可用。”【参考方案4】:请记住,如果您使用的是代理,您需要在您的 php 代码中做一些小技巧:
(PROXY WITHOUT AUTENTICATION EXAMPLE)
<?php
$aContext = array(
'http' => array(
'proxy' => 'proxy:8080',
'request_fulluri' => true,
),
);
$cxContext = stream_context_create($aContext);
$sFile = file_get_contents("http://www.google.com", False, $cxContext);
echo $sFile;
?>
【讨论】:
【参考方案5】:根据您的 php 设置是否允许在 URL 上打开 fopen,您也可以简单地使用字符串中的 get 参数打开 url(例如 http://example.com?variable=value )
编辑:重新阅读问题我不确定您是否要传递变量 - 如果不是,您可以简单地发送包含 http://example.com/filename.xml 的 fopen 请求 - 随意忽略变量=价值部分
【讨论】:
【参考方案6】:Guzzle 是一个非常有名的库,它使得执行各种 HTTP 调用变得非常容易。见https://github.com/guzzle/guzzle。使用composer require guzzlehttp/guzzle
安装并运行composer install
。现在下面的代码足以进行 http get 调用了。
$client = new \GuzzleHttp\Client();
$response = $client->get('https://example.com/path/to/resource');
echo $response->getStatusCode();
echo $response->getBody();
【讨论】:
【参考方案7】:我喜欢为此使用 fsockopen open。
【讨论】:
【参考方案8】:另一方面,使用服务器的 REST API 在 PHP 中非常流行。您可以假设所有 URL 都是 REST API 的一部分,并使用许多精心设计的 PHP 包。
实际上,REST API 是一种使用站点服务的方式。
因此,开发了许多 PHP 包来简化 REST API 调用。例如,这是一个非常好的:
https://github.com/romanpitak/PHP-REST-Client
使用此类包可以帮助您轻松获取资源。
因此,获取 xml 文件(您提到的)就像:
$client = new Client('http://example.com');
$request = $client->newRequest('/filename.xml');
$response = $request->getResponse();
echo $response->getParsedResponse();
【讨论】:
以上是关于如何从 PHP 发送 GET 请求?的主要内容,如果未能解决你的问题,请参考以下文章
php如何通过get方法发送http请求,并且得到返回的参数
php 直接发送GET请求 如何写 最好参数都在一个url里面 然后返回值是json?