2010-04-22 8 views
10

Đây là mã hiện tại của tôi:Làm cách nào để sử dụng cURL để mở nhiều URL cùng lúc với PHP?

$SQL = mysql_query("SELECT url FROM urls") or die(mysql_error()); //Query the urls table 
while($resultSet = mysql_fetch_array($SQL)){ //Put all the urls into one variable 

       // Now for some cURL to run it. 
      $ch = curl_init($resultSet['url']); //load the urls 
      curl_setopt($ch, CURLOPT_TIMEOUT, 2); //No need to wait for it to load. Execute it and go. 
      curl_exec($ch); //Execute 
      curl_close($ch); //Close it off 
     } //While loop 

Tôi tương đối mới đối với cURL. Bởi tương đối mới, tôi có nghĩa là đây là lần đầu tiên tôi sử dụng cURL. Hiện tại, nó tải một giây trong hai giây, sau đó tải bản tiếp theo trong 2 giây, sau đó tải tiếp theo. tuy nhiên, tôi muốn làm cho nó tải TẤT CẢ của họ cùng một lúc. Tôi chắc chắn nó có thể, tôi chỉ không chắc chắn như thế nào. Nếu ai đó có thể chỉ cho tôi đúng hướng, tôi sẽ đánh giá cao nó.

+0

Bạn có cần làm bất kỳ điều gì với kết quả tải curl không? –

+0

Không có gì cả. – Rob

Trả lời

8

Bạn thiết lập từng bộ xử lý cURL theo cách tương tự, sau đó thêm chúng vào tay cầm curl_multi_. Các chức năng để xem xét là các hàm curl_multi_*documented here. Theo kinh nghiệm của tôi, có vấn đề với việc cố gắng tải quá nhiều URL cùng một lúc (mặc dù hiện tại tôi không thể tìm thấy ghi chú của mình), vì vậy lần cuối tôi sử dụng curl_mutli_, tôi thiết lập để thực hiện các đợt 5 URL cùng một lúc.

chỉnh sửa: Đây là một phiên bản thu gọn của mã tôi đã sử dụng curl_multi_:

chỉnh sửa: Hơi viết lại và rất nhiều ý kiến ​​bổ sung, mà hy vọng sẽ giúp đỡ.

// -- create all the individual cURL handles and set their options 
$curl_handles = array(); 
foreach ($urls as $url) { 
    $curl_handles[$url] = curl_init(); 
    curl_setopt($curl_handles[$url], CURLOPT_URL, $url); 
    // set other curl options here 
} 

// -- start going through the cURL handles and running them 
$curl_multi_handle = curl_multi_init(); 

$i = 0; // count where we are in the list so we can break up the runs into smaller blocks 
$block = array(); // to accumulate the curl_handles for each group we'll run simultaneously 

foreach ($curl_handles as $a_curl_handle) { 
    $i++; // increment the position-counter 

    // add the handle to the curl_multi_handle and to our tracking "block" 
    curl_multi_add_handle($curl_multi_handle, $a_curl_handle); 
    $block[] = $a_curl_handle; 

    // -- check to see if we've got a "full block" to run or if we're at the end of out list of handles 
    if (($i % BLOCK_SIZE == 0) or ($i == count($curl_handles))) { 
     // -- run the block 

     $running = NULL; 
     do { 
      // track the previous loop's number of handles still running so we can tell if it changes 
      $running_before = $running; 

      // run the block or check on the running block and get the number of sites still running in $running 
      curl_multi_exec($curl_multi_handle, $running); 

      // if the number of sites still running changed, print out a message with the number of sites that are still running. 
      if ($running != $running_before) { 
       echo("Waiting for $running sites to finish...\n"); 
      } 
     } while ($running > 0); 

     // -- once the number still running is 0, curl_multi_ is done, so check the results 
     foreach ($block as $handle) { 
      // HTTP response code 
      $code = curl_getinfo($handle, CURLINFO_HTTP_CODE); 

      // cURL error number 
      $curl_errno = curl_errno($handle); 

      // cURL error message 
      $curl_error = curl_error($handle); 

      // output if there was an error 
      if ($curl_error) { 
       echo(" *** cURL error: ($curl_errno) $curl_error\n"); 
      } 

      // remove the (used) handle from the curl_multi_handle 
      curl_multi_remove_handle($curl_multi_handle, $handle); 
     } 

     // reset the block to empty, since we've run its curl_handles 
     $block = array(); 
    } 
} 

// close the curl_multi_handle once we're done 
curl_multi_close($curl_multi_handle); 

Cho rằng bạn không cần bất cứ điều gì trở lại từ các URL, bạn có lẽ không cần rất nhiều về những gì ở đó, nhưng đây là cách tôi chunked yêu cầu thành các khối của BLOCK_SIZE, đợi cho mỗi khối để chạy trước khi tiếp tục và phát hiện lỗi từ cURL.

+0

Tất cả những gì tôi sẽ làm là tải từng url (và các url sẽ tải là các trang trống, truy cập các url chỉ bắt đầu một tập lệnh và làm cho nó chạy trong một khoảng thời gian định trước) và không lưu hoặc xuất bất kỳ dữ liệu nào. Bạn có nghĩ rằng nó sẽ gây ra bất kỳ vấn đề trong trường hợp này? – Rob

+0

Tôi đoán là nó sẽ không là vấn đề trong trường hợp đó, nhưng tôi không biết chắc chắn - nếu nó không chạy hoặc lỗi khi bạn cố tải tất cả chúng cùng một lúc, bạn có thể đặt một bộ đếm trong vòng lặp 'while' của bạn và bất cứ khi nào' counter% batch_size == 0' bên trong vòng lặp, hãy chạy batch và xóa nó. – Isaac

+0

Woah. ghét phải làm phiền bạn với điều này, nhưng bạn có thể xin vui lòng bình luận một số công cụ trong mã đó để tôi có thể nhìn thấy những gì tất cả mọi thứ không chính xác? – Rob