Monday, April 29, 2013

[php] function curl คืออะไรครับผม?

คือผมได้โค้ดมาครับ จะเอามาพัฒนาต่อ แต่ไม่รู้ว่า

curl_init
curl_setopt
curl_exec
curl_close

ไอเจ้าพวกนี้มันคืออาหยังครับ?
php.net สิครับ บอกยากนะ

curl_init
สร้าง pointer ไว้ทำงาน curl
curl_setopt
กำหนดการทำงานของ curl
curl_exec
สั่งให้ curl ทำงาน
curl_close
ปิดการทำงานของ curl

สรุป ฟังค์ชั่นตระกูล curl ใช้ในการทำงานการติดต่อบนโปรโตคอลต่างๆ
จำไม่ผิด รองรับ http https(ssl) ftp

เวลาใช้ฟังค์ชั่นพวกนี้ก็เรียงตามข้างบนแหละครับ
สร้าง pointer -> กำหนดค่า -> สั่งให้ทำงาน -> ปิด curl

การ POST Request ผ่านทาง PHP โดยใช้ CURL

เนื่องจากบางทีเรามีความจำเป็นต้องโยนข้อมูลข้าม server กัน หรืออาจจะใช้กันเอง ที่จะผ่านการโพส
โดยที่จะต้องให้ผู้ใช้ไม่ได้กรอกเอง หรืออาจจะไปเรียก API ต่างๆ ไม่ว่างมันจะเป็นอะไรก็ตาม
ถ้ามันเป็นการ GET ก็สามารถทำการสั่งผ่าน URL ไปได้เลย
แต่ถ้าเป็นการ POST ล่ะ จะสั่งยังไง?

วิธีการทำก็คือใช้ curl นั่นเอง
วิธ๊การใช้งานก็ประมาณนี้ครับ

Code: [Select]
<?php

$curl curl_init();curl_setopt($curlCURLOPT_URL'target.php');curl_setopt($curlCURLOPT_POSTtrue);curl_setopt($curlCURLOPT_POSTFIELDS'data1=data1&data2=data2');$result curl_exec ($curl);curl_close ($curl); 
?>




« Last Edit

การใช้ curl extension สำหรับ ดึงส่วนต่างๆ ของหน้าเว็บ จากที่อื่น มาแสดงผลในหน้าเว็บเรา

การใช้ curl extension สำหรับ ดึงส่วนต่างๆ ของหน้าเว็บ จากที่อื่น มาแสดงผลในหน้าเว็บเรา


บทความนี้นะครับ ก็เป็นการ ใช้ extension cure เพื่อ ติดต่อ กับ URL อื่น และ ตัดข้อความบางส่วนออกมาใช้นะครับ
การใช้ cure นั้น จะมีลักษณะ คล้ายๆ กับ ajax คือ cure สามารถติดต่อ และส่ง ค่าตัวแปร ด้วย get หรือ post ไปยัง url อื่น และรับข้อมูลประมวลผล กลับมาแสดงในหน้าเว็บได้ ซึ่ หากเป้น ajax process การทำงานนั้นจะ อยู่ที่ agent ฝั่ง client นั่นคือ object xmlHTTPRequest นะครับ
แต่หากเป็น cure นั้น agent หรือตัวกลาง จะอยู่ที่ฝั่ง server ภายใต้ environment ของ PHP ที่เปิด extension cure ใน php.ini นะครับ
อันดับแรก ผมอยากจะให้ดูวิธีการใช้ cure ซักนิด ด้วยตัวอย่างง่ายๆ เช่นการ Login
โจทย์ของผมคือ สร้าง ฟอร์ม Login ขึ้นมา และส่งค่า username และ password ไปยัง ไฟล์ curl_service.php ซึ่ง จะให้บริการ ตรวจสอบ username และ password จาก database ซึ่ง ฟอร์ม Login และ curl_service.php นั้น จะอยู่กัน คนละ server และ server ของ formLogin.php นั้นไม่สามารถติดต่อ database ได้

