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 ใด
- $process[1] = “http://www.example1.com”;
- $process[2] = “ftp://example3.com”;
- $process[3] = “http://www.example2.com”;
สร้าง cURL และทำการกำหนด handles
- $curlHandle = curl_multi_init();
- for ($i = 1;$i <= 3; $i++)
- $curl[$i] = addHandle($curlHandle,$process[$i]);
รัน process
- ExecHandle($curlHandle);
รับ content จาก handle ต่างๆ
- for ($i = 1;$i <= 3; $i++)
- {
- $content[$i] = curl_multi_getcontent ($curl[$i]);
- echo $content[$i];
- }
ปิด handles และ url
- for ($i = 1;$i <= 3; $i++)//remove the sub - handles
- curl_multi_remove_handle($curlHandle,$curl[$i]);
- curl_multi_close($curlHandle);
ตัวอย่าง
- <?
- //add a url to the handler
- function addHandle(&$curlHandle,$url)
- {
- $cURL = curl_init();
- curl_setopt($cURL, CURLOPT_URL, $url);
- curl_setopt($cURL, CURLOPT_HEADER, 0);
- curl_setopt($cURL, CURLOPT_RETURNTRANSFER, 1);
- curl_multi_add_handle($curlHandle,$cURL);
- return $cURL;
- }
- //execute the handle until the flag passed
- // to function is greater then 0
- function ExecHandle(&$curlHandle)
- {
- $flag=null;
- do {
- //fetch pages in parallel
- curl_multi_exec($curlHandle,$flag);
- } while ($flag > 0);
- }
- $list[1] = “http://www.example1.com”;
- $list[2] = “ftp://example.com”;
- $list[3] = “http://www.example2.com”;
- $curlHandle = curl_multi_init();
- for ($i = 1;$i <= 3; $i++)
- $curl[$i] = addHandle($curlHandle,$list[$i]);
- ExecHandle($curlHandle);
- for ($i = 1;$i <= 3; $i++)
- {
- $text[$i] = curl_multi_getcontent ($curl[$i]);
- echo $text[$i];
- }
- for ($i = 1;$i <= 3; $i++)//remove the handles
- curl_multi_remove_handle($curlHandle,$curl[$i]);
- curl_multi_close($curlHandle);
- ?>
จาก http://codestips.com/php-multithreading-using-curl/