2011-09-21 18 views
5

Tôi đang chạy trang web của trình đọc nguồn cấp dữ liệu, nơi sẽ có nhiều RSS xung quanh. Tôi sẽ phải đồng bộ hóa những nguồn cấp dữ liệu đó thường xuyên nhất có thể, vì vậy tôi đã tìm thấy hai phương pháp này để thực hiện nó.CURL hoặc file_get_contents để cập nhật danh sách nguồn cấp dữ liệu?

1 phương pháp: Sử dụng CURL

$weblog_name = 'MyBlog'; 
$weblog_url = 'http://feeds.feedburner.com/myblog'; 
$ping_url = 'http://ping.feedburner.com'; 

$request = <<<EOT 
<?xml version="1.0" encoding="iso-8859-1"?> 
<methodCall> 
<methodName>weblogUpdates.ping</methodName> 
<params> 
<param> 
    <value> 
    <string>$weblog_name</string> 
    </value> 
</param> 
<param> 
    <value> 
    <string>$weblog_url</string> 
    </value> 
</param> 
</params> 
</methodCall> 
EOT; 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $ping_url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, trim($request)); 
$result = curl_exec($ch); 
curl_close($ch); 

Phương pháp thứ hai: file_get_contents

file_get_contents("http://feedburner.google.com/fb/a/pingSubmit?bloglink=http://feeds.feedburner.com/myblog"); 

Câu hỏi của tôi là đó là giải pháp tốt hơn và nhanh hơn để ping ít nhất 50 thức ăn cùng một lúc?

Trả lời

12

Tìm nạp các google.com bằng file_get_contents mất (tính bằng giây):

2.31319094 
2.30374217 
2.21512604 
3.30553889 
2.30124092 

CURL mất:

0.68719101 
0.64675593 
0.64326 
0.81983113 
0.63956594 

này đã sử dụng các lớp chuẩn từ http://davidwalsh.name/php-timer-benchmark

1

get_file_contents nhanh hơn. Nó thực hiện một http đơn giản mà không cần thêm bất kỳ instantiations nào

+0

Tôi không quen thuộc với Curl , nó có nhận được nội dung không? Ý tôi là nó hoạt động như thế nào? Ngoài ra, sẽ có 50 get_file_contents cùng một lúc rất chậm? – EnexoOnoma

+1

cURL cũng sẽ nhận được tiêu đề cho yêu cầu http. Bạn có thể thêm tiêu đề yêu cầu, biến bài đăng và máy chủ proxy của riêng mình vào cURL. Tuy nhiên, đối với một yêu cầu nhận đơn giản, cURL là không cần thiết. Tôi tìm thấy cURL mất hơn 10 ms trên máy chủ wamp của tôi apache2.2.17 php5.3.5 cho http://www.google.com –

+0

@mtopia nó không thực sự tạo sự khác biệt vì get_file_contents là đồng bộ, tức là dòng tiếp theo được thực thi chỉ sau khi dòng này đã được thực hiện hoàn toàn –

2

Tôi muốn giới thiệu xem xét sử dụng curl ... trong khi nó có thể là một số chi phí phát triển ngay từ cái nhìn đầu tiên, đó là mạnh hơn rất nhiều so với đào tạo Quản lý . đặc biệt là nếu bạn muốn lấy nhiều thức ăn, curl yêu cầu đa có thể là giá trị xem xét:

http://php.net/manual/en/function.curl-multi-init.php

2

Nếu bạn muốn sự linh hoạt cho tương lai (ví dụ xác thực, Cookies, Proxy vv) sau đó sử dụng cURL. Tốc độ giống như file_get_contents() đánh giá từ điểm chuẩn (một số nói nhanh hơn)

Nếu bạn muốn một giải pháp nhanh chóng và dễ dàng thì sử dụng file_get_contents(). Tuy nhiên, nó không được xây dựng cho mục đích yêu cầu URL bên ngoài. Hầu hết mọi người thề bởi cURL vì đã thực hiện bất kỳ công việc nào với URL bên ngoài, thậm chí cả các yêu cầu GET đơn giản.

Công việc bổ sung duy nhất với việc sử dụng cURL là một vài dòng mã bổ sung, bọc nó trong một hàm và bạn nên làm.

3

Bởi vì bạn sẽ được cập nhật 50 feeds cùng một lúc, Tôi mạnh mẽ sẽ đề nghị sử dụng CURL vì hai lý do:

  1. bạn có thể sử dụng curl_multi() chức năng này sẽ cho phép bạn gửi tất cả 50 yêu cầu cùng một lúc, trong khi file_get_contents() sẽ chỉ đi từng người một. Tài liệu cho các chức năng này hơi thưa thớt, vì vậy tôi khuyên bạn nên sử dụng thư viện nhẹ - việc này dễ dàng hơn nhiều để làm việc với . Cá nhân tôi sử dụng https://github.com/petewarden/ParallelCurl, nhưng bạn sẽ tìm thấy nhiều xung quanh.

  2. khi bạn đang ping dịch vụ, bạn không thực sự cần biết phản hồi, tôi đoán (miễn là HTTP 200). Vì vậy, bạn có thể sử dụng tùy chọn CURL CURLOPT_NOBODY để biến nó thành yêu cầu HEAD, do đó để phản hồi bạn cũng sẽ chỉ nhận được tiêu đề. Điều này nên tốc độ tăng quy trình hơn nữa.

Nói cách khác, file_get_contents có thể nhanh hơn cho các yêu cầu đơn giản, nhưng trong trường hợp này tình huống của bạn không đơn giản. Bắn 50 yêu cầu mà không thực sự cần thiết để nhận lại toàn bộ tài liệu không phải là yêu cầu chuẩn.

Các vấn đề liên quan