۱۳۸۶/۰۱/۰۵

آموزش CURL در PHP

CURL, Client URL Library Functions

معرفی
PHP از libcurl (کتابخانه ای که توسط Daniel Stenberg درست شده است) پشتیبانی می کند. این کتابخانه یه شما امکان اتصال به سرور ها مختلف با پروتکل های متفاوت را می دهد. libcurl در حال حاضر از پروتکل های http, https, ftp, gopher, telnet, dict, file و ldap پشتیبانی می کند. همچنین libcurl از HTTPS certificates, HTTP POST, HTTP PUT, FTP uploading, HTTP form based upload, proxies, cookies و user+password authentication پشتیبانی می کند.
تابع های CURL از PHP 4.0.2 به بعد افزوده شده اند.

موارد مورد نیاز
نصب بسته libcurl (اینجا کلیک کنید. PHP به libcurl 7.0.2-beta یا بالاتر نیاز دارد.)
libcurl 7.9.0 با بالاتر برای PHP 4.2.3
libcurl 7.9.8 یا بالاتر برای PHP 4.3.0
libcurl 7.10.5 یا بالاتر برای PHP 5.0.0

توضیحات آموزشی
بعد از راه اندازی PHP با پشتیبانی از CURL شما می توانید از تابع های CURL استفاده نمائید. اولین کاری که نیاز به انجام آن دارید استفاده از تابع curl_init() برای شروع یک session (جلسه) CURL است. سپس با استفاده از تابع curl_setopt() گزینه های مختلف (options) را set (تنظیم) نمائید. حال با استفاده از تابع curl_exec() می توانید session CURL را اجرا نمائید. در آخرین مرحله session CURL را با اجرای تابع curl_close() از بین ببرید.

توابع CURL
curl_close : بستن (از بین بردن؟) session CURL فعلی
curl_copy_handle : کپی کردن یک CURL handle به همراه تمامی تنظیمات آن (از PHP 5 به بعد قابل استفاده می باشد)
curl_errno : آخرین شماره خطا را باز می گرداند
curl_error : آخرین خطای session فعلی را به صورت یک string (رشته) باز می گرداند
curl_exec : اجرای CURL
curl_getinfo : نمایش اطلاعات یک تبادل
curl_init : شروع یک session جدید
curl_setopt : تنظیم کردن (set) یک گزینه (option)
curl_setopt_array : تنظیم کردن (set) همزمان چند گزینه مختلف (options)
curl_version : نسخه CURL مورد استفاده را باز می گرداند.

توابع زیر از PHP 5 به بعد قابل استفاده می باشند:

curl_multi_add_handle : Add a normal cURL handle to a cURL multi handle
curl_multi_close : Close a set of cURL handles
curl_multi_exec : Run the sub-connections of the current cURL handle
curl_multi_getcontent : Return the content of a cURL handle if CURLOPT_RETURNTRANSFER is set
curl_multi_info_read : Get information about the current transfers
curl_multi_init : Returns a new cURL multi handle
curl_multi_remove_handle : Remove a multi handle from a set of cURL handles
curl_multi_select : Get all the sockets associated with the cURL extension, which can then be "selected"


ثابت های CURL (Predefined Constants)
بعد از راه اندازی CURL تعدادی ثابت مربوط به CURL در دسترس قرار می گیرند. لیست این تابت های در زیر آمده است:

CURLOPT_AUTOREFERER (integer)
    Available since PHP 5.1.0
CURLOPT_COOKIESESSION (integer)
    Available since PHP 5.1.0
CURLOPT_DNS_USE_GLOBAL_CACHE (integer)
CURLOPT_DNS_CACHE_TIMEOUT (integer)
CURLOPT_FTPSSLAUTH (integer)
    Available since PHP 5.1.0
