cURL เป็นเครื่องมือที่ใช้ไวยากรณ์ URL เพื่อถ่ายโอนไฟล์และข้อมูล รองรับโปรโตคอลมากมาย เช่น HTTP, FTP, TELNET เป็นต้น สิ่งที่ดีที่สุดคือ php รองรับไลบรารี cURL ด้วย บทความนี้จะแนะนำคุณสมบัติขั้นสูงของ cURL และวิธีการใช้งานใน PHP
ทำไมต้องใช้ cURL?
ใช่ เราสามารถรับเนื้อหาเว็บผ่านวิธีการอื่นได้ ส่วนใหญ่แล้ว เพราะฉันอยากจะขี้เกียจ ฉันเลยใช้ฟังก์ชัน php ง่ายๆ:
$content = file_get_contents(" http://www.bizhicool.com ");
// หรือ
$lines = file(" http://www.bizhicool.com ");
// หรือ
readfile( http://www.bizhicool.com ); อย่างไรก็ตาม วิธีการนี้ไม่มีความยืดหยุ่นและการจัดการข้อผิดพลาดที่มีประสิทธิภาพ ยิ่งไปกว่านั้น คุณไม่สามารถใช้มันเพื่อทำงานที่ยากบางอย่างได้ เช่น การจัดการคุกกี้ การตรวจสอบความถูกต้อง การส่งแบบฟอร์ม การอัพโหลดไฟล์ ฯลฯ
cURL เป็นไลบรารีที่มีประสิทธิภาพซึ่งสนับสนุนโปรโตคอลและตัวเลือกต่างๆ มากมาย และสามารถให้รายละเอียดต่างๆ ที่เกี่ยวข้องกับคำขอ URL
โครงสร้างพื้นฐาน ก่อนที่จะเรียนรู้เกี่ยวกับฟังก์ชันที่ซับซ้อนมากขึ้น เรามาดูขั้นตอนพื้นฐานของการตั้งค่าคำขอ cURL ใน PHP กัน:
เริ่มต้น ตั้งค่าตัวแปร ดำเนินการและรับผลลัพธ์ ปล่อยตัวจัดการ cURL
// 1. การเริ่มต้น
$ch = curl_init();
// 2. ตั้งค่าตัวเลือกรวมถึง URL
curl_setopt($ch, CURLOPT_URL, " http://www.bizhicool.com ");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
// 3. ดำเนินการและรับเนื้อหาของเอกสาร HTML
$output = curl_exec($ch);
// 4. ปล่อยที่จับขด
curl_close($ch); ขั้นตอนที่สอง (นั่นคือ curl_setopt()) เป็นสิ่งสำคัญที่สุด และความลึกลับทั้งหมดอยู่ที่นี่ มีรายการพารามิเตอร์ cURL จำนวนมากที่สามารถตั้งค่าได้ซึ่งระบุรายละเอียดต่างๆ ของคำขอ URL การอ่านและทำความเข้าใจทั้งหมดพร้อมกันอาจเป็นเรื่องยาก ดังนั้นวันนี้เราจะลองใช้ตัวเลือกทั่วไปและมีประโยชน์เท่านั้น
การตรวจสอบข้อผิดพลาด คุณสามารถเพิ่มคำสั่งเพื่อตรวจสอบข้อผิดพลาด (แม้ว่าจะไม่จำเป็น):
-
$output = curl_exec($ch);
ถ้า ($เอาท์พุท === FALSE) {
echo "ข้อผิดพลาด cURL:" .curl_error($ch);
-
// ...โปรดทราบว่าเราใช้ "=== FALSE" แทน "== FALSE" ในการเปรียบเทียบ เนื่องจากเราต้องแยกแยะระหว่างเอาต์พุตว่างกับค่าบูลีน FALSE ซึ่งเป็นข้อผิดพลาดที่แท้จริง
รับข้อมูล นี่เป็นการตั้งค่าทางเลือกอื่นที่สามารถรับข้อมูลเกี่ยวกับคำขอนี้หลังจากดำเนินการ cURL:
-
curl_exec($ch);
$info = curl_getinfo($ch);
echo 'รับ' $info['url'] 'ใช้เวลานาน' $info['total_time'] .
// ...อาร์เรย์ที่ส่งคืนจะมีข้อมูลต่อไปนี้:
"url" //ที่อยู่เครือข่ายทรัพยากร
"content_type" //การเข้ารหัสเนื้อหา
"http_code" //รหัสสถานะ HTTP
"header_size" //ขนาดของส่วนหัว
"request_size" //ขนาดคำขอ
"filetime" //เวลาสร้างไฟล์
"ssl_verify_result" //ผลการตรวจสอบ SSL
"redirect_count" //เทคโนโลยีกระโดด
"total_time" //เวลาทั้งหมดที่ใช้
"namelookup_time" //เวลาค้นหา DNS
"connect_time" //กำลังรอเวลาการเชื่อมต่อ
"pretransfer_time" //เวลาเตรียมตัวก่อนส่ง
"size_upload" //ขนาดของข้อมูลที่อัพโหลด
"size_download" //ขนาดของข้อมูลที่ดาวน์โหลด
"speed_download" //ความเร็วในการดาวน์โหลด
"speed_upload" //ความเร็วในการอัพโหลด
"download_content_length" //ความยาวของเนื้อหาที่ดาวน์โหลด
"upload_content_length" //ความยาวของเนื้อหาที่อัปโหลด
"starttransfer_time" //เวลาที่จะเริ่มการถ่ายโอน
"redirect_time" //การเปลี่ยนเส้นทางต้องใช้เวลาในการเปลี่ยนเส้นทางตามเบราว์เซอร์ ในตัวอย่างนี้ เราจะจัดเตรียมโค้ดชิ้นหนึ่งที่ตรวจสอบว่าเซิร์ฟเวอร์มีการเปลี่ยนเส้นทางตามเบราว์เซอร์หรือไม่ ตัวอย่างเช่น บางเว็บไซต์จะเปลี่ยนเส้นทางหน้าเว็บโดยพิจารณาว่าเป็นเบราว์เซอร์มือถือ หรือแม้แต่ประเทศที่ผู้ใช้นั้นมาจาก
เราใช้ตัวเลือก CURLOPT_HTTPHEADER เพื่อตั้งค่าส่วนหัวคำขอ HTTP ที่เราส่งออก (ส่วนหัว http) รวมถึงข้อมูลตัวแทนผู้ใช้และภาษาเริ่มต้น จากนั้นเราจะดูว่าเว็บไซต์เฉพาะเหล่านี้เปลี่ยนเส้นทางเราไปยัง URL อื่นหรือไม่
// URL สำหรับการทดสอบ
$url = อาร์เรย์(
" http://www.cnn.com ",
" http://www.mozilla.com ",
" http://www.facebook.com "
-
// ข้อมูลเบราว์เซอร์สำหรับการทดสอบ
$เบราว์เซอร์ = อาร์เรย์(
"มาตรฐาน" => อาร์เรย์ (
"user_agent" => "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 (.NET CLR 3.5.30729)",
"ภาษา" => "en-us,en;q=0.5"
-
"iphone" => อาร์เรย์ (
"user_agent" => "Mozilla/5.0 (iPhone; U; CPU เช่น Mac OS X; en) AppleWebKit/420+ (KHTML, เช่น Gecko) เวอร์ชัน/3.0 Mobile/1A537a Safari/419.3",
"ภาษา" => "th"
-
"ฝรั่งเศส" => อาร์เรย์ (
"user_agent" => "Mozilla/4.0 (เข้ากันได้; MSIE 7.0; Windows NT 5.1; GTB6; .NET CLR 2.0.50727)",
"ภาษา" => "fr,fr-FR;q=0.5"
-
-
foreach ($url เป็น $url) {
echo "URL: $urln";
foreach ($เบราว์เซอร์เป็น $test_name => $browser) {
$ch = curl_init();
//ตั้งค่า url
curl_setopt($ch, CURLOPT_URL, $url);
//ตั้งค่าส่วนหัวเฉพาะของเบราว์เซอร์
curl_setopt($ch, CURLOPT_HTTPHEADER, อาร์เรย์(
"ตัวแทนผู้ใช้: {$browser['user_agent']}",
"ยอมรับภาษา: {$browser['ภาษา']}"
-
// เราไม่ต้องการเนื้อหาของหน้า
curl_setopt($ch, CURLOPT_NOBODY, 1);
// เพียงส่งคืนส่วนหัว HTTP
curl_setopt($ch, CURLOPT_HEADER, 1);
// ส่งคืนผลลัพธ์แทนที่จะพิมพ์
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
// มีข้อมูลส่วนหัว HTTP สำหรับการเปลี่ยนเส้นทางหรือไม่?
if (preg_match("!Location: (.*)!", $output, $matches)) {
echo "$test_name: เปลี่ยนเส้นทางไปที่ $matches[1]n";
} อื่น {
echo "$test_name: ไม่มีการเปลี่ยนเส้นทางn";
-
-
เสียงสะท้อน "nn";
}ขั้นแรก เราสร้างชุด URL ที่ต้องทดสอบ จากนั้นระบุชุดข้อมูลเบราว์เซอร์ที่ต้องทดสอบ สุดท้าย มีการใช้การวนซ้ำเพื่อทดสอบสถานการณ์การจับคู่ URL และเบราว์เซอร์ต่างๆ ที่อาจเกิดขึ้น
เนื่องจากเราระบุตัวเลือก cURL เอาต์พุตที่ส่งคืนจึงรวมเฉพาะข้อมูลส่วนหัว HTTP (เก็บไว้ใน $output) โดยใช้กฎทั่วไปง่ายๆ เราจะตรวจสอบว่าข้อมูลส่วนหัวมีคำว่า "ตำแหน่ง:" หรือไม่
การรันโค้ดนี้ควรส่งคืนผลลัพธ์ต่อไปนี้:
การส่งข้อมูลโดยใช้วิธี POST เมื่อทำการร้องขอ GET ข้อมูลสามารถส่งผ่านไปยัง URL ผ่านทาง "สตริงการสืบค้น" ตัวอย่างเช่น เมื่อค้นหาใน Google ปุ่มค้นหาจะเป็นส่วนหนึ่งของสตริงข้อความค้นหาของ URL:
http://www.google.com/search?q=nettuts ในกรณีนี้ คุณอาจไม่จำเป็นต้องใช้ cURL ในการจำลอง การโยน URL นี้ไปที่ "file_get_contents()" จะได้รับผลลัพธ์เดียวกัน
อย่างไรก็ตาม แบบฟอร์ม HTML บางรายการจะถูกส่งโดยใช้วิธี POST เมื่อส่งแบบฟอร์มนี้ ข้อมูลจะถูกส่งผ่านเนื้อหาคำขอ HTTP (เนื้อหาคำขอ) แทนที่จะเป็นสตริงการสืบค้น ตัวอย่างเช่น เมื่อใช้แบบฟอร์มฟอรัม CodeIgniter ไม่ว่าคุณจะป้อนคำหลักใดก็ตาม คุณจะถูก POST ไปที่หน้าต่อไปนี้เสมอ:
http://codeigniter.com/forums/do_search/ คุณสามารถใช้สคริปต์ PHP เพื่อจำลองคำขอ URL นี้ ขั้นแรก สร้างไฟล์ใหม่ที่สามารถยอมรับและแสดงข้อมูล POST ได้ เราตั้งชื่อมันว่า post_output.php:
print_r($_POST); จากนั้นให้เขียนสคริปต์ PHP เพื่อดำเนินการร้องขอ cURL:
$url = " http://localhost/post_output.php ";
$post_data = อาร์เรย์ (
"foo" => "บาร์",
"query" => "เน็ตทัตส์",
"การกระทำ" => "ส่ง"
-
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// เรากำลังโพสต์ข้อมูล!
curl_setopt($ch, CURLOPT_POST, 1);
//เพิ่มตัวแปร post
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$output = curl_exec($ch);
curl_close($ch);
echo $output;หลังจากรันโค้ดแล้ว คุณควรได้รับผลลัพธ์ดังต่อไปนี้:
สคริปต์นี้ส่งคำขอ POST ไปที่ post_output.php ซึ่งเป็นตัวแปร $_POST ของเพจและส่งคืนมัน เราบันทึกเอาต์พุตนี้โดยใช้ cURL
การอัพโหลดไฟล์ การอัพโหลดไฟล์จะคล้ายกับ POST ก่อนหน้ามาก เนื่องจากแบบฟอร์มการอัพโหลดไฟล์ทั้งหมดจะถูกส่งผ่านวิธี POST
ขั้นแรก สร้างหน้าใหม่เพื่อรับไฟล์ชื่อ upload_output.php:
print_r($_FILES);ต่อไปนี้เป็นสคริปต์ที่ดำเนินงานอัพโหลดไฟล์จริง:
$url = " http://localhost/upload_output.php ";
$post_data = อาร์เรย์ (
"foo" => "บาร์",
//ที่อยู่ไฟล์ในเครื่องที่จะอัปโหลด
"อัปโหลด" => "@C:/wamp/www/test.zip"
-
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$output = curl_exec($ch);
curl_close($ch);
echo $output; หากคุณต้องการอัพโหลดไฟล์ เพียงแค่ส่งพาธของไฟล์เหมือนกับตัวแปร post แต่อย่าลืมเพิ่มสัญลักษณ์ @ ไว้ข้างหน้า การดำเนินการสคริปต์นี้ควรให้ผลลัพธ์ดังต่อไปนี้:
การประมวลผลแบทช์ cURL (หลาย cURL)
cURL ยังมีคุณสมบัติขั้นสูง - การจัดการแบบแบตช์ คุณลักษณะนี้ช่วยให้คุณสามารถเปิดการเชื่อมต่อ URL หลายรายการพร้อมกันหรือแบบอะซิงโครนัส
นี่คือโค้ดตัวอย่างจาก php.net:
//สร้างทรัพยากร cURL สองรายการ
$ch1 = curl_init();
$ch2 = curl_init();
//ระบุ URL และพารามิเตอร์ที่เหมาะสม
curl_setopt($ch1, CURLOPT_URL, " http://lxr.php.net/ ");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, " http://www.php.net/ ");
curl_setopt($ch2, CURLOPT_HEADER, 0);
//สร้างชุดจัดการ cURL
$mh = curl_multi_init();
//เพิ่มตัวจัดการทรัพยากรสองตัวแรก
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);
// กำหนดตัวแปรสถานะไว้ล่วงหน้า
$ใช้งานอยู่ = โมฆะ;
//ดำเนินการประมวลผลเป็นชุด
ทำ {
$mrc = curl_multi_exec($mh, $active);
} ในขณะที่ ($mrc == CURLM_CALL_MULTI_PERFORM);
ในขณะที่ ($ ใช้งาน && $mrc == CURLM_OK) {
ถ้า (curl_multi_select($mh) != -1) {
ทำ {
$mrc = curl_multi_exec($mh, $active);
} ในขณะที่ ($mrc == CURLM_CALL_MULTI_PERFORM);
-
-
//ปิดแต่ละจุดจับ
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh); สิ่งที่คุณต้องทำที่นี่คือการเปิดตัวจัดการ cURL หลายรายการและกำหนดให้กับการจัดการแบบแบตช์ จากนั้นคุณก็รอสักครู่เพื่อให้เสร็จสมบูรณ์
ในตัวอย่างนี้มีสองลูปหลัก ลูป do- While แรกเรียก curl_multi_exec() ซ้ำๆ ฟังก์ชันนี้ไม่มีการปิดกั้นแต่จะดำเนินการให้น้อยที่สุดเท่าที่จะเป็นไปได้ ส่งคืนค่าสถานะ ตราบใดที่ค่านี้เท่ากับค่าคงที่ CURLM_CALL_MULTI_PERFORM หมายความว่ายังมีงานเร่งด่วนที่ต้องทำ (เช่น การส่งข้อมูลส่วนหัว http ที่สอดคล้องกับ URL) นั่นคือเราจำเป็นต้องเรียกใช้ฟังก์ชันนี้ต่อไปจนกว่าค่าที่ส่งคืนจะเปลี่ยนแปลง
การวนซ้ำ while ต่อไปนี้จะดำเนินต่อไปเมื่อตัวแปร $active เป็นจริงเท่านั้น ก่อนหน้านี้ตัวแปรนี้ถูกส่งไปที่ curl_multi_exec() เป็นพารามิเตอร์ตัวที่สอง และแสดงว่ายังมีการเชื่อมต่อที่ใช้งานอยู่ในตัวจัดการแบทช์หรือไม่ ต่อไป เราเรียก curl_multi_select() ซึ่งจะถูก "บล็อก" จนกว่าจะมีการเชื่อมต่อที่ใช้งานอยู่ (เช่น การรับการตอบสนองของเซิร์ฟเวอร์) เกิดขึ้น หลังจากที่ฟังก์ชันนี้ทำงานสำเร็จ เราจะเข้าสู่ do- While loop อื่นและดำเนินการต่อไปยัง URL ถัดไป
มาดูวิธีนำฟีเจอร์นี้ไปใช้จริงกัน:
ตัวตรวจสอบการเชื่อมต่อ WordPress ลองจินตนาการว่าคุณมีบล็อกที่มีบทความจำนวนมากซึ่งมีลิงก์ไปยังเว็บไซต์ภายนอกจำนวนมาก หลังจากนั้นไม่นาน ลิงก์เหล่านี้จำนวนมากก็ใช้ไม่ได้ด้วยเหตุผลใดก็ตาม ไม่ว่าจะได้รับการประสานกันหรือทั้งไซต์ถูกแฮ็ก...
มาสร้างสคริปต์ด้านล่างเพื่อวิเคราะห์ลิงก์เหล่านี้ทั้งหมด ค้นหาเว็บไซต์/หน้าเว็บที่ไม่สามารถเปิดได้หรือมี 404 และสร้างรายงาน
โปรดทราบว่าสิ่งต่อไปนี้ไม่ใช่ปลั๊กอิน WordPress ที่ใช้งานได้จริง มันเป็นเพียงสคริปต์ที่มีฟังก์ชันอิสระ สำหรับการสาธิตเท่านั้น ขอบคุณ
ตกลงมาเริ่มกันเลย ขั้นแรก อ่านลิงก์เหล่านี้ทั้งหมดจากฐานข้อมูล:
//กำหนดค่า
$db_host = 'localhost';
$db_user = 'รูท';
$db_pass = '';
$db_name = 'เวิร์ดเพรส';
$excluded_domains = อาร์เรย์(
'localhost', 'www.mydomain.com');
$max_connections = 10;
//เริ่มต้นตัวแปรบางตัว
$url_list = อาร์เรย์();
$working_urls = อาร์เรย์();
$dead_urls = อาร์เรย์();
$not_found_urls = อาร์เรย์();
$ใช้งานอยู่ = โมฆะ;
// เชื่อมต่อกับ MySQL
ถ้า (!mysql_connect($db_host, $db_user, $db_pass)) {
die('ไม่สามารถเชื่อมต่อ: ' .mysql_error());
-
ถ้า (!mysql_select_db($db_name)) {
die('ไม่สามารถเลือก db: ' . mysql_error());
-
// ค้นหาบทความทั้งหมดที่มีลิงก์
$q = "เลือก post_content จาก wp_posts
โดยที่ post_content เช่น '%href=%'
และ post_status = 'เผยแพร่'
และ post_type = 'โพสต์'";
$r = mysql_query($q) หรือ die(mysql_error());
ในขณะที่ ($d = mysql_fetch_assoc($r)) {
// ใช้ลิงก์ที่ตรงกันปกติ
if (preg_match_all("!href="(.*?)"!", $d['post_content'], $matches)) {
foreach ($ตรงกัน [1] เป็น $url) {
// ยกเว้นบางโดเมน
$tmp = parse_url($url);
ถ้า (in_array($tmp['host'], $excluded_domains)) {
ดำเนินการต่อ;
-
//เก็บ url
$url_list []= $url;
-
-
-
// ลบลิงค์ที่ซ้ำกัน
$url_list = array_values(array_unique($url_list));
ถ้า (!$url_list) {
die('ไม่มี URL ให้ตรวจสอบ');
}ขั้นแรกเรากำหนดค่าฐานข้อมูล ชุดชื่อโดเมนที่จะยกเว้น ($excluded_domains) และจำนวนการเชื่อมต่อพร้อมกันสูงสุด ($max_connections) จากนั้น เชื่อมต่อกับฐานข้อมูล รับบทความและลิงก์ที่รวมไว้ และรวบรวมไว้ในอาร์เรย์ ($url_list)
โค้ดด้านล่างนี้ซับซ้อนเล็กน้อย ดังนั้นฉันจะอธิบายโดยละเอียดทีละขั้นตอน:
// 1. โปรเซสเซอร์แบบแบตช์
$mh = curl_multi_init();
// 2. เพิ่ม URL ที่ต้องประมวลผลเป็นชุด
สำหรับ ($i = 0; $i < $max_connections; $i++) {
add_url_to_multi_handle($mh, $url_list);
-
// 3. การประมวลผลเริ่มต้น
ทำ {
$mrc = curl_multi_exec($mh, $active);
} ในขณะที่ ($mrc == CURLM_CALL_MULTI_PERFORM);
// 4. วงหลัก
ในขณะที่ ($ ใช้งาน && $mrc == CURLM_OK) {
// 5. มีการเชื่อมต่อที่ใช้งานอยู่
ถ้า (curl_multi_select($mh) != -1) {
// 6. ทำงาน
ทำ {
$mrc = curl_multi_exec($mh, $active);
} ในขณะที่ ($mrc == CURLM_CALL_MULTI_PERFORM);
// 7. คุณมีข้อมูลอะไรบ้าง?
ถ้า ($mhinfo = curl_multi_info_read($mh)) {
//หมายความว่าการเชื่อมต่อสิ้นสุดลงตามปกติ
// 8. รับข้อมูลจากด้ามจับขด
$chinfo = curl_getinfo($mhinfo['handle']);
// 9. ลิงค์เสียเหรอ?
ถ้า (!$chinfo['http_code']) {
$dead_urls []= $chininfo['url'];
// 10.404?
} อื่นถ้า ($chinfo['http_code'] == 404) {
$not_found_urls []= $chininfo['url'];
// 11. ยังมีอยู่
} อื่น {
$working_urls []= $chininfo['url'];
-
// 12. ถอดที่จับออก
curl_multi_remove_handle($mh, $mhinfo['จัดการ']);
curl_close($mhinfo['จัดการ']);
// 13. เพิ่ม URL ใหม่และดำเนินการ
ถ้า (add_url_to_multi_handle($mh, $url_list)) {
ทำ {
$mrc = curl_multi_exec($mh, $active);
} ในขณะที่ ($mrc == CURLM_CALL_MULTI_PERFORM);
-
-
-
-
// 14. เสร็จแล้ว
curl_multi_close($mh);
echo "==URL ที่ไม่ทำงาน==n";
echo implode("n",$dead_urls) .
echo "==404 URL==n";
echo ระเบิด("n",$not_found_urls) .
echo "==URL ทำงาน==n";
เสียงสะท้อนระเบิด("n",$working_urls);
// 15. เพิ่ม url ให้กับตัวประมวลผลแบบแบตช์
ฟังก์ชั่น add_url_to_multi_handle($mh, $url_list) {
$ดัชนีคงที่ = 0;
// หากเหลือ url ไว้ก็ไม่มีประโยชน์
ถ้า ($url_list[$ดัชนี]) {
//สร้างตัวจัดการขดใหม่
$ch = curl_init();
//กำหนดค่า URL
curl_setopt($ch, CURLOPT_URL, $url_list[$ดัชนี]);
// ไม่ต้องการส่งออกเนื้อหาที่ส่งคืน
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// เราจะไปทุกที่ที่การเปลี่ยนเส้นทางพาเราไป
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
// ไม่จำเป็นต้องมีเนื้อหาเนื้อหา ซึ่งสามารถประหยัดแบนด์วิธและเวลาได้
curl_setopt($ch, CURLOPT_NOBODY, 1);
//เพิ่มไปยังตัวประมวลผลแบบแบตช์
curl_multi_add_handle($mh, $ch);
// หมุนตัวนับและคุณสามารถเพิ่ม URL ถัดไปในครั้งต่อไปที่คุณเรียกใช้ฟังก์ชันนี้
$ดัชนี++;
กลับเป็นจริง;
} อื่น {
// ไม่จำเป็นต้องประมวลผล URL ใหม่
กลับเท็จ;
-
}โค้ดข้างต้นมีคำอธิบายอยู่ด้านล่าง หมายเลขซีเรียลในรายการสอดคล้องกับหมายเลขลำดับในความคิดเห็นของโค้ด
สร้างตัวประมวลผลแบทช์ใหม่ สร้างที่จับหลายอัน
ต่อมาเราจะสร้างฟังก์ชัน add_url_to_multi_handle() ที่เพิ่ม URL ให้กับตัวจัดการแบทช์ เมื่อใดก็ตามที่เรียกใช้ฟังก์ชันนี้ URL ใหม่จะถูกเพิ่มลงในตัวประมวลผลแบบแบตช์ ในตอนแรก เราเพิ่ม URL 10 รายการให้กับตัวประมวลผลแบบแบตช์ (ตัวเลขนี้กำหนดโดย $max_connections)
จำเป็นต้องรัน curl_multi_exec() เพื่อดำเนินการเริ่มต้น ตราบใดที่มันส่งคืน CURLM_CALL_MULTI_PERFORM ก็ยังมีบางอย่างที่ต้องทำ ซึ่งทำเพื่อสร้างการเชื่อมต่อเป็นหลัก โดยไม่จำเป็นต้องรอการตอบกลับ URL แบบเต็ม
ลูปหลักจะดำเนินต่อไปตราบใดที่มีการเชื่อมต่อที่ใช้งานอยู่ในแบตช์
curl_multi_select() รอจนกระทั่งแบบสอบถาม URL ส่งผลให้เกิดการเชื่อมต่อที่ใช้งานอยู่
งานของ cURL กลับมาอีกครั้ง เพื่อรับข้อมูลการตอบกลับเป็นหลัก
ตรวจสอบข้อมูลต่างๆ เมื่อคำขอ URL เสร็จสมบูรณ์ อาร์เรย์จะถูกส่งกลับ
มีตัวจัดการ cURL ในอาร์เรย์ที่ส่งคืน เราใช้เพื่อรับข้อมูลที่เกี่ยวข้องสำหรับคำขอ cURL เดียว
หากนี่เป็นลิงก์ที่ใช้งานไม่ได้หรือคำขอหมดเวลา จะไม่มีการส่งคืนรหัสสถานะ http
หากไม่พบหน้านี้ รหัสสถานะ 404 จะถูกส่งกลับ
ในกรณีอื่นๆ เราถือว่าลิงก์นี้ใช้งานได้ (แน่นอน คุณสามารถตรวจสอบข้อผิดพลาด 500 รายการและอื่นๆ ที่คล้ายกันได้...)
ลบตัวจัดการ cURL นี้ออกจากแบตช์เนื่องจากไม่มีการใช้งานอีกต่อไป ปิดมัน!
เยี่ยมเลย ตอนนี้คุณสามารถเพิ่ม URL อื่นได้แล้ว อีกครั้งหนึ่ง งานเริ่มต้นเริ่มต้นอีกครั้ง...
ทุกสิ่งที่ต้องทำก็เสร็จสิ้น ปิดตัวประมวลผลแบทช์และสร้างรายงาน
กลับไปที่ฟังก์ชันที่เพิ่ม URL ใหม่ให้กับโปรเซสเซอร์แบบแบตช์ ทุกครั้งที่เรียกใช้ฟังก์ชันนี้ ตัวแปรคงที่ $index จะเพิ่มขึ้นเพื่อให้เราสามารถทราบจำนวน URL ที่เหลือที่ต้องประมวลผล
ฉันรันสคริปต์นี้ในบล็อกของฉัน (จำเป็นต้องทดสอบ มีการเพิ่มลิงก์ผิดบางลิงก์โดยเจตนา) และผลลัพธ์จะเป็นดังนี้:
มีการตรวจสอบ URL ทั้งหมดประมาณ 40 รายการ และใช้เวลาไม่ถึงสองวินาที เมื่อคุณต้องการตรวจสอบ URL จำนวนมากขึ้น คุณก็สามารถจินตนาการถึงผลที่ช่วยลดความกังวลได้! หากเปิดการเชื่อมต่อ 10 ครั้งพร้อมกัน จะเร็วขึ้น 10 เท่า! นอกจากนี้คุณยังสามารถใช้ประโยชน์จากคุณลักษณะที่ไม่บล็อกของการประมวลผลแบบกลุ่ม cURL เพื่อจัดการคำขอ URL จำนวนมากโดยไม่บล็อกสคริปต์เว็บของคุณ
ตัวเลือก cURL ที่มีประโยชน์อื่น ๆ
การรับรองความถูกต้อง HTTP หากคำขอ URL จำเป็นต้องมีการรับรองความถูกต้องโดยใช้ HTTP คุณสามารถใช้รหัสต่อไปนี้:
$url = " http://www.somesite.com/members/ ";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//ส่งชื่อผู้ใช้และรหัสผ่าน
curl_setopt($ch, CURLOPT_USERPWD, "myusername:mypassword");
// คุณสามารถอนุญาตให้เปลี่ยนเส้นทางได้
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
// ตัวเลือกต่อไปนี้อนุญาตให้ cURL ไปที่
// สามารถส่งชื่อผู้ใช้และรหัสผ่านได้
curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1);
$output = curl_exec($ch);
curl_close($ch);อัพโหลด FTP
PHP มาพร้อมกับไลบรารี FTP ของตัวเอง แต่คุณสามารถใช้ cURL ได้เช่นกัน:
//เปิดตัวชี้ไฟล์
$file = fopen("/path/to/file", "r");
// url มีข้อมูลที่จำเป็นส่วนใหญ่
$url = " ftp://username:[email protected]:21/path/to/new/file ";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//อัปโหลดตัวเลือกที่เกี่ยวข้อง
curl_setopt($ch, CURLOPT_UPLOAD, 1);
curl_setopt($ch, CURLOPT_INFILE, $fp);
curl_setopt($ch, CURLOPT_INFILESIZE, ขนาดไฟล์ ("/path/to/file"));
// ไม่ว่าจะเปิดใช้งานโหมด ASCII (มีประโยชน์เมื่ออัพโหลดไฟล์ข้อความ)
curl_setopt($ch, CURLOPT_FTPASCII, 1);
$output = curl_exec($ch);
curl_close($ch); หากต้องการหลีกเลี่ยงกำแพง คุณสามารถใช้พรอกซีเพื่อเริ่มต้นคำขอ cURL:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,'http://www.example.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//ระบุที่อยู่พร็อกซี
curl_setopt($ch, CURLOPT_PROXY, '11.11.11.11:8080');
// ระบุชื่อผู้ใช้และรหัสผ่านหากจำเป็น
curl_setopt($ch, CURLOPT_PROXYUSERPWD,'ผู้ใช้:ผ่าน');
$output = curl_exec($ch);
curl_close ($ch); ฟังก์ชันการโทรกลับอนุญาตให้ cURL เรียกใช้ฟังก์ชันการโทรกลับที่ระบุในระหว่างการร้องขอ URL ตัวอย่างเช่น เริ่มใช้ข้อมูลทันทีที่มีการดาวน์โหลดเนื้อหาหรือการตอบกลับ แทนที่จะรอจนกว่าจะดาวน์โหลดเสร็จสมบูรณ์
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,'http://net.tutsplus.com');
curl_setopt($ch, CURLOPT_WRITEFUNCTION,"progress_function");
curl_exec($ch);
curl_close ($ch);
ฟังก์ชั่นความคืบหน้า_ฟังก์ชั่น($ch,$str) {
เสียงสะท้อน $str;
กลับ strlen($str);
}ฟังก์ชันการโทรกลับนี้จะต้องส่งคืนความยาวของสตริง มิฉะนั้นฟังก์ชันนี้จะทำงานไม่ถูกต้อง
ในระหว่างกระบวนการรับการตอบสนอง URL ฟังก์ชันนี้จะถูกเรียกใช้ตราบใดที่ได้รับแพ็กเก็ตข้อมูล
สรุป วันนี้เราได้เรียนรู้เกี่ยวกับฟังก์ชันอันทรงพลังและความสามารถในการปรับขนาดที่ยืดหยุ่นของไลบรารี cURL หวังว่าคุณจะชอบมัน ครั้งต่อไปที่คุณต้องการส่งคำขอ URL ให้พิจารณา cURL!
ขอบคุณ!
ข้อความต้นฉบับ: เริ่มต้นอย่างรวดเร็วด้วย cURL ตาม PHP
ข้อความภาษาอังกฤษต้นฉบับ: http://net.tutsplus.com/tutorials/php/techniques-and-resources-for-mastering-curl/
ผู้เขียนต้นฉบับ: บูรัค กูเซล
จะต้องเก็บแหล่งที่มาเพื่อการพิมพ์ซ้ำ