PHP cURL so với file_get_contents


111

Làm thế nào để hai đoạn mã này khác nhau khi truy cập API REST?

$result = file_get_contents('http://api.bitly.com/v3/shorten?login=user&apiKey=key&longUrl=url');

$ch = curl_init('http://api.bitly.com/v3/shorten?login=user&apiKey=key&longUrl=url');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);

Cả hai đều tạo ra cùng một kết quả, đánh giá bởi

print_r(json_decode($result))

2
cURLcó khả năng hơn nhiều file_get_contents. Như vậy là đủ.

18
FWIW có rất ít sự khác biệt về tốc độ. Tôi vừa hoàn thành việc tìm nạp 5.000 URL và lưu HTML của chúng vào các tệp (khoảng 200 nghìn mỗi tệp). Tôi đã làm một nửa với curl và một nửa với file_get_contents như một thử nghiệm và không có sự khác biệt rõ ràng.
David Gilbertson

8
Có thể gửi dữ liệu bài đăng bằng file_get_contents, miễn là bạn đang sử dụng phiên bản hỗ trợ ngữ cảnh luồng.
Chris Strickland

Câu trả lời:


129

file_get_contents()là một tuốc nơ vít đơn giản. Tuyệt vời cho các yêu cầu GET đơn giản trong đó tiêu đề, phương thức yêu cầu HTTP, thời gian chờ, cookiejar, chuyển hướng và những thứ quan trọng khác không quan trọng.

fopen()với bối cảnh luồng hoặc cURL với setopt là những powerdrills với mọi bit và tùy chọn bạn có thể nghĩ ra.


17
Để ở trong phép ẩn dụ đó, hãy lưu ý rằng cURL là một máy khoan động lực với một mâm cặp khoan phức tạp, đòi hỏi bạn phải biết khá rõ để thực sự thay đổi nó (đọc: thiết lập các tùy chọn cURL hơi tẻ nhạt, nhưng cho phép làm bất cứ điều gì bạn muốn).
poke

20
file_get_contentscũng cho phép thiết lập ngữ cảnh, có nghĩa là bạn có thể đặt các trường tiêu đề theo ý muốn.
velop

4
và như ngoài bình luận @ velop, thông qua bối cảnh dòng nó cũng có thể gửi POST, PUT, xác thực, tiêu đề, nội dung, proxy, và nhiều hơn nữa với một file_get_contents yêu cầu
Markus Köhler

@velop: Có. Và cả phương pháp nữa. Và chuyển hướng. Và thời gian chờ ... php.net/manual/en/context.http.php
Sz.

25

Ngoài ra, do một số vụ hack trang web gần đây, chúng tôi đã phải bảo mật trang web của mình nhiều hơn. Khi làm như vậy, chúng tôi phát hiện ra rằng file_get_contents không hoạt động, nơi curl vẫn hoạt động.

Không phải 100%, nhưng tôi tin rằng cài đặt php.ini này có thể đã chặn yêu cầu file_get_contents .

; Disable allow_url_fopen for security reasons
allow_url_fopen = 0

Dù bằng cách nào, mã của chúng tôi hiện hoạt động với curl .


9
Có, file_get_contentsyêu cầu allow_url_fopenphải trung thực.
Costa

2
Có, nhiều công ty lưu trữ đang vô hiệu hóa file_get_contents()do nhiều khai thác được biết là sử dụng chức năng. cURL là hàm mà mọi người nên sử dụng trong mã ngay bây giờ.
bực bội trong công nghệ

15
@frustratedtech Đây là những "khai thác" gì?
rdlowrey

3
Các công ty lưu trữ vô hiệu hóa allow_url_fopenvì họ đã nhầm lẫn allow_url_include. allow_url_fopenfile_get_contentssử dụng tốt.
fritzmg

2
@vr_driver các liên kết này không có gì để làm vớifile_get_contents()
rdlowrey

19

Đây là chủ đề cũ nhưng trong thử nghiệm cuối cùng của tôi trên một API của tôi, cURL nhanh hơn và ổn định hơn. Đôi khi file_get_contents theo yêu cầu lớn hơn cần hơn 5 giây trong khi cURL chỉ cần từ 1,4 đến 1,9 giây, nhanh hơn gấp đôi.

Tôi cần thêm một lưu ý về điều này rằng tôi chỉ gửi GET và nhận nội dung JSON. Nếu bạn thiết lập cURL đúng cách, bạn sẽ có phản hồi tuyệt vời. Chỉ cần "nói" với cURL những gì bạn cần gửi và những gì bạn cần nhận và thế là xong.

Trên exampe của bạn, tôi muốn thực hiện thiết lập này:

$ch =  curl_init('http://api.bitly.com/v3/shorten?login=user&apiKey=key&longUrl=url');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
    curl_setopt($ch, CURLOPT_TIMEOUT, 3);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json'));
$result = curl_exec($ch);

Yêu cầu này sẽ trả về dữ liệu trong thời gian tối đa là 0,01 giây


1
0,1 MICRO giây (1 / 1.000 của MILI giây) ... Tôi cảm thấy khó tin.
Mark Tomlin

Đúng. Tôi có một số phản hồi trong 0,02ms, ví dụ: kiểm tra số điện thoại API Twilio. Là nhanh chóng.
Ivijan Stefan Stipić

4
0,02ms = 20 micro giây; bạn đã nói 0,1 micro giây mà không thể đúng.
Walf

2
Điều này nhanh hơn gần gấp đôi so với việc file_get_contents tôi chỉ thực hiện một số lệnh gọi API để xác nhận. 0,8 giây cho file_get_contents& 0,49 giây cho curl(3 cuộc gọi API)
JSP

1
Bạn nên sử dụng thiết lập của riêng bạn. Sau đó, các truy vấn của bạn sẽ đi từ 1,4-1,9 giây đến 0,01 giây;)
Rauli Rajande
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.