CURLOPT_PORT (integer)
CURLOPT_FILE (integer)
CURLOPT_INFILE (integer)
CURLOPT_INFILESIZE (integer)
CURLOPT_URL (integer)
CURLOPT_PROXY (integer)
CURLOPT_VERBOSE (integer)
CURLOPT_HEADER (integer)
CURLOPT_HTTPHEADER (integer)
CURLOPT_NOPROGRESS (integer)
CURLOPT_NOBODY (integer)
CURLOPT_FAILONERROR (integer)
CURLOPT_UPLOAD (integer)
CURLOPT_POST (integer)
CURLOPT_FTPLISTONLY (integer)
CURLOPT_FTPAPPEND (integer)
CURLOPT_NETRC (integer)
CURLOPT_FOLLOWLOCATION (integer)
CURLOPT_FTPASCII (integer)
CURLOPT_PUT (integer)
CURLOPT_MUTE (integer)
CURLOPT_USERPWD (integer)
CURLOPT_PROXYUSERPWD (integer)
CURLOPT_RANGE (integer)
CURLOPT_TIMEOUT (integer)
CURLOPT_POSTFIELDS (integer)
CURLOPT_REFERER (integer)
CURLOPT_USERAGENT (integer)
CURLOPT_FTPPORT (integer)
CURLOPT_FTP_USE_EPSV (integer)
CURLOPT_LOW_SPEED_LIMIT (integer)
CURLOPT_LOW_SPEED_TIME (integer)
CURLOPT_RESUME_FROM (integer)
CURLOPT_COOKIE (integer)
CURLOPT_SSLCERT (integer)
CURLOPT_SSLCERTPASSWD (integer)
CURLOPT_WRITEHEADER (integer)
CURLOPT_SSL_VERIFYHOST (integer)
CURLOPT_COOKIEFILE (integer)
CURLOPT_SSLVERSION (integer)
CURLOPT_TIMECONDITION (integer)
CURLOPT_TIMEVALUE (integer)
CURLOPT_CUSTOMREQUEST (integer)
CURLOPT_STDERR (integer)
CURLOPT_TRANSFERTEXT (integer)
CURLOPT_RETURNTRANSFER (integer)
CURLOPT_QUOTE (integer)
CURLOPT_POSTQUOTE (integer)
CURLOPT_INTERFACE (integer)
CURLOPT_KRB4LEVEL (integer)
CURLOPT_HTTPPROXYTUNNEL (integer)
CURLOPT_FILETIME (integer)
CURLOPT_WRITEFUNCTION (integer)
CURLOPT_READFUNCTION (integer)
CURLOPT_PASSWDFUNCTION (integer)
CURLOPT_HEADERFUNCTION (integer)
CURLOPT_MAXREDIRS (integer)
CURLOPT_MAXCONNECTS (integer)
CURLOPT_CLOSEPOLICY (integer)
CURLOPT_FRESH_CONNECT (integer)
CURLOPT_FORBID_REUSE (integer)
CURLOPT_RANDOM_FILE (integer)
CURLOPT_EGDSOCKET (integer)
CURLOPT_CONNECTTIMEOUT (integer)
CURLOPT_SSL_VERIFYPEER (integer)
CURLOPT_CAINFO (integer)
CURLOPT_CAPATH (integer)
CURLOPT_COOKIEJAR (integer)
CURLOPT_SSL_CIPHER_LIST (integer)
CURLOPT_BINARYTRANSFER (integer)
CURLOPT_NOSIGNAL (integer)
CURLOPT_PROXYTYPE (integer)
CURLOPT_BUFFERSIZE (integer)
CURLOPT_HTTPGET (integer)
CURLOPT_HTTP_VERSION (integer)
CURLOPT_SSLKEY (integer)
CURLOPT_SSLKEYTYPE (integer)
CURLOPT_SSLKEYPASSWD (integer)
CURLOPT_SSLENGINE (integer)
CURLOPT_SSLENGINE_DEFAULT (integer)
CURLOPT_SSLCERTTYPE (integer)
CURLOPT_CRLF (integer)
CURLOPT_ENCODING (integer)
CURLOPT_PROXYPORT (integer)
CURLOPT_UNRESTRICTED_AUTH (integer)
CURLOPT_FTP_USE_EPRT (integer)
CURLOPT_HTTP200ALIASES (integer)
CURLOPT_HTTPAUTH (integer)
CURLAUTH_BASIC (integer)
CURLAUTH_DIGEST (integer)
CURLAUTH_GSSNEGOTIATE (integer)
CURLAUTH_NTLM (integer)
CURLAUTH_ANY (integer)
CURLAUTH_ANYSAFE (integer)
CURLOPT_PROXYAUTH (integer)
CURLCLOSEPOLICY_LEAST_RECENTLY_USED (integer)
CURLCLOSEPOLICY_LEAST_TRAFFIC (integer)
CURLCLOSEPOLICY_SLOWEST (integer)
CURLCLOSEPOLICY_CALLBACK (integer)
CURLCLOSEPOLICY_OLDEST (integer)
CURLINFO_EFFECTIVE_URL (integer)
CURLINFO_HTTP_CODE (integer)
CURLINFO_HEADER_SIZE (integer)
CURLINFO_REQUEST_SIZE (integer)
CURLINFO_TOTAL_TIME (integer)
CURLINFO_NAMELOOKUP_TIME (integer)
CURLINFO_CONNECT_TIME (integer)
CURLINFO_PRETRANSFER_TIME (integer)
CURLINFO_SIZE_UPLOAD (integer)
CURLINFO_SIZE_DOWNLOAD (integer)
CURLINFO_SPEED_DOWNLOAD (integer)
CURLINFO_SPEED_UPLOAD (integer)
CURLINFO_FILETIME (integer)
CURLINFO_SSL_VERIFYRESULT (integer)
CURLINFO_CONTENT_LENGTH_DOWNLOAD (integer)
CURLINFO_CONTENT_LENGTH_UPLOAD (integer)
CURLINFO_STARTTRANSFER_TIME (integer)
CURLINFO_CONTENT_TYPE (integer)
CURLINFO_REDIRECT_TIME (integer)
CURLINFO_REDIRECT_COUNT (integer)
CURL_VERSION_IPV6 (integer)
CURL_VERSION_KERBEROS4 (integer)
CURL_VERSION_SSL (integer)
CURL_VERSION_LIBZ (integer)
CURLVERSION_NOW (integer)
CURLE_OK (integer)
CURLE_UNSUPPORTED_PROTOCOL (integer)
CURLE_FAILED_INIT (integer)
CURLE_URL_MALFORMAT (integer)
CURLE_URL_MALFORMAT_USER (integer)
CURLE_COULDNT_RESOLVE_PROXY (integer)
CURLE_COULDNT_RESOLVE_HOST (integer)
CURLE_COULDNT_CONNECT (integer)
CURLE_FTP_WEIRD_SERVER_REPLY (integer)
CURLE_FTP_ACCESS_DENIED (integer)
CURLE_FTP_USER_PASSWORD_INCORRECT (integer)
CURLE_FTP_WEIRD_PASS_REPLY (integer)
CURLE_FTP_WEIRD_USER_REPLY (integer)
CURLE_FTP_WEIRD_PASV_REPLY (integer)
CURLE_FTP_WEIRD_227_FORMAT (integer)
CURLE_FTP_CANT_GET_HOST (integer)
CURLE_FTP_CANT_RECONNECT (integer)
CURLE_FTP_COULDNT_SET_BINARY (integer)
CURLE_PARTIAL_FILE (integer)
CURLE_FTP_COULDNT_RETR_FILE (integer)
CURLE_FTP_WRITE_ERROR (integer)
CURLE_FTP_QUOTE_ERROR (integer)
CURLE_HTTP_NOT_FOUND (integer)
CURLE_WRITE_ERROR (integer)
CURLE_MALFORMAT_USER (integer)
CURLE_FTP_COULDNT_STOR_FILE (integer)
CURLE_READ_ERROR (integer)
CURLE_OUT_OF_MEMORY (integer)
CURLE_OPERATION_TIMEOUTED (integer)
CURLE_FTP_COULDNT_SET_ASCII (integer)
CURLE_FTP_PORT_FAILED (integer)
CURLE_FTP_COULDNT_USE_REST (integer)
CURLE_FTP_COULDNT_GET_SIZE (integer)
CURLE_HTTP_RANGE_ERROR (integer)
CURLE_HTTP_POST_ERROR (integer)
CURLE_SSL_CONNECT_ERROR (integer)
CURLE_FTP_BAD_DOWNLOAD_RESUME (integer)
CURLE_FILE_COULDNT_READ_FILE (integer)
CURLE_LDAP_CANNOT_BIND (integer)
CURLE_LDAP_SEARCH_FAILED (integer)
CURLE_LIBRARY_NOT_FOUND (integer)
CURLE_FUNCTION_NOT_FOUND (integer)
CURLE_ABORTED_BY_CALLBACK (integer)
CURLE_BAD_FUNCTION_ARGUMENT (integer)
CURLE_BAD_CALLING_ORDER (integer)
CURLE_HTTP_PORT_FAILED (integer)
CURLE_BAD_PASSWORD_ENTERED (integer)
CURLE_TOO_MANY_REDIRECTS (integer)
CURLE_UNKNOWN_TELNET_OPTION (integer)
CURLE_TELNET_OPTION_SYNTAX (integer)
CURLE_OBSOLETE (integer)
CURLE_SSL_PEER_CERTIFICATE (integer)
CURLE_GOT_NOTHING (integer)
CURLE_SSL_ENGINE_NOTFOUND (integer)
CURLE_SSL_ENGINE_SETFAILED (integer)
CURLE_SEND_ERROR (integer)
CURLE_RECV_ERROR (integer)
CURLE_SHARE_IN_USE (integer)
CURLE_SSL_CERTPROBLEM (integer)
CURLE_SSL_CIPHER (integer)
CURLE_SSL_CACERT (integer)
CURLE_BAD_CONTENT_ENCODING (integer)
CURLE_LDAP_INVALID_URL (integer)
CURLE_FILESIZE_EXCEEDED (integer)
CURLE_FTP_SSL_FAILED (integer)
CURLFTPAUTH_DEFAULT (integer)
    Available since PHP 5.1.0