ที่ server 1 (ไม่สามารถติดต่อ Db ได้ แต่เปิด curl) ไฟล์ formLogin.php โคดดังนี้
  1. <?php
  2. $submit=$_POST["Submit"];
  3. $curlurl ="http://server2/curl/curl_service.php"; // url เพื่อเรียก ไปที่ curl_service ที่อยู่ใน server ที่สามารรถติดต่อดาต้าเบสได้


  4. function reg_login($username,$password)
  5. {
  6. global $curlurl;
  7. $user_agent = "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)";
  8. $params = "username=$username&password=".$password;


  9. $ch = curl_init();
  10. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  11. curl_setopt($ch, CURLOPT_HEADER, 0);
  12. curl_setopt($ch, CURLOPT_POST,1); // method ที่เราจะส่ง เป็น get หรือ post
  13. curl_setopt($ch, CURLOPT_POSTFIELDS,$params); // paremeter สำหรับส่งไปยังไฟล์ ที่กำหนด
  14. curl_setopt($ch, CURLOPT_URL,$curlurl);
  15. curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
  16. curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);

  17. $result = curl_exec($ch); // ผลการ execute กลับมาเป็น ข้อมูลใน url ที่เรา ส่งคำร้องขอไป
  18. curl_close ($ch);
  19. return $result;
  20. }
  21. ?>

  22. <HTML>
  23. <HEAD>
  24. <TITLE> New Document </TITLE>
  25. <META NAME="Generator" CONTENT="EditPlus">
  26. <META NAME="Author" CONTENT="">
  27. <META NAME="Keywords" CONTENT="">
  28. <META NAME="Description" CONTENT="">
  29. </HEAD>

  30. <BODY>
  31. <form action="<?php $_SERVER["PHP_SELF"];?>" method="post">
  32. <table width="500" border="0" align="center" cellpadding="1" cellspacing="1" bgcolor="#CCCCCC">
  33. <tr bgcolor="#CCFFFF">
  34. <td colspan="2"><strong>Curl Login Form !!</strong></td>
  35. </tr>
  36. <tr>
  37. <td width="127" bgcolor="#FFFFFF"><strong>username</strong></td>
  38. <td width="366" bgcolor="#FFFFFF"><input type="text" name="txtname"></td>
  39. </tr>
  40. <tr>
  41. <td bgcolor="#FFFFFF"><strong>password</strong></td>
  42. <td bgcolor="#FFFFFF"><input type="text" name="txtpass"></td>
  43. </tr>
  44. <tr>
  45. <td bgcolor="#FFFFFF"> </td>
  46. <td bgcolor="#FFFFFF"><input type="submit" name="Submit" value="Submit">
  47. <input type="reset" name="Submit2" value="Reset"></td>
  48. </tr>
  49. </table>
  50. </form>
  51. <?php
  52. // ตรวจสอบ การกดปุ่ม submit
  53. if (isset($submit)){
  54. $username=$_POST["txtname"];
  55. $password=$_POST["txtpass"];
  56. echo reg_login($username,$password);
  57. }
  58. ?>
  59. </BODY>
  60. </HTML>
คัดลอกไปที่คลิปบอร์ด
ที่ server 2 (สามารถติดต่อ Db ได้ ไม่ได้เปิด curl) ไฟล์ curl_service.php โคดดังนี้
  1. <?php
  2. // รหัส login
  3. $admin_user="admin";
  4. $admin_pass="123";


  5. // เว็บ service โดยใช้ curl เป็นหลัก
  6. $user=$_POST["username"];
  7. $pass=$_POST["password"];


  8. if ($admin_user==$user && $admin_pass==$pass) {
  9. echo "Login ถูกต้องนะครับ ยินดีต้อนรับคุณ ".$user;
  10. }else{
  11. echo "ไม่ถูกต้องกรุณา Login ใหม่ด้วยนะครับ !!";
  12. }
  13. ?>
คัดลอกไปที่คลิปบอร์ด
จะเห็นได้ว่า ใน โคดที่ curl_service.php คือการเขียนโคด ตรวจสอบ login ธรรมดา ทั่วไป และมีการ echo ข้อความเท่านั้น
ซึ่งทั้งหมดนี้ process ของการ ส่งค่า และรับค่าไปแสดงผล จะอยู่ที่กระบวนการทางฝั่งของ formLogin.php โดยผ่านตัวกลาง agent ก็คือ curl นั่นเอง

