[شرح تفصيلى] مكتبة الاتصال والتخاطب بين السيرفرات cURL
السلام عليكم و رحمة الله و بركاته
سندرس سويا اليوم مكتبة من مكتبات php المشهوره وهى مكتبة CURL
سيكون حديثنا عن الcurl على عدة نقاط كالتالى :
- ما هو CURL
- CURL و PHP
- CURL on linux servers
- CURL on windows
- استراتيجية استخدامCURL
- تفصيل استراتيجية استخدام CURL
- اعلان جلسة CURL
- اضافة الخواص للجلسة
- اعطاء أمر تنفيذ الجلسة
- اغلاق الجلسه وانهاؤها
- بعض دوال CURL
- مصادر CURL
ما هو CURL :
CURL هى مكتبة طورت بواسطة المطور الغربى دانيل ستانبرج وهى اختصار لــ : Client URL
تتيح تلك المكتبة الاتصال والتخاطب بين السيرفرات باختلاف انواعها باختلاف بروتوكولات الاتصال مثل :
- HTTP - HTTP GET - HTTP POST
- HTTPS - HTTPS Certicicates
- FTP
- TELNET
- FILE
وتدعم بروتوكلات أخرى كــ : LDAP - DICT - GOPHER
وكذلك تدعم طرق أخرى للاتصال كــ : Form Upload - Proxies - Cookies - User:Password Authentication
استخدمت curl فى برمجة سكربتات متطوره لعل من ابرزها سكربت موقع مررها الذى يتيح رفع الملفات الى أكثر من مركز رفع بنفس الوقت فبامكانك برمجة سكربت يقوم برفع الملفات الى الرابيد شير مثلا بدون الدخول الى الرابيد شير من الأساس
وسنتناول فيما بعد ما يهمنا من طرق الاتصال
CURL فى PHP
لا تأتى PHP بها CURL ولكن تحتاج منا الى تركيب الى سيرفرنا أو السيرفر الشخصى
فلهذا سنحتاج الى تركيب libcurl الي السيرفر
اذا كان نوع السيرفر لدينا Linux سنستخدم ssh ونطبق الأوامر التالية :
كود PHP:
wget http://curl.haxx.se/download/curl-7.17.0.tar.gz
tar zfx curl-7.17.0.tar.gz
./configure
make
make test (optional)
make install
واذا كان السيرفر الذى نتعامل معه Windows ونفترض أن السيرفر نوعه appserv الشهير
سنطبق بعض الخطوات التالية لتفعيلها : - قم بالدخول الى المجلد C:\AppServ\php5
- ابحث عن الملفين التاليين :
- libeay32.dll
- ssleay32.dll
- وانسخهم الى المجلد التالى c:\windows\system32
- قم بفتح ملف php.ini عن طريق احدى الطرق التاليه
- الذهاب الى المسار التالى C:\Windows\php.ini
- قم بفتح run واكتب بها php.ini
- ابحث عن السطر التالى :
كود PHP:
;extension=php_curl.dll
وقم بتغييره الى التالى
كود PHP:
extension=php_curl.dll
- أى قم بحذف الفاصلة المنقوطه فقط
- اذهب الى المجلد C:\AppServ\php5\ext
- وابحث عن الملف التالى php_curl.dll
- وانسحة الى C:\AppServ\php5
- قم بعمل ريستارت ويسعمل معك curl وتكون قد فعلتها
استراتيجية استخدام CURL
لكى شئ له خطوات فى التعامل معها والتعامل مع جلسة curl يتم على خطوات تتم كالتالى :
- اعلان جلسة CURL باستخدام دالة :
- ضبط خواص الجلسه كـ : عنوان الصفحه واستخدام بروكسى وكثير من الاعدادات سنتطرق اليها بعد حين ونستخدم لضبط خواص الجلسة الداله التاليه :
كود PHP:
curl_setopt($curl_session,$option_name,$option_value);
ويتم ضبط خاصيه واحده أو ضبط عده من الخواص وسنتطرق الى هذا فيما بعد
اعطاء أمر تنفيذ الجلسة ويتم هذا باستخدام الداله :
كود PHP:
curl_exec($curl_session);
اغلاق الجلسه وانهائها ويتم هذا باستخدام الداله :
كود PHP:
curl_close($curl_session);
تفصيل استراتيجية استخدام curl
اعلان جلسة CURL :
ينقسم اعلان الجلسات فى CURL الى نوعين :
- اعلان جلسة منفردة
- اعلان عدة جلسات فى نفس الوقت
اعلان جلسة واحدة منفردة :
نستخدم لاعلان جلسة curl الداله التاليه اذا كنا سنقوم باعلان جلسه واحده فقط
كود PHP:
$curl_session = curl_init();
هنا قمنا باعلان جلسة CURL جديده وقمنا بتسمية مقبض الاستعلام عن الجلسة بالمتغير $curl_session
هذا المقبض سيتم استخدامة عند جميع العمليات التاليه كضبط الخواص وتنفيذ الجلسه واغلاقها أيضا .
الداله السابقة قد يتم استخدامها هكذا أو من الممكن أن يتم اضافة معامل لها يمثل اسم الموقع الذى سيتم تطبيق الجلسه عليه واذا قمنا باضافة هذا العامل سيكون على هذه الشاكله
كود PHP:
$ch = curl_init('http://www.traidnt.net/vb/index.php');
مثال :
كود PHP:
<?php// فتح جلسة جديده
$ch = curl_init();
// ضبط بعض الخواص
curl_setopt($ch, CURLOPT_URL, "http://www.traidnt.net/vb/index.php");
// تنفيذ الجلسة
curl_exec($ch);
// اغلاق وانهاء الجلسة
curl_close($ch);
?>
اعلان عدة جلسات فى نفس الوقت :
قد نحتاج لأعلان اكثر من جلسه بنفس الوقت فى هذه الحاله سيكون الوضع كما يلى :
- اعلان كل جلسه على حده باعتبارها جلسه منفردة .
- نقوم بربطهم بمقبض واحد متعدد باستخدام الدالة curl_multi_init تجهيزهم للعمل على التوازى .
كما يظهر بالمثال التالى :
كود PHP:
<?php// اعلان جلستين بطريقة اعلان جلسة منفردة
$ch1 = curl_init();
$ch2 = curl_init();
// ضبط بعض خواص الجلسة
curl_setopt($ch1, CURLOPT_URL, "http://www.traidnt.net/vb/index.php");
curl_setopt($ch2, CURLOPT_URL, "http://www.marsavb.net/vb/index.php");
//اضافة المقبض الذى سيتعامل مع اكثر من جلسة
$mh = curl_multi_init();
//اضافة المقابض لكل جلسة على حده
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);
//تنفيذ مقابض الجلسة
do {
curl_multi_exec($mh,$running);
} while ($running > 0);
//اغلاق الجلسه والمقابض
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
?>
فى هذا المثال قمنا باعلان جلستين هم : ch1 و ch2 وقمنا بعدها باضافة بعض الخواص الخاصه بهما كعنوان الصفحه التى سنتعامل معها
وقمنا بعد ذلك باضافتهم الى مقبض متعدد ثم بعد ذلك يتم تشغيلهم على التوازى .
اضافة الخواص للجلسه :
تعتبر الخواص هى اليد المسيره لجلسة curl فعن طريقها يتم تحديد كثير من جهات التحكم بالجلسه
و يمكن اضافة الخواص الى الجلسات عن طريقين :
- اضافة كل خاصية على حده باسخدام الداله curl_setopt .
- اضافة مصفوفه أو عدد من الخواص فى نفس الوقت باستخدام الدالة curl_setopt_array .
اضافة كل خاصية على حده :
ظهر هذا فى الأمثلة السابقة ويتم ضبط الخواص باستخدام الداله :
كود PHP:
curl_setopt($curl_session,$option_name,$option_value);
يتم استخدام مع تلك الداله ثلاثه من المعاملات
- اسم مقبض الاستعلام الخاص بالجلسه ورمز له هنا بالمتغير $curl_session
- اسم الخاصيه التى نريد اسناد قيمة لها ورمز لها هنا بالمتغير $option_name
- قيمة الخاصيه المسنده ورمز لها هنا بالمتغير $option_value
يوجد فى curl سلسلة كبيره جدا من الخواص التى من الممكن اسناد القيم اليها لن نذكرها جميعها ولكن سنذكر اهمها
لمزيد من الخواص قم بزيارة PHP: curl_setopt - Manual
وظهر بالأمثله السابقه طريقة استعمالها
اضافة مصفوفة من الخواص فى ذات الوقت :
ويتم هذا بنفس الميكانيكيه التى تمت بها الاضافه بكل خاصية على حده ولكن هنا سيتم اضافة مصفوفه من الخواص بدلا من اضافة خاصيه واحده على حده ويتم هذا باستخدام الدالة :
كود PHP:
curl_setopt_array($curl_session,$options_array);
ويتم فى هذه الداله التعامل مع معاملان :
- اسم مقبض الاستعلام الخاص بالجلسه ورمز اليه هنا باسم $curl_session
- مصفوفة الخواص التى سيتم اضافتها ورمز اليها هنا باسم $option_array
وهنا مثال على اضافة مصفوفه من من الخواص
كود PHP:
$options = array(CURLOPT_URL => 'http://www.example.com/', CURLOPT_HEADER => false
);
curl_setopt_array($ch, $options);
وهنا سرد لأهم الخواص وماهية عملها :
CURLOPT_URL : وهى خاصية تشير الى العنوان للصفحة الذى سيتم احضاره تنفيذ الكود عليه
كود PHP:
curl_setopt($ch, CURLOPT_URL, 'http://localhost/upload.php');
CURLOPT_RETURNTRANSFER : خاصية تشير الى طريقة اعادة ناتج الجلسه فاذا تم ظبطه الى TRUE فسيتم اخراج ناتج الجلسه على هيئة متغير من النوع string وان لم يتم ضبطه أو تم ضبطه على FALSE فسيتم اخراج الصفحه كما هى . تفيد تلك الخاصيه اذا كنا نريد أن نقوم بعمليات على الناتج قبل اخراجه
كود PHP:
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
CURLOPT_POST : يستخدم لتفعيل استخدام المتغير الخاص HTTP POST الذى يستخدم فى نقل المتغيرات من صفحة لأخرى
كود PHP:
curl_setopt($ch, CURLOPT_POST, 1);
CURLOPT_POSTFIELDS : يتم هنا تحديد المتغيرات التى سيتم نقلها عند تحديد استخدام HTTP POST ويجب الملاحظه هنا أن هذه الخاصيه والخاصية السابقة لها CURLOPT_POST متلازمتان وهنا قيمة الخاصية لا تكون من النوع boolean ولكنها تكون array
كود PHP:
$data = array('name' => 'Foo', 'file' => '@/home/user/test.png');
curl_setopt($ch, CURLOPT_URL, 'http://localhost/upload.php');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
CURLOPT_USERPWD : يستخدم للوصول الى الملفات التى تحتاج الى تصاريح للوصول اليها من اسم مستخدم وكلمة مرور
كود PHP:
curl_setopt($ch,CURLOPT_USERPWD,"$username:$password");
CURLOPT_UPLOAD : يستخدم لاعداد جلسة curl وتجهيزها لرفع الملفات
كود PHP:
curl_setopt ($curl,CURLOPT_UPLOAD,1);
CURLOPT_INFILE : تستخدم لتحديد الملف المراد رفعه
كود PHP:
<?php$filename = '/path/localfile.txt';
$fh = fopen($filename, "r");
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'ftp://username:password@ftpserver.com/path/newfile.txt');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_UPLOAD, 1);
curl_setopt($ch, CURLOPT_INFILE, $fp);
curl_setopt($ch, CURLOPT_TRANSFERTEXT, 1);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($filename));
$output = curl_exec($ch);
curl_close($ch);
print $output;
?>
CURLOPT_TRANSFERTEXT : نعلم أن هناك نوعين من نظام نقل الملفات الأول : Binary والثانى ASCII وفى هذه الخاصيه اذا تم تعيينها على TRUE فسيتم استخدام النظام ASCII
كود PHP:
curl_setopt($ch, CURLOPT_TRANSFERTEXT, 1);
CURLOPT_INFILESIZE : يستخدم فى حساب الحجم المتوقع بالبايت عاه ما يستخدم فى عمليات رفع الملفات لتزويد السيرفر البعيد بحجم الملف
كود PHP:
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($filename));
اعطاء أمر تنفيذ الجلسة :
كما تحدثنا سابقا أن اعلان الجلسات هو نوعين فكذلك أيضا اعطاء أمر تنفيذ الجلسه هو نوعين :
- اذا كان نوع الجلسه جلسه منفرده : نستخدم الدالهوتأخذ تلك الداله معامل واحد وهو اسم الجلسه التى سيتم تنفيذها
- اذا كان نوع الجلسه عدة جلسات فى نفس الوقت : نستخدم الداله
كود PHP:
curl_multi_exec($mh,$still_running);
هنا يتم استخدام اثنان من المعاملات . الأول : المقبض الذى تم توليده سابقا بساتخدام الداله curl_multi_init() . والثانى : هو متغير يشير الى استمرار تنفيذ الجلسات .
اذا كان نوع الجلسه جلسه منفرده :
كود PHP:
<?php// create a new cURL resource
$ch = curl_init();
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch, CURLOPT_HEADER, 0);
// grab URL and pass it to the browser
curl_exec($ch);
// close cURL resource, and free up system resources
curl_close($ch);
?>
اذا كان نوع الجلسه عدة جلسات فى نفس الوقت :
كود PHP:
<?php// create both cURL resources
$ch1 = curl_init();
$ch2 = curl_init();
// set URL and other appropriate options
curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net/");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/");
curl_setopt($ch2, CURLOPT_HEADER, 0);
//create the multiple cURL handle
$mh = curl_multi_init();
//add the two handles
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);
$active = null;
//execute the handles
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($active && $mrc == CURLM_OK) {
if (curl_multi_select($mh) != -1) {
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
//close the handles
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
?>
اغلاق الجلسه وانهائها :
كما تحدثنا سابقا أن اعلان الجلسات واعطاء أمر تنفيذ الجلسات هنا أيضا اغلاق الجلسات هو نوعين :
- اذا كان نوع الجلسه جلسه منفرده : نستخدم الداله
كود PHP:
curl_close($ch);
وتأخذ تلك الداله معامل واحد وهو اسم الجلسه التى سيتم اغلاقها
- اذا كان نوع الجلسه عدة جلسات فى نفس الوقت : نستخدم الداله
كود PHP:
curl_multi_close($mh);
هنا يتم استخدام اثنان من المعاملات . الأول : المقبض الذى تم توليده سابقا باستخدام الداله curl_multi_init() .
والأمثله كما هو متواجد باعطاء أمر تنفيذ الجلسه
بعض دوال CURL
curl_ copy_ handle
تستخدم لنسخ مقبض الى مقبض آخر بعنوان جديد وتحتاج الى معامل واحد هو المقبض المراد نسخه .
كود PHP:
<?php// create a new cURL resource
$ch = curl_init();
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/');
curl_setopt($ch, CURLOPT_HEADER, 0);
// copy the handle
$ch2 = curl_copy_handle($ch);
// grab URL (http://www.example.com/) and pass it to the browser
curl_exec($ch2);
// close cURL resources, and free up system resources
curl_close($ch2);
curl_close($ch);
?>
هنا تم نسخ المقبض ch الى المقبض ch2
curl_error
تستخدم لمعرفة تفاصيل آخر خطأ حدث وتحتاج الى معامل واحد هو المقبض الخاص بالجلسة .
كود PHP:
<?php// Create a curl handle to a non-existing location
$ch = curl_init('http://404.php.net/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
if(curl_exec($ch) === false)
{
echo 'Curl error: ' . curl_error($ch);
}
else
{
echo 'Operation completed without any errors';
}
// Close handle
curl_close($ch);
?>
curl_errno
تستخدم لمعرفة رقم آخر خطأ حدث وتحتاج لمعامل واحد وهو المقبض الخاص بالجلسه .
كود PHP:
<?php// Create a curl handle to a non-existing location
$ch = curl_init('http://404.php.net/');
// Execute
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
// Check if any error occured
if(curl_errno($ch))
{
echo 'Curl error: ' . curl_error($ch);
}
// Close handle
curl_close($ch);
?>
الداله curl_getinfo
تستخدم الداله فى جلب بعض المعلومات عن الجلسه الحاليه
تخرج لنا البيانات على هيئه مصفوفه تحتوى على البيانات التاليه :
- "url"
- "content_type"
- "http_code"
- "header_size"
- "request_size"
- "filetime"
- "ssl_verify_result"
- "redirect_count"
- "total_time"
- "namelookup_time"
- "connect_time"
- "pretransfer_time"
- "size_upload"
- "size_download"
- "speed_download"
- "speed_upload"
- "download_content_length"
- "upload_content_length"
- "starttransfer_time"
- "redirect_time"
كود PHP:
<?php// Create a curl handle to a non-existing location
$ch = curl_init('http://www.yahoo.com/');
// Execute
curl_exec($ch);
// Check if any error occured
if(!curl_errno($ch))
{
$info = curl_getinfo($ch);
echo 'Took ' . $info['total_time'] . ' seconds to send a request to ' . $info['url'];
}
// Close handle
curl_close($ch);
?>
] مصادر curl :
PHP: cURL - Manual
cURL and libcurl
الموضوع ليس اجتهاد شخصي و إنما منقول للفائدة و لأهميته في هذه اللغة