Posts Tagged ‘multithreading’

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/