ที่กล่าวมานี้ จะเป็น แค่ตัวอย่าง การใช้ curl เป็นตัวกลางในการส่งค่า ไปยังเว็บอื่น เพื่อ แสดงผลข้อมูล ต่อไป เราจะ ได้ทดลอง การตัดต่อ ข้อความเฉพาะส่งจาก เว็บไซต์อื่นนะครับ ด้วย ตัวอย่าง การ ดึง บทความจากเว็บไซต์ เมืองนอก มาแสดงผลในหน้าเว็บเรา โดยการ ตัดเอาเฉพาะ ข้อมูล ตรง ส่วน main บทความเท่านั้น นะครับ
  1. <?php
  2. $url="http://www.4guysfromrolla.com/webtech/";
  3. if ($viewcat<>"")
  4. $url.=$viewcat;
  5. else
  6. $url.="index_asp.shtml";


  7. function replaceLink($data){
  8. $data = ereg_replace('<a href="/webtech/','<a href="aspnet_article.php?viewcat=',$data);
  9. return $data;
  10. }

  11. function callArticle(){
  12. global $url;
  13. $user_agent = "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)";
  14. // $params = "";
  15. // $url .="?".$params;
  16. $ch = curl_init();
  17. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  18. curl_setopt($ch, CURLOPT_HEADER, 0);
  19. curl_setopt($ch, CURLOPT_POST,0);
  20. //curl_setopt($ch, CURLOPT_POSTFIELDS,$params);
  21. curl_setopt($ch, CURLOPT_URL,$url);
  22. curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
  23. curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);

  24. $result = curl_exec($ch);
  25. $start_result = strpos($result,"<!--content_start-->");


  26. $end_result = strpos($result,"<P><CENTER>",$start_result+11);
  27. $substring .= substr($result,$start_result,$end_result-$start_result);
  28. curl_close ($ch);
  29. return replaceLink($substring);
  30. }
  31. ?>
  32. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
  33. <HTML>
  34. <HEAD>
  35. <TITLE> New Document </TITLE>
  36. <meta http-equiv="Content-Type" content="text/html; charset=tis-620">
  37. </HEAD>

  38. <BODY>
  39. <h2>การตัดต่อ Article http://www.4guysfromrolla.com/webtech/index_asp.shtml <br>ผลลัพธ์ที่ได้คือ</h2><hr>
  40. <?php
  41. echo callArticle();
  42. ?>
  43. </BODY>
  44. </HTML>
คัดลอกไปที่คลิปบอร์ด
จะเห็นว่า เมื่อ curl ไปดึงบทความจากเว็บไซต์ตัวอย่างมาแล้ว ผมจะทำการ ใช้ function strpos ของ php เพื่อ ค้นหา เอา tag ที่ เป็นส่วน content ที่ผมต้องการ โดยการ find หา จุด string start และ หา string end ก็คือ บริเวณที่ tag ของ content สิ้นสุด ที่เราต้องการ
เราก็จะได้ข้อมูล บริเวณ ภายใต้แทก start และ end ของข้อมูลครับ
ทั้งนี้ ก่อนที่เราจะหา content start ได้ เราจำเป็นจะต้อง มอง content ของเว็บที่เราต้องการ ให้เป็น Dom เพื่อหา บริเวณ แทก ที่เป็นจุดเริ่มของ content ที่เราต้องการ มาครับ และ มองหา บริเวณ ของ dom จุดที่เป็น จุดสิ้นสุด ของ content ที่เราต้องการ เพื่อมาตัดต่อเอา ข้อมูลเฉพาะนะครับ

ใช้ CURL สำหรับเปิดหรือเก็บคอนเท็นต์ของเว็บไซต์อื่น ๆ