CURLFTPAUTH_SSL (integer)
    Available since PHP 5.1.0
CURLFTPAUTH_TLS (integer)
    Available since PHP 5.1.0
CURLPROXY_HTTP (integer)
CURLPROXY_SOCKS5 (integer)
CURL_NETRC_OPTIONAL (integer)
CURL_NETRC_IGNORED (integer)
CURL_NETRC_REQUIRED (integer)
CURL_HTTP_VERSION_NONE (integer)
CURL_HTTP_VERSION_1_0 (integer)
CURL_HTTP_VERSION_1_1 (integer)
CURLM_CALL_MULTI_PERFORM (integer)
CURLM_OK (integer)
CURLM_BAD_HANDLE (integer)
CURLM_BAD_EASY_HANDLE (integer)
CURLM_OUT_OF_MEMORY (integer)
CURLM_INTERNAL_ERROR (integer)
CURLMSG_DONE (integer)


مثال ها
1- کد زیر محتویات آدرس http://dev.cheshmak.net را در فایل dev_hompage.txt ذخیره می نماید:
[php]
<?php

$ch = curl_init("http://dev.cheshmak.net/");
$fp = fopen("dev_homepage.txt", "w");

curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);

curl_exec($ch);
curl_close($ch);
fclose($fp);
?>
[/php]

