Làm thế nào để gửi một yêu cầu GET từ PHP?


280

Tôi đang dự định sử dụng PHP cho một yêu cầu đơn giản. Tôi cần tải xuống một nội dung XML từ một URL mà tôi cần gửi yêu cầu HTTP GET đến URL đó.

Làm thế nào để tôi làm điều đó trong PHP?

Câu trả lời:


378

Trừ khi bạn cần nhiều hơn chỉ là nội dung của tệp, bạn có thể sử dụng file_get_contents.

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

Đối với bất cứ điều gì phức tạp hơn, tôi sẽ sử dụng cURL .


3
Điều này là chính xác, trừ khi bạn cần sử dụng các tham số chuỗi truy vấn.
Raptor

2
@musicfreak: chuỗi truy vấn đôi khi bị một số máy chủ bỏ qua cho cài đặt bảo mật. Ngoài ra, truy vấn máy chủ chéo có thể dẫn đến lỗi này:failed to open stream: HTTP request failed!
Raptor

26
@ShivanRaptor: Tôi không chắc bạn đang nói về điều gì ... Chuỗi truy vấn chỉ là một phần của chuỗi. Không có lý do gì một máy chủ sẽ bỏ qua nó. Bây giờ, rõ ràng, file_get_contentskhông cho phép bạn thực hiện yêu cầu với cookie, tiêu đề và các thứ khác mà trình duyệt thường gửi, do đó bạn có thể không nhận được phản hồi mà bạn đang tìm kiếm. Trong trường hợp đó, dù sao bạn cũng nên sử dụng CURL. (Nhưng đó không phải là trường hợp của OP.)
Sasha Chedygov

1
Curl là cách nhanh hơn file_get_contents. Thích Curl hơn file_get_contents trong môi trường lưu lượng truy cập cao
Deb

2
@Sasha - Tôi đã phải đối mặt này trên nhiều môi trường sản xuất nhưng bạn có thể thấy các liên kết cho bây giờ: haltiko.blogspot.com/2013/02/... hoặc mdb9.wordpress.com/2011/03/06/...
Deb

132

Đối với các yêu cầu GET / POST nâng cao hơn, bạn có thể cài đặt thư viện 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
Mặc dù thực sự không cần sử dụng CURL cho "yêu cầu đơn giản", +1, vì đó thực sự là giải pháp tốt nhất để thực hiện mọi thứ nâng cao hơn với các yêu cầu HTTP trong PHP.
xyz

Như đã đề cập, curl nhanh hơn nhiều file_get_contents(). Một chuỗi 4 chữ cái đơn giản mất khoảng 10 giây với nó, trong khi curl mất tối đa hợp lý hơn ~ 1 giây.
Peter Gordon

@pgmann Bạn có chắc chắn trong kết quả đó? điều này không phù hợp với các số liệu thống kê khác với những gì đã được trích dẫn. Thật vậy, CURL nhanh hơn, nhưng nó không nên nhanh hơn nhiều. Có lẽ sự sụt giảm thời gian phản hồi này đến từ bộ nhớ đệm phía máy chủ của một số tài nguyên, v.v? Có lẽ bạn nên lặp lại bài kiểm tra?
Rauni Lillemets 4/12/2015

1
@Rauni Tôi sợ rằng tôi không thể kiểm tra lại nhưng tôi luôn sử dụng cURL để tăng tốc độ, v.v. Thời gian yêu cầu là gần đúng, cảm giác như thế nào khi tải trang. Tôi đã thử nhiều lần.
Peter Gordon

63

http_getnên làm thủ thuật. Các ưu điểm của http_gethơn file_get_contentsbao gồm khả năng xem các tiêu đề HTTP, chi tiết yêu cầu truy cập và kiểm soát thời gian chờ kết nối.

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

83
tiện ích mở rộng http không được gói cùng với PHP và thường không có sẵn trong các máy chủ được chia sẻ.
Imran

27
điều này đòi hỏi pecl_http> = 0.1.0, không được cài đặt theo mặc định.
Raptor

5
"Trang hướng dẫn bạn đang tìm kiếm ( us2.php.net/manual/en/feft.http-get.php ) hiện không có sẵn trên máy chủ này."
Pang

20

Hãy nhớ rằng nếu bạn đang sử dụng proxy, bạn cần thực hiện một mẹo nhỏ trong mã php của mình:

(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

Tùy thuộc vào việc thiết lập php của bạn có cho phép fopen trên URL hay không, bạn cũng có thể chỉ cần mở url bằng các đối số get trong chuỗi (chẳng hạn như http://example.com?variable=value )

Chỉnh sửa: Đọc lại câu hỏi Tôi không chắc chắn liệu bạn có muốn chuyển các biến hay không - nếu bạn không, bạn chỉ có thể gửi yêu cầu fopen tiếp theo http://example.com/filename.xml - hãy thoải mái bỏ qua biến = phần giá trị



5

Mặt khác, sử dụng API REST của các máy chủ khác rất phổ biến trong PHP. Giả sử bạn đang tìm cách chuyển hướng một số yêu cầu HTTP sang máy chủ khác (ví dụ: nhận tệp xml). Đây là gói PHP giúp bạn:

https://github.com/romanpitak/PHP-REST-Client

Vì vậy, nhận tệp xml:

$client = new Client('http://example.com');
$request = $client->newRequest('/filename.xml');
$response = $request->getResponse();
echo $response->getParsedResponse();

5

Guheads là một thư viện rất nổi tiếng, giúp thực hiện tất cả các loại cuộc gọi HTTP cực kỳ dễ dàng. Xem https://github.com/guheads/guheads . Cài đặt với composer require guzzlehttp/guzzlevà chạy composer install. Bây giờ mã dưới đây là đủ cho một cuộc gọi http.

$client = new \GuzzleHttp\Client();
$response = $client->get('https://example.com/path/to/resource');

echo $response->getStatusCode();
echo $response->getBody();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.