บางครั้งหลายเว็บไซต์อาจจะมีการเขียนสคริปต์ไปดึงข้อมูลคอนเท้นต์จากเว็บไซต์อื่น ๆ โดยปกติจะมี 2-3 วิธี (ใน PHP) คือ
1. ใช้ฟังก์ชั่น file_get_contents(“http://www.livescore.com”);
2. ใช้ฟังก์ชั่น socket คือ fsockopen(“http://www.livescore.com”, “80″);
3. วิธีสุดท้ายซึ่งเป็นวิธีที่ผมคิดว่าดีที่สุด คือใช้ ฟังก์ชั่นของ CURL วิธีนี้มีการใช้กันมากในเรื่องของการใช้ web service ใน PHP4
ข้อกำหนดพื้นฐานคือเว็บเซิร์ฟเวอร์ที่ใช้ทำต้องเปิดให้ใช้งาน extension curl ซะก่อน สำหรับคนที่เช่าโฮสต์ ก็เขียนเมลบอกให้ แอ็ดมินเปิดให้ก็ได้, สำหรับคนที่จะลองกับเว็บเซิร์ฟเวอร์ในเครื่องที่บ้าน ให้ไปแก้ไขไฟล์ php.ini หาคำว่า “;extension=php_curl.dll” ให้เอา “;” ออก แล้วทำการรีสตาร์ท apache ใหม่
ต่อไปมาดูกันว่า extension curl ได้ถูกเปิดใช้หรือยัง ให้ไปไปดูไฟล์ PHPINFO จะเห็นตามรูปด้านล่างนี้

หลังจากทุกอย่างเรียบร้อยแล้ว ที่นี่เราจะมาเขียนเก็บคอนเท็นต์จาก livescore.com กัน Go Go!!
[code lang="php"]
function getWebContent( $url )
{
$options = array(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HEADER => false,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_ENCODING => "",
CURLOPT_USERAGENT => "spider",
CURLOPT_AUTOREFERER => true,
CURLOPT_CONNECTTIMEOUT => 120,
CURLOPT_TIMEOUT => 120,
CURLOPT_MAXREDIRS => 10,
);
$ch = curl_init( $url );
curl_setopt_array( $ch, $options );
$content = curl_exec( $ch );
$err = curl_errno( $ch );
$errmsg = curl_error( $ch );
$header = curl_getinfo( $ch );
curl_close( $ch );
$header['errno'] = $err;
$header['errmsg'] = $errmsg;
$header['content'] = $content;
return $header;
}
$referer ="http://www.livescore.com";
$content =getWebContent($referer);
print "
";

print_r($content);

?>

[/code]
ค่าที่ content ของเว็บไซต์ที่รีเทิร์นกลับมาจะอยู่ในตัวแปร $content['content'] ฟังก์ชั่นนี้ถ้านำไปประยุกต์จะมีประโยชน์มากมายครับ
This e

โค้ด PHP ดึงข้อมูลจากเว็บอื่นด้วย CURL


ให้ลองหลับตาแล้วจินตนการให้เห็นหน้าเพจที่มีฟอร์มอยู่ฟอร์มหนึ่ง ลงมือป้อนข้อมูลลงไปในฟอร์ม กดปุ่ม submit
เบื้องหลัง เบราเซอร์จะเก็บรวบรวมข้อมูลภายในฟอร์ม สร้างขึ้นมาเป็นสตริงชุดหนึ่ง แล้วส่งไปให้กับไฟล์ที่ระบุไว้ใน target ของฟอร์ม (มันบ่ได้ส่งฟอร์มไปทั้งฟอร์มอย่างที่เราเห็นดอกนะ ส่งไปเฉพาะข้อมูลที่ถูกป้อนเท่านั้น) เมื่อไฟล์นั้นได้รับข้อมูลก็จะทำการประมวลผลตามคำสั่งที่อยู่ภายในไฟล์ ได้ผลลัพธ์อะไรเซิฟเวอร์ก็รวบรวมเป็นสตริงชุดหนึ่ง แล้วส่งกลับมาให้เบราเซอร์เจ้าของ เบราเซอร์ได้รับสตริงแล้วก็ประมวลผลแสดงออกมาเป็นหน้าเพจ
ถ้าเราต้องการทำระบบโพสต์ข้อมูลอัตโนมัติ คำตอบคือ CURL ไม่ใช่แต่เฉพาะโพสต์ฟอร์มแต่รวมไปถึงร้องขอหน้าเพจจากเซิฟเวอร์ ถ้าท่านงงๆ ให้จินตนาการง่ายๆว่าเป็นการอ่านไฟล์ข้ามเว็บไซต์ก็แล้วกัน
CURL เป็นไลบรารี่ที่อนุญาติให้เราเขียนว่าจะส่งตัวแปรอะไรไปให้ไฟล์ไหนที่เว็บไซ ต์ไหน response ที่ได้กลับมาคือผลลัพธ์ที่ถูกประมวลผลเรียบร้อยแล้ว

เราสามารถเขียนโค้ดให้โปรแกรมเราล้อกอินอัตโนมัติไปยังเว็บไซต์ไหนก็ได้ เพื่อเอาข้อมูลบางอย่าง บางคราเราก็ใช้ CURL ส่งข้อมูลเพื่อร้องขอข้อมูลจากเว็บไซต์ที่เขามีหน้าเว็บให้ป้อนข้อมูล (อัตโนมัติ ไม่ต้องใช้คนคอยป้อนข้อมูล)
ผมขออ้างอิงไปที่บทความ CURL หรือ คือคำตอบสุดท้ายสำหรับ http client application บน php เวลาผมเขียน CURL ไม่ถูกก็ได้อาศัยเว็บพี่เขา เว็บแห่งนี้เป็นเสมือนอาจารย์ที่สอน PHP เชิงลึก แก่ผมเลยทีเดียว ขอขอบคุณด้วยใจจริงครับ
สมาชิกที่ผ่านมาอ่านเจอบทความนี้ ถ้าอยากได้ความรู้แจ่มๆ แวะไปเลยครับ www.phpzealots.com รับรองไม่ผิดหวัง
โค้ดด้านล่างผมก้อปปี้มาจากเว็บพี่เขาครับ ( เพื่อให้บทความต่อเนื่อง ต้องขออนุญาติพี่ phpzelot.com ไว้ ณ ตรงนี้ด้วยนะครับ ) วิธีเขียน CURL
<?php
    $urlWithoutProtocol = "www.example.com:80/someServices";
    $request         = "";
    $isRequestHeader = false;
 
    $exHeaderInfoArr   = array();
    $exHeaderInfoArr[] = "Content-type: text/xml";
    $exHeaderInfoArr[] = "Authorization: "."Basic ".base64_encode("authen_user:authen_pwd");
 
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $urlWithoutProtocol);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
    curl_setopt($ch, CURLOPT_HEADER, (($isRequestHeader) ? 1 : 0));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    if( is_array($exHeaderInfo) && !empty($exHeaderInfo) )
    {
        curl_setopt($ch, CURLOPT_HTTPHEADER, $exHeaderInfo);
    }
    $response = curl_exec($ch);
    curl_close($ch);
 
    echo $response;
?>
โค้ดด้านล่างเป็นการเขียนแบบสั้นๆ อีกวิธีหนึ่ง ส่งตัวแปรแบบ Querystring ไปด้วย
<?php
$request = "format=csv&by=member&rs=hour&rk=productivity&rb=".$month_first_date."&re=".$cur_date = date('Y-m-d');
$urlWithoutProtocol = "www.rescuetime.com/anapi/data/?".$request ;
$isRequestHeader = FALSE;
 
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $urlWithoutProtocol);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$productivity = curl_exec($ch);
curl_close($ch);
?>
ถ้าเป็นเว็บไซต์ที่ใช้ https จะต้องเขียนอย่างนี้ครับ
<?php
$request = "format=csv&by=member&rs=hour&rk=productivity&rb=".$month_first_date."&re=".$cur_date = date('Y-m-d');
$urlWithoutProtocol = "https://www.rescuetime.com/anapi/data/?".$request ;
$isRequestHeader = FALSE;
 
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $urlWithoutProtocol);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$productivity = curl_exec($ch);
curl_close($ch);
?>
เพิ่มคำสั่งเข้ามาอีกคำสั่ง
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
ที่เว็บนี้ก็อธิบายวิธีการเขียนโค้ดล้อกอินอัตโนมัติเว็บไซต์ที่ถูก protact ไว้ ลองแวะไปดูครับ Using cURL in PHP to access HTTPS (SSL/TLS) protected sites

