如何从PHP发送GET请求?


280

我打算将PHP用于一个简单的要求。我需要从URL下载XML内容,为此我需要向该URL发送HTTP GET请求。

如何在PHP中做到这一点?

Answers:


378

除非只需要文件内容,否则可以使用file_get_contents

$xml = file_get_contents("http://www.example.com/file.xml");

对于更复杂的事情,我将使用cURL


3
除非您需要使用查询字符串参数,否则这是正确的。
猛禽

2
@musicfreak:查询字符串有时会被某些服务器忽略以进行安全设置。同样,跨服务器查询可能会导致以下错误:failed to open stream: HTTP request failed!
Raptor

26
@ShivanRaptor:我不确定您在说什么...查询字符串只是字符串的一部分。服务器没有理由忽略它。显然,现在,file_get_contents您无法使用自定义Cookie,标头和浏览器通常会发送的其他内容进行请求,因此您可能无法获得所需的响应。在这种情况下,最好还是使用CURL。(但这不是OP的情况。)
Sasha Chedygov

1
卷毛比file_get_contents快得多。在高流量环境中
优先使用

2
@Sasha -我曾经面临这样的许多生产环境,但你可以看到这些链接现在:haltiko.blogspot.com/2013/02/...mdb9.wordpress.com/2011/03/06/...
德布

132

对于更高级的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);

10
尽管实际上并不需要使用CURL来满足“简单要求”,但+1是因为它确实是用PHP中的HTTP请求执行更高级操作的最佳解决方案。
xyz

如前所述,curl比快得多file_get_contents()。一个简单的4字母字符串大约需要10秒钟,而卷曲则需要更合理的〜1秒最大时间。
彼得·戈登

@pgmann确定结果吗?这与引用的其他统计数据不符。确实,CURL更快,但不应该那么快。响应时间的减少可能来自某些资源的服务器端缓存等吗?也许您应该重复测试?
Rauni Lillemets,2015年

1
@Rauni恐怕我无法重新测试,但是我总是使用cURL来提高速度,等等。请求时间是近似的,即加载页面时的感觉。我确实尝试了多次。
彼得·戈登

63

http_get应该可以。http_getover 的优点file_get_contents包括查看HTTP标头,访问请求详细信息以及控制连接超时的能力。

$response = http_get("http://www.example.com/file.xml");

83
HTTP扩展未与PHP捆绑在一起,并且通常在共享主机中不可用。
伊姆兰(Emran)2009年

27
这需要pecl_http> = 0.1.0,默认情况下未安装。
猛禽

5
“您正在寻找的手册页(us2.php.net/manual/en/function.http-get.php)目前在此服务器上不可用。”

20

请记住,如果您使用代理,则需要在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;
?>

9

根据您的php设置是否允许在URL上进行fopen,您还可以简单地使用字符串中的get参数来打开url(例如http://example.com?variable=value

编辑:重新阅读该问题,我不确定您是否要传递变量-如果不是,则可以简单地发送包含http://example.com/filename.xml的fopen请求-随意忽略变量=值部分



5

另一方面,使用其他服务器的REST API在PHP中非常流行。假设您正在寻找一种将一些HTTP请求重定向到另一台服务器的方法(例如,获取xml文件)。这是一个PHP软件包,可以帮助您:

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();

5

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();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.