2- نمایش آدرس http://dev.cheshmak.net :
[php]
<?php
$ch = curl_init() or die(curl_error());
curl_setopt($ch, CURLOPT_URL,"http://dev.cheshmak.net");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data1=curl_exec($ch) or die(curl_error());
echo $data1;
echo curl_error($ch);
curl_close($ch);
?>
[/php]

3- نمایش آدرس http://dev.cheshmak.net به همراه ارسال پارامتر به صورت POST :
[php]
<?php
$a=$_POST["a"]; // Form posted value
$ch = curl_init() or die(curl_error());
$params="a=$a";
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS,$params);
curl_setopt($ch, CURLOPT_URL,"http://dev.cheshmak.net");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data1=curl_exec($ch) or die(curl_error());
echo $data1;
echo curl_error($ch);
curl_close($ch);
?>
[/php]

4- لاگین کردن به سایت YAHOO.com :
[php]
<?php
// Script created by Nur-E-Alam Khan
// Email: porosh@msn.com (Dhaka, Bangladesh)

$url ="http://login.yahoo.com/config/login?.src=ym&amp;.intl=us&amp;.partner=&amp;.done=http%3A%2F%2Fmail.yahoo.com%2F";
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt ($ch, CURLOPT_COOKIEJAR, '/temp/cookie.txt');
curl_setopt ($ch, CURLOPT_POSTFIELDS, "login=emailid&amp;passwd=password&amp;&amp;submit=Sign In");
ob_start();
curl_exec ($ch);
ob_end_clean();
curl_close ($ch);
unset($ch);
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_COOKIEFILE, "/temp/cookie.txt");
curl_setopt($ch, CURLOPT_URL,"http://us.f515.mail.yahoo.com/ym/login?");
$result = curl_exec ($ch);

curl_close ($ch);
echo $result;
?>
[/php]

منابع
PHP Manual
weberdev.com

