المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : [شرح تفصيلى] مكتبة الاتصال والتخاطب بين السيرفرات curl


Mr.Ajax
15-01-2009, 10:58 صباحاً
السلام عليكم ورحمة الله وبركاته
الساده أعضاء مرسى الفى بى
تحية طيبه


سندرس سويا مكتبة من مكتبات 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 - ******* - User:Password Authentication
استخدمت curl فى برمجة سكربتات متطوره لعل من ابرزها سكربت موقع مررها الذى يتيح رفع الملفات الى أكثر من مركز رفع بنفس الوقت فبامكانك برمجة سكربت يقوم برفع الملفات الى الرابيد شير مثلا بدون الدخول الى الرابيد شير من الأساس
وسنتناول فيما بعد ما يهمنا من طرق الاتصال

CURL فى PHP

لا تأتى PHP بها CURL ولكن تحتاج منا الى تركيب الى سيرفرنا أو السيرفر الشخصى
فلهذا سنحتاج الى تركيب libcurl الي السيرفر

اذا كان نوع السيرفر لدينا Linux سنستخدم ssh ونطبق الأوامر التالية :

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
http://curl.haxx.se/docs/install.html

واذا كان السيرفر الذى نتعامل معه Windows ونفترض أن السيرفر نوعه appserv الشهير
سنطبق بعض الخطوات التالية لتفعيلها :



قم بالدخول الى المجلد C:\AppServ\php5
ابحث عن الملفين التاليين :

libeay32.dll
ssleay32.dll


وانسخهم الى المجلد التالى c:\windows\system32
قم بفتح ملف php.ini عن طريق احدى الطرق التاليه

الذهاب الى المسار التالى C:\Windows\php.ini
قم بفتح run واكتب بها php.ini


ابحث عن السطر التالى :
;extension=php_curl.dllوقم بتغييره الى التالى extension=php_curl.dllأى قم بحذف الفاصلة المنقوطه فقط
اذهب الى المجلد C:\AppServ\php5\ext
وابحث عن الملف التالى php_curl.dll
وانسحة الى C:\AppServ\php5
قم بعمل ريستارت ويسعمل معك curl وتكون قد فعلتها

استراتيجية استخدام CURL

لكى شئ له خطوات فى التعامل معها والتعامل مع جلسة curl يتم على خطوات تتم كالتالى :


اعلان جلسة CURL باستخدام دالة :
curl_init();
ضبط خواص الجلسه كـ : عنوان الصفحه واستخدام بروكسى وكثير من الاعدادات سنتطرق اليها بعد حين ونستخدم لضبط خواص الجلسة الداله التاليه : curl_setopt($curl_session,$option_name,$option_val ue);ويتم ضبط خاصيه واحده أو ضبط عده من الخواص وسنتطرق الى هذا فيما بعد
اعطاء أمر تنفيذ الجلسة ويتم هذا باستخدام الداله : curl_exec($curl_session);
اغلاق الجلسه وانهائها ويتم هذا باستخدام الداله : curl_close($curl_session);


تفصيل استراتيجية استخدام curl

اعلان جلسة CURL :
ينقسم اعلان الجلسات فى CURL الى نوعين :


اعلان جلسة منفردة
اعلان عدة جلسات فى نفس الوقت

