PHP Multithreading using cURL

พอดีมีเพื่อนมาถามเรื่อง Multithreading ใน PHP ทำให้รู้่ว่าจริงๆ แล้ว ใน PHP ไม่ีสามารถทำ Parallel programming ได้โดยตรง เพราะ PHP ไม่มีความยุ่งยากในการจัดการเกี่ยวกับเรื่องของ threading จึงทำให้ง่ายต่อการเขียน แต่สำหรับงานบางอย่าง การใช้การคำนวณแบบคู่ขนานก็มีความจำเป็น ไม่ว่าจะทำงานบนครื่องเดียวกัน หรือเครื่องอื่นก็ตาม ซึ่งเราจะพูดถึงการใช้ cURL เข้ามาช่วย

ขอยกตัวอย่างข้อมูลมาจาก http://wiki.memoball.info/

ข้อดีของการทำ parrallel programming

การเขียนโปรแกรมแบบ parrallel นั้นเหมาะสมกับการทำงานบางอย่าง ซึ่งในคอมพิวเตอร์ของเราในปัจจุบันก็ใช้การทำงานลักษณะดังกล่าวในโปรแกรม หลายๆ ชนิด เช่น โปรแกรมทางด้านกราฟิก วิธีการนี้จะช่วยลดเวลาในการทำงานของกระบวนการหลักไปได้เป็นอย่างมาก เช่น เราแบ่งส่วนต่างๆ ของหน้าเวปของเราเป็น widget หรือ module ย่อยๆ แล้วในเครื่องแต่ละเครื่องทำงานในการสร้างโมดูลของตัวเองโดยเฉพาะ ซึ่งจะดีแค่ไหนที่เราสามารถเรียกใช้งาน module ต่างๆ นั้นได้พร้อมๆ กัน โดยไม่ต้องรอโหลดเรียงกันทีละ module โดยการเขียนโปรแกรมอย่างนี้จะทำให้ช่วยประหยัดเวลาสร้างข้อมูลที่จะต้องส่ง ให้ client ได้มาก และยังสามารถใช้ทรัพยากรที่มีอยู่ได้อย่างมีประสิทธิภาพสูงสุดอีกด้วย

uCURL กับการทำ multithreading

uCURL นั้นโดยปกติแล้วไม่ถูกติดตั้งเข้ามาใน PHP มาก่อนแแต่จะมาเป็น extension เสริมสำหรับ PHP (โดยส่วนมากผู้ให้บริการ Host ทั่วไปจะทำการติดตั้งมาให้อยู่แล้ว) หนึ่งในความสามารถของ uCURL ที่น่าสนใจอย่างมากคือการทำ multi handle ซึ่งยอมให้สามารถทำ multiple cURL processing ในแบบ parallel ซึ่งฟังก์ชั่นสำคัญที่ต้องใข้ได้แก่

  • curl_multi_init – initialize a new cURL multi handle. It will return the cURL handle on success and FALSE on error.
  • curl_multi_add_handle — Add a cURL handle to a cURL multi handle.
  • curl_multi_exec — Runs all the curl handle in the cURL multi handle in parallel.
  • curl_multi_remove_handle — Removes a cURL handle from a cURL multi handle.
  • curl_multi_close — close the cURL multi handle.

ตัวอย่างการใช้ cURL

สร้างอเรย์สำหรับบ่งบอกว่า process ไหนจะทำที่ url ใด

  1. $process[1] = “http://www.example1.com”;
  2. $process[2] = “ftp://example3.com”;
  3. $process[3] = “http://www.example2.com”;

สร้าง cURL และทำการกำหนด handles

  1. $curlHandle = curl_multi_init();
  2. for ($i = 1;$i <= 3; $i++)
  3. $curl[$i] = addHandle($curlHandle,$process[$i]);

รัน process

  1. ExecHandle($curlHandle);

รับ content จาก handle ต่างๆ

  1. for ($i = 1;$i <= 3; $i++)
  2. {
  3. $content[$i] =  curl_multi_getcontent ($curl[$i]);
  4. echo $content[$i];
  5. }

ปิด handles และ url

  1. for ($i = 1;$i <= 3; $i++)//remove the sub - handles
  2. curl_multi_remove_handle($curlHandle,$curl[$i]);
  3. curl_multi_close($curlHandle);

ตัวอย่าง

  1. <?
  2. //add a url to the handler
  3. function addHandle(&$curlHandle,$url)
  4. {
  5. $cURL = curl_init();
  6. curl_setopt($cURL, CURLOPT_URL, $url);
  7. curl_setopt($cURL, CURLOPT_HEADER, 0);
  8. curl_setopt($cURL, CURLOPT_RETURNTRANSFER, 1);
  9. curl_multi_add_handle($curlHandle,$cURL);
  10. return $cURL;
  11. }
  12. //execute the handle until the flag passed
  13. // to function is greater then 0
  14. function ExecHandle(&$curlHandle)
  15. {
  16. $flag=null;
  17. do {
  18. //fetch pages in parallel
  19. curl_multi_exec($curlHandle,$flag);
  20. while ($flag > 0);
  21. }
  22. $list[1] = “http://www.example1.com”;
  23. $list[2] = “ftp://example.com”;
  24. $list[3] = “http://www.example2.com”;
  25. $curlHandle = curl_multi_init();
  26. for ($i = 1;$i <= 3; $i++)
  27. $curl[$i] = addHandle($curlHandle,$list[$i]);
  28. ExecHandle($curlHandle);
  29. for ($i = 1;$i <= 3; $i++)
  30. {
  31. $text[$i] =  curl_multi_getcontent ($curl[$i]);
  32. echo $text[$i];
  33. }
  34. for ($i = 1;$i <= 3; $i++)//remove the handles
  35. curl_multi_remove_handle($curlHandle,$curl[$i]);
  36. curl_multi_close($curlHandle);
  37. ?>

จาก http://codestips.com/php-multithreading-using-curl/

Leave a Reply

You must be logged in to post a comment.