المؤلف: أرميل فوفو
العنوان الأصلي: http://www.phpbuilder.net/columns/armel20010427.php3
المترجم: شو [email protected]
http://www.phpobject.net/blog/
يمكن لـ PHP فتح مآخذ التوصيل للخوادم البعيدة أو المحلية! فيما يلي مثال بسيط لاستخدام المقابس: اتصل بخادم أخبار Usenet، وتواصل مع الخادم، وقم بتنزيل بعض المقالات من مجموعة أخبار محددة.
فتح المقبس باستخدام PHP
استخدم fsockopen() لفتح المقبس. هذه الوظيفة موجودة في كل من PHP3 وPHP4. النموذج الأولي للوظيفة هو كما يلي:
<?php
intfsockopen
(اسم مضيف السلسلة،
منفذ إنت [،
إنت إرنو[،
سلسلة خطأ[،
مهلة مزدوجة]]])
?>
بالنسبة لمضيفي الشبكة، سيتم إنشاء اتصال مقبس TCP بمنفذ اسم المضيف. يمكن أن يكون اسم المضيف اسم مجال أو عنوان IP. بالنسبة لاتصالات UDP، تحتاج إلى تحديد البروتوكول: udp://hostname. بالنسبة لمضيفي يونكس، سيتم استخدام اسم المضيف في المسار إلى المقبس، ويجب ضبط المنفذ على 0 في هذا المثال. يمكن استخدام المهلة الاختيارية لتعيين عدد الثواني لمهلة الاتصال.
يمكن العثور على مزيد من المعلومات حول fsockopen() على http://www.php.net/manual/function.fsockopen.php
بروتوكول نقل أخبار الشبكة (NNTP)
يتطلب الوصول إلى خادم أخبار Usenet استخدام بروتوكول خاص يسمى NNTP، وهو معيار بروتوكول نقل أخبار الشبكة. تفاصيل هذا البروتوكول موجودة في RFC977، والتي يمكنك عرضها على http://www.w3.org/Protocols/rfc977/rfc977.html . يصف هذا المستند بالتفصيل كيفية استخدام أوامر مختلفة للاتصال بخادم NNTP والتحدث معه.
خادم الاتصال يتطلب الاتصال بخادم NNTP معرفة اسم مضيف الخادم (أو عنوان IP) والمنفذ الذي سيتم الاستماع إليه. يوصى أيضًا بإضافة مهلة حتى لا "يتجمد" البرنامج عند فشل الاتصال.
<?php
$cfgServer="your.news.host";
$cfgPort =119;
$cfgTimeOut =10;
// فتح المقبس
إذا(!$cfgTimeOut)
// بدون مهلة
$usenet_handle=fsockopen($cfgServer,$cfgPort);
آخر
// مع انتهاء المهلة
$usenet_handle=fsockopen($cfgServer,$cfgPort, &$errno, &$errstr,$cfgTimeOut);
إذا(!$usenet_handle) {
صدى"فشل الاتصالn";
مخرج()؛
}
آخر {
echo"متصلn";
$tmp=fgets($usenet_handle,1024);
}
?>
التفاعل مع الخادم نحن الآن متصلون بالخادم ويمكننا التفاعل مع الخادم من خلال اتصال المقبس المفتوح مسبقًا. لنفترض للخادم "نريد الحصول على أحدث 10 مقالات من مجموعة أخبار معينة". يحدد RFC977 الأمر الخاص بكيفية تحديد مجموعة الأخبار الصحيحة، كما يلي:
مجموعةجج
المعلمة المطلوبة ggg هي اسم مجموعة الأخبار التي تريد تحديدها، مثل net.news. باستخدام أمر القائمة يمكنك الحصول على قائمة أخبار صالحة. ستعيد استجابة الاختيار الناجحة أرقام الأخبار الخاصة بمقالتي الأخبار الأول والأخير في المجموعة وتقديرًا لأرقام الأخبار المؤرشفة.
على سبيل المثال
كروم:~$ telnetmy.news.host 119
جارٍ المحاولة aa.bb.cc.dd...
متصل tomy.news.host.
حرف الهروب هو '^]'.
200 my.news.hostInterNetNews NNRP server INN 2.2.2 13 ديسمبر 1999 جاهز (النشر موافق).
اختبار بديل للمجموعة
211 232 222996 223235alt.test
يترك
205.
بعد تلقي الأمر "GROUP alt.test"، أعاد خادم الأخبار "211232 222996 223235 alt.test". 211 هو رمز تعريف RFC (شرح بسيط أنه تم تنفيذ الأمر بنجاح - تحقق من RFC للحصول على معلومات أكثر تفصيلاً). تشير المعلومات التي تم إرجاعها إلى وجود 232 مقالة، من بينها رقم فهرس أقدم الأخبار هو 222996، و آخر رقم فهرس الأخبار هو 223235. الآن لنجري العمليات الحسابية: 222996+232 لا يساوي 232235. تمت إزالة المقالة المفقودة من الخادم، أو إلغاؤها بواسطة مؤلفها (نعم، هذا ممكن وسهل القيام به)، أو تم حذفها.
كإجراء وقائي، قد يطلب الخادم المصادقة قبل تحديد مجموعة أخبار، اعتمادًا على ما إذا كان الخادم عامًا أم خاصًا. بشكل عام، يُسمح لأي شخص بالحصول على الأخبار، لكن نشر الأخبار يتطلب شهادة.
<?php
//$cfgUser = "xxxxxx";
//$cfgPasswd = "yyyyyy";
$cfgNewsGroup="alt.php";
// التعريف مطلوب على الخادم الخاص
إذا($cfgUser) {
fputs($usenet_handle,"AUTHINFO USER".$cfgUser."n");
$tmp=fgets($usenet_handle,1024);
fputs($usenet_handle,"AUTHINFOPASS".$cfgPasswd."n");
$tmp=fgets($usenet_handle,1024);
// تحقق من الخطأ
إذا($tmp!="281Okrn") {
صدى "خطأ 502 في المصادقةn";
مخرج()؛
}
}
// حدد مجموعة الأخبار
fputs($usenet_handle,"GROUP ".$cfgNewsGroup."n");
$tmp=fgets($usenet_handle,1024);
if($tmp=="480 المصادقة مطلوبة للأمرrn") {
صدى "$tmpn";
مخرج()؛
}
$info=split(" ",$tmp);
$first=$info[2];
$last=$info[3];
print"First : $firstn";
طباعة"الأخير: $lastn";
?>
احصل على بعض المقالات الآن بعد أن حصلنا على الرقم الفهرس لأحدث المقالات، يمكننا بسهولة الحصول على أحدث عشر مقالات. ينص RFC977 على أنه يمكن استخدام أمر ARTICLE مع رقم فهرس المقالة أو معرف الرسالة. من أجل الحذر، هنا يختلف رقم فهرس المقالة ومعرف الرسالة نظرًا لأن كل خادم أخبار له تعريفات مختلفة، فإن رقم فهرس المقالة نفسها على خوادم الأخبار المختلفة سيكون مختلفًا، ولكن يجب أن يكون معرف الرسالة. فريدة من نوعها (مضمنة في رأس المقال).
<?php
$cfgLimit =10;
// تحميل المقالات الأخيرة
$boucle=$last-$cfgLimit;
بينما ($boucle<=$last) {
set_time_limit(0);
fputs($usenet_handle,"ARTICLE$bouclen");
$article = "";
$tmp=fgets($usenet_handle,4096);
إذا(substr($tmp,0,3) !=220") {
echo"+----------------------+n";
echo"خطأ في المقالة $bouclen";
echo"+----------------------+n";
}
آخر {
بينما($tmp!=".rn") {
$tmp=fgets($usenet_handle,4096);
$article=$article.$tmp;
}
echo"+----------------------+n";
echo"المادة$bouclen";
echo"+----------------------+n";
echo"$articlen";
}
$بوكلي++;
}
?>
نحصل فقط على آخر عشرة أخبار من هذه المجموعة على هذا الخادم. يمكنك أيضًا استخدام الأمر HEAD للحصول على معلومات رأس المقالة، أو الأمر BODY للحصول على نص الأخبار.
أغلق الاتصال واستخدم الدالة fclose() لإنهاء الجلسة مع خادم NNTP بالطبع، يمكنك إنشاء ملف جديد، كما يلي:
<?php
// اتصال وثيق
f Close($usenet_handle);
?>
لمزيد من المعلومات حول fClose()، يرجى الاطلاع على: http://www.php.net/manual/function.f Close.php
الاستنتاج في هذه المقالة، أظهرنا فقط كيفية فتح اتصال مأخذ توصيل واستخدامه وإغلاقه في ظل ظروف معينة: الاتصال بخادم NNTP واسترداد بعض المقالات من مجموعة الأخبار. إن نشر مقالة على خادم NNTP باستخدام الأمر POST ليس أكثر تعقيدًا.
لذا فإن الخطوة التالية هي كتابة عميل أخبار (وحذف بعض برامج Netscape) يمكنه بسهولة حفظ المقالات وفهرستها باستخدام بعض محركات البحث (مثل htgid، http://www.htdig.org/)، ويجب أن يكون هناك تطبيق ويب يمكنه إجراء عمليات بحث عن الكلمات الرئيسية ضمن مجموعات الأخبار. إليك مثال، يمكنك زيارة http://www.phpindex.com/ng/ لتنزيله.