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.
Bạn có cần làm bất kỳ điều gì với kết quả tải curl không? –
Không có gì cả. – Rob