۱۹ نظر:

  1. سلام سعید جان.
    عیدت مبارک .
    نبودی یه چند روزی !!
    دستت درد نکنه . خیلی به درد بخور بودش.
    استفاده زیادی کردم.
    قربونت برم.
    مهدی

    پاسخحذف
  2. عزیز جان ما که نه از curl سر در میاریم نه از php
    فقط میتونیم بگیم وقتشو بیشتر کنید .
    حتما خوب بوده که مهدی به دردش خورده دیگه . پس :
    دستت درد نکنه . وقتشو هم بیشتر کن ! (;

    پاسخحذف
  3. سلام
    با curl میشه اسکری‍تی نوشت که به سایت یاهو لاگین کنه و بعد به سایت webmessenger.yahoo.com و بعد به یک id خاصی pm بفرسته ؟

    نومونه جاوا اینو ‍یدا کردم ولی با وجه به اینکه هاست من php هستش نمیتونم run کنمش.
    اگه میشه یه کم توضیح بدید.

    با تشکر
    وبلاگ خوبی داری و مطالبش برای من که تازه به لینوکس روی آوردم مفید بوده.
    موفق باشی.

    پاسخحذف
  4. @afshin:
    از شدنش که میشه. فقط باید رووش کار کرد. اگه به جایی رسیدم بی خبرتون نمی زارم.

    پاسخحذف
  5. سلام
    مرسی سعید جان
    منتظر خبرت هستم.

    پاسخحذف
  6. سلام.
    خیلی جالبه.
    دیگه چه کارهایی میشه کرد.
    من دانشجوی IT هستم و یک سالی هست که با phpکار میکنم.
    ممنون میشم کمکم کنید.

    اگر دامین ، فضا ، سایت ، پورتال یا چیزهای دیگه ای خواستید من در خدمتم.

    پاسخحذف
  7. سلام دوست عزیز خسته نباشید
    بعضی اسکریپتها که میخوام نصب کنم یه ارور میزنه که نمیتونم درست شکنم
    اگه بتونید کمک کنید ممنون میشم
    eror=curl.php no suport

    پاسخحذف
  8. سلام،
    این خطا به خاطر غیر فعال بودن کتابخانه CURL رخ میده. برای فعال کردنش باید با بخش پشتیبانی هاستینگتون تماس بگیرید.

    پاسخحذف
  9. با سلام
    مرسی از مطلب مفیدتون
    آیا روی local هم کار میکنه ؟
    php_curl هم فعال.
    من از wamp5 استفاده میکنم.
    با تشکر فراوان

    پاسخحذف
  10. salam be modir site

    vaghan az shoma bekhter mataln mosab tashakor mikoonam

    besir sepas

    پاسخحذف
  11. سلام، آقای زبردست چگونه می توانیم برای ورود به سایت (sign in) از google استفاده کنیم؟
    چیزی شبیه به این sign in with google
    به این شکل کاربر وارد اکانت گوگل (جیمیل) خود بشود و از این طریق بتوان کاربر را شناسایی کرد(Authorization)
    مانند سایت هایی مثل stackoverflow.com که در آنها کاربر می تواند برای ورود به پروفایل خود از اکانت های google ، facebook ،yahoo و… استفاده کند

    پاسخحذف
  12. سلام،
    در صفحه زیر، از سایت گوگل، راهنمای لازم برای پیاده سازی این سیستم مشخص شده:
    https://developers.google.com/accounts

    پاسخحذف
  13. سلام آقا سعید خسته نباشی.میخوام بدونم چطور میشه بعد از دستیابی به اطلاعات سایت که در بالا فرمودید به اطلاعات یک بخش مشخص مثلا یک تگ مشخص از همون اطلاعات بدست اومده دست پیدا کرد؟مثلا بعد از بدست آوردن کل محتویات سایت که با curl انجام میشه بتونیم عنوان یک پست که در یک تگ قرار داره روبدست بیاریم؟

    پاسخحذف
  14. سلام،
    شما میتونی با استفاده از Regex ها و یک زبان برنامه نویسی مثل PHP یا جاوا این کار رو انجام بدین. لینک های زیر رو ببینید:
    http://us1.php.net/preg_match
    http://www.phpliveregex.com

    پاسخحذف
  15. easy php to pc man ejra nemishe chikar konam??????

    پاسخحذف