اعلان جلسة واحدة منفردة :
نستخدم لاعلان جلسة curl الداله التاليه اذا كنا سنقوم باعلان جلسه واحده فقط
$curl_session = curl_init();هنا قمنا باعلان جلسة CURL جديده وقمنا بتسمية مقبض الاستعلام عن الجلسة بالمتغير $curl_session
هذا المقبض سيتم استخدامة عند جميع العمليات التاليه كضبط الخواص وتنفيذ الجلسه واغلاقها أيضا .
الداله السابقة قد يتم استخدامها هكذا أو من الممكن أن يتم اضافة معامل لها يمثل اسم الموقع الذى سيتم تطبيق الجلسه عليه واذا قمنا باضافة هذا العامل سيكون على هذه الشاكله
$ch = curl_init('http://www.traidnt.net/vb/index.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
// اعلان جلستين بطريقة اعلان جلسة منفردة
$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 .

اضافة كل خاصية على حده :
ظهر هذا فى الأمثلة السابقة ويتم ضبط الخواص باستخدام الداله :

curl_setopt($curl_session,$option_name,$option_val ue);يتم استخدام مع تلك الداله ثلاثه من المعاملات


اسم مقبض الاستعلام الخاص بالجلسه ورمز له هنا بالمتغير $curl_session
اسم الخاصيه التى نريد اسناد قيمة لها ورمز لها هنا بالمتغير $option_name
قيمة الخاصيه المسنده ورمز لها هنا بالمتغير $option_value

يوجد فى curl سلسلة كبيره جدا من الخواص التى من الممكن اسناد القيم اليها لن نذكرها جميعها ولكن سنذكر اهمها
لمزيد من الخواص قم بزيارة http://www.php.net/manual/en/function.curl-setopt.php
وظهر بالأمثله السابقه طريقة استعمالها

اضافة مصفوفة من الخواص فى ذات الوقت :
ويتم هذا بنفس الميكانيكيه التى تمت بها الاضافه بكل خاصية على حده ولكن هنا سيتم اضافة مصفوفه من الخواص بدلا من اضافة خاصيه واحده على حده ويتم هذا باستخدام الدالة :
curl_setopt_array($curl_session,$options_array);وي تم فى هذه الداله التعامل مع معاملان :


اسم مقبض الاستعلام الخاص بالجلسه ورمز اليه هنا باسم $curl_session
مصفوفة الخواص التى سيتم اضافتها ورمز اليها هنا باسم $option_array

وهنا مثال على اضافة مصفوفه من من الخواص

$options = array(CURLOPT_URL => 'http://www.example.com/',
CURLOPT_HEADER => false
);

curl_setopt_array($ch, $options);وهنا سرد لأهم الخواص وماهية عملها :


CURLOPT_URL : وهى خاصية تشير الى العنوان للصفحة الذى سيتم احضاره تنفيذ الكود عليهcurl_setopt($ch, CURLOPT_URL, 'http://localhost/upload.php');
CURLOPT_RETURNTRANSFER : خاصية تشير الى طريقة اعادة ناتج الجلسه فاذا تم ظبطه الى TRUE فسيتم اخراج ناتج الجلسه على هيئة متغير من النوع string وان لم يتم ضبطه أو تم ضبطه على FALSE فسيتم اخراج الصفحه كما هى . تفيد تلك الخاصيه اذا كنا نريد أن نقوم بعمليات على الناتج قبل اخراجه curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
CURLOPT_POST : يستخدم لتفعيل استخدام المتغير الخاص HTTP POST الذى يستخدم فى نقل المتغيرات من صفحة لأخرى curl_setopt($ch, CURLOPT_POST, 1);
CURLOPT_POSTFIELDS : يتم هنا تحديد المتغيرات التى سيتم نقلها عند تحديد استخدام HTTP POST ويجب الملاحظه هنا أن هذه الخاصيه والخاصية السابقة لها CURLOPT_POST متلازمتان وهنا قيمة الخاصية لا تكون من النوع boolean ولكنها تكون array $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 : يستخدم للوصول الى الملفات التى تحتاج الى تصاريح للوصول اليها من اسم مستخدم وكلمة مرور curl_setopt($ch,CURLOPT_USERPWD,"$username:$password");

CURLOPT_UPLOAD : يستخدم لاعداد جلسة curl وتجهيزها لرفع الملفات curl_setopt ($curl,CURLOPT_UPLOAD,1);
CURLOPT_INFILE : تستخدم لتحديد الملف المراد رفعه <?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 curl_setopt($ch, CURLOPT_TRANSFERTEXT, 1);
CURLOPT_INFILESIZE : يستخدم فى حساب الحجم المتوقع بالبايت عاه ما يستخدم فى عمليات رفع الملفات لتزويد السيرفر البعيد بحجم الملفcurl_setopt($ch, CURLOPT_INFILESIZE, filesize($filename));



اعطاء أمر تنفيذ الجلسة :

كما تحدثنا سابقا أن اعلان الجلسات هو نوعين فكذلك أيضا اعطاء أمر تنفيذ الجلسه هو نوعين :


اذا كان نوع الجلسه جلسه منفرده : نستخدم الداله curl_exec($ch);وتأخذ تلك الداله معامل واحد وهو اسم الجلسه التى سيتم تنفيذها
اذا كان نوع الجلسه عدة جلسات فى نفس الوقت : نستخدم الداله curl_multi_exec($mh,$still_running);هنا يتم استخدام اثنان من المعاملات . الأول : المقبض الذى تم توليده سابقا بساتخدام الداله curl_multi_init() . والثانى : هو متغير يشير الى استمرار تنفيذ الجلسات .

اذا كان نوع الجلسه جلسه منفرده :
<?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
// 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);

?>
اغلاق الجلسه وانهائها :

كما تحدثنا سابقا أن اعلان الجلسات واعطاء أمر تنفيذ الجلسات هنا أيضا اغلاق الجلسات هو نوعين :


اذا كان نوع الجلسه جلسه منفرده : نستخدم الداله curl_close($ch);وتأخذ تلك الداله معامل واحد وهو اسم الجلسه التى سيتم اغلاقها
اذا كان نوع الجلسه عدة جلسات فى نفس الوقت : نستخدم الداله curl_multi_close($mh);هنا يتم استخدام اثنان من المعاملات . الأول : المقبض الذى تم توليده سابقا باستخدام الداله curl_multi_init() .

والأمثله كما هو متواجد باعطاء أمر تنفيذ الجلسه


بعض دوال CURL


curl_ copy_ handle
تستخدم لنسخ مقبض الى مقبض آخر بعنوان جديد وتحتاج الى معامل واحد هو المقبض المراد نسخه .

<?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
// Create a curl handle to a non-existing ********
$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
// Create a curl handle to a non-existing ********
$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
// Create a curl handle to a non-existing ********
$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 :

http://www.php.net/curl
http://curl.haxx.se/

بنهاية شرحى لا أطلب منكم الا الدعاء لى والدعاء الصادق لأهل غزه أن يرفع عنهم البلاء
وارجو ن أكون قد وفقت فى ايصال المعلومه اليكم
وأرجو حفظ حقوقى عند نقل الموضوع لمكان آخر فالجهد المبذول به يجاوز ال4 أيام

أدام الله أيامكم بالسعاده
تحياتى
Mr.Ajax

عبدالله ابراهيم
15-01-2009, 11:23 صباحاً
مبدع والله يا احمد ,,

خ ــادم الإسلام
15-01-2009, 12:33 مساءً
جزاك الله كل خير يا ابو حميد
فنان من يومك

مصطفي درويش
16-01-2009, 11:58 صباحاً
ابدعت يا احمد :)

عماد مسعد
26-01-2009, 01:35 صباحاً
مبدع يا غالى الى الامام دائمـا

عمر
07-08-2009, 04:47 صباحاً
بارك الله فيك

Mr.Ajax
14-08-2009, 06:13 صباحاً
شرفتونى والله بمروركم

بالتوفيق يا رب

مينامينا
14-08-2009, 06:33 صباحاً
مشكور اخي الكريم
شرح كافي او وافي
ما قصرت

Mr.Ajax
14-08-2009, 07:36 مساءً
مشكور اخي الكريم
شرح كافي او وافي
ما قصرت

شاكر لك مرورك العطر

تقبل تحياتى
بالتوفيق

Hamada
17-08-2009, 01:01 صباحاً
مشكور اخوي ما قصرت

elevation style
31-08-2009, 05:55 صباحاً
يعطيك العافية ,,

واصل والى الامام