curl คืออะไร

curl คือฟังก์ชันที่ถูกใส่เข้ามาใน php ตั้งแต่ PHP 4.0.2. เป็นฟังก์ชันสำหรับใช้ในการติดต่อสื่อสารกับ server โดยสามารถติดต่อได้หลากหลาย protocal เช่น http, https, ftp เป็นต้น
การใช้ curl ถ้าเป็นระบบปฏิบัติการ windows ให้ copy ไฟล์ libeay32.dll และ ssleay32.dll ไปไว้ใน C:\windows\system32
และ เปิด ไฟล์ php.ini แก้บันทัด ;extension=php_curl.dll โดยลบ ; หน้าบันทัดออก
ส่วนมากการใช้งาน curl จะมี 4 ขั้นตอนคือ
1 สร้าง curl resource ด้วยฟังก์ชัน curl_init()
2 set option ให้ curl resource ด้วยฟังก์ชัน curl_setopt()
3 Execute curl resource ด้วยฟังก์ชัน curl_exec()
4 close curl resource ด้วยฟังก์ชัน curl_close()
ตัวอย่าง
$curlResource = curl_init();
curl_setopt($curlResource, CURLOPT_URL, "http://www.example.com/");
curl_exec($curlResource);
curl_close($curlResource);

 
Design by I Love PHP