Skip to main content

เนื้อหาภาษาไทย / Thai content

System guide Content reviewed

การใช้ Curl ใน PHP: การดึงข้อมูลจากภายนอก

บทความนี้แนะนำการใช้งาน Curl ใน PHP เพื่อดึงข้อมูลจากภายนอก เช่น API โดยครอบคลุมตั้งแต่พื้นฐานการใช้งานฟังก์ชัน `curl_init()`, `curl_setopt()`, และ `curl_exec()...

การใช้ Curl ใน PHP: การดึงข้อมูลจากภายนอก

ในโลกของการพัฒนาเว็บสมัยใหม่ การดึงข้อมูลจากภายนอกเป็นสิ่งที่หลีกเลี่ยงไม่ได้ ไม่ว่าจะเป็นการดึงข้อมูลจาก API ของบริการต่างๆ การตรวจสอบความถูกต้องของข้อมูล หรือแม้แต่การดาวน์โหลดไฟล์ Curl (Client URL Library) เป็นเครื่องมือสำคัญที่ช่วยให้เราสามารถทำสิ่งเหล่านี้ได้ใน PHP

ในบทนี้ เราจะมาเรียนรู้เกี่ยวกับ Curl ใน PHP ตั้งแต่พื้นฐานไปจนถึงการใช้งานจริง เพื่อให้คุณสามารถดึงข้อมูลจาก APIs ภายนอกได้อย่างมีประสิทธิภาพ

Curl คืออะไร?

Curl คือไลบรารีที่ช่วยให้เราสามารถส่ง HTTP request ไปยัง server อื่นๆ และรับ response กลับมาได้ รองรับ protocol หลากหลาย เช่น HTTP, HTTPS, FTP, และอื่นๆ ทำให้เราสามารถ interact กับ APIs ต่างๆ ได้อย่างง่ายดาย

พื้นฐานการใช้งาน Curl

การใช้งาน Curl ใน PHP หลักๆ จะเกี่ยวข้องกับ 3 ฟังก์ชันหลัก:

  • curl_init(): เริ่มต้น session ของ Curl
  • curl_setopt(): ตั้งค่า option ต่างๆ สำหรับ Curl session
  • curl_exec(): Execute Curl session และดึงข้อมูล

ลองมาดูตัวอย่างการดึงข้อมูลจาก API ง่ายๆ:

<?php

// 1. Initialize Curl session
$ch = curl_init();

// 2. Set options
curl_setopt($ch, CURLOPT_URL, "https://api.example.com/data"); // URL ที่ต้องการดึงข้อมูล
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // ให้ส่งคืนผลลัพธ์เป็น string แทนการแสดงผลโดยตรง

// 3. Execute Curl session
$response = curl_exec($ch);

// 4. Check for errors
if(curl_errno($ch)){
    echo 'Curl error: ' . curl_error($ch);
}

// 5. Close Curl session
curl_close($ch);

// 6. Process the response
if ($response) {
    echo $response;
} else {
    echo "No data received.";
}

?>

คำอธิบาย:

  1. curl_init() สร้าง resource สำหรับ Curl session ใหม่
  2. curl_setopt() ใช้สำหรับตั้งค่าต่างๆ ของ Curl session
    • CURLOPT_URL: กำหนด URL ที่ต้องการดึงข้อมูล
    • CURLOPT_RETURNTRANSFER: กำหนดให้ curl_exec() ส่งคืนผลลัพธ์เป็น string แทนการแสดงผลโดยตรง (สำคัญมาก)
  3. curl_exec() Execute Curl session และดึงข้อมูลจาก URL ที่กำหนด
  4. curl_errno() และ curl_error() ใช้ตรวจสอบข้อผิดพลาดที่อาจเกิดขึ้นระหว่างการ execute
  5. curl_close() ปิด Curl session และ free resources
  6. จากนั้นเราก็สามารถนำ `$response` ไปใช้งานต่อได้

Handling HTTP Headers

บางครั้ง API อาจต้องการ HTTP headers บางอย่าง เช่น Content-Type หรือ Authorization เพื่อให้เราสามารถเข้าถึงข้อมูลได้ เราสามารถตั้งค่า headers ได้โดยใช้ curl_setopt() ร่วมกับ CURLOPT_HTTPHEADER

<?php

$ch = curl_init();

$headers = [
    'Content-Type: application/json',
    'Authorization: Bearer YOUR_API_KEY' // แทนที่ YOUR_API_KEY ด้วย API key ของคุณ
];

curl_setopt($ch, CURLOPT_URL, "https://api.example.com/data");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$response = curl_exec($ch);

if(curl_errno($ch)){
    echo 'Curl error: ' . curl_error($ch);
}

curl_close($ch);

if ($response) {
    echo $response;
} else {
    echo "No data received.";
}

?>

ในตัวอย่างนี้ เราได้สร้าง array ของ headers ที่ต้องการส่งไปพร้อมกับ request และกำหนดให้ CURLOPT_HTTPHEADER

API Authentication

API หลายแห่งต้องการการ authentication ก่อนที่เราจะสามารถเข้าถึงข้อมูลได้ วิธีการ authentication ที่พบบ่อยคือ:

  • Basic Authentication: ใช้ username และ password ที่ encode เป็น base64
  • Bearer Token: ใช้ token ที่ได้รับมาก่อนหน้านี้
  • API Key: ใช้ key ที่ได้รับจากผู้ให้บริการ API

ตัวอย่าง Basic Authentication:

<?php

$ch = curl_init();

$username = "your_username";
$password = "your_password";

curl_setopt($ch, CURLOPT_URL, "https://api.example.com/data");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $password); // กำหนด username และ password

$response = curl_exec($ch);

if(curl_errno($ch)){
    echo 'Curl error: ' . curl_error($ch);
}

curl_close($ch);

if ($response) {
    echo $response;
} else {
    echo "No data received.";
}

?>

ในตัวอย่างนี้ เราใช้ CURLOPT_USERPWD เพื่อกำหนด username และ password สำหรับ Basic Authentication

ตัวอย่างการส่งข้อมูลแบบ POST:

<?php

$ch = curl_init();

$data = array(
    'name' => 'John Doe',
    'email' => 'john.doe@example.com'
);

$jsonData = json_encode($data);

curl_setopt($ch, CURLOPT_URL, "https://api.example.com/users");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, 1); // กำหนดให้เป็น POST request
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData); // กำหนดข้อมูลที่จะส่ง
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));

$response = curl_exec($ch);

if(curl_errno($ch)){
    echo 'Curl error: ' . curl_error($ch);
}

curl_close($ch);

if ($response) {
    echo $response;
} else {
    echo "No data received.";
}

?>

ในตัวอย่างนี้ เราใช้ CURLOPT_POST เพื่อกำหนดให้เป็น POST request และ CURLOPT_POSTFIELDS เพื่อกำหนดข้อมูลที่จะส่ง (ในรูปแบบ JSON)

Trade-offs และแนวปฏิบัติที่ดี

  • Error Handling: ควรตรวจสอบ error code ที่ได้จาก curl_errno() เสมอ เพื่อจัดการกับข้อผิดพลาดที่อาจเกิดขึ้น
  • Security: หลีกเลี่ยงการ hardcode API keys หรือ credentials ในโค้ด ควรเก็บไว้ใน environment variables หรือ configuration files
  • Performance: Curl สามารถใช้ resources ค่อนข้างมาก ควรปิด Curl session ด้วย curl_close() เสมอเมื่อใช้งานเสร็จ
  • Timeout: กำหนด timeout เพื่อป้องกันการรอ request นานเกินไป โดยใช้ CURLOPT_TIMEOUT หรือ CURLOPT_CONNECTTIMEOUT
  • Reusability: สร้าง wrapper function สำหรับการใช้งาน Curl เพื่อให้ง่ายต่อการ reuse และ maintain

ตัวอย่างการกำหนด Timeout:

<?php

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://api.example.com/data");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10); // กำหนด timeout เป็น 10 วินาที
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); // กำหนด connection timeout เป็น 5 วินาที

$response = curl_exec($ch);

// ... (ส่วนอื่นๆ ของโค้ด)

?>

เหตุผลเชิงออกแบบ:

  • ทำไมต้องใช้ Curl แทน `file_get_contents`? แม้ว่า `file_get_contents` จะสามารถดึงข้อมูลจาก URL ได้ แต่ Curl มีความยืดหยุ่นและควบคุมได้มากกว่า เช่น สามารถตั้งค่า headers, timeout, และจัดการกับ authentication ได้อย่างละเอียด
  • ทำไมต้องปิด Curl session ด้วย `curl_close()`? เพื่อคืน resources ที่ Curl session ใช้งานไปให้ระบบ ทำให้ application ทำงานได้อย่างมีประสิทธิภาพและป้องกัน memory leaks

สรุป

Curl เป็นเครื่องมือที่ทรงพลังสำหรับการดึงข้อมูลจากภายนอกใน PHP การเข้าใจพื้นฐานและการใช้งาน option ต่างๆ จะช่วยให้คุณสามารถ interact กับ APIs ต่างๆ ได้อย่างมีประสิทธิภาพและปลอดภัย ในบทต่อไป เราจะมาเรียนรู้เกี่ยวกับการสร้าง API ด้วย PHP

Office.in.th Custom Service

Want to build or adapt a system from this structure?

Office.in.th designs and develops enterprise web applications, API integrations, and public- and private-sector management systems, with long-term support.

See our software development service