ผู้เขียน : อาร์เมล โฟโว
ที่อยู่เดิม: http://www.phpbuilder.net/columns/armel20010427.php3
ผู้แปล: Xu [email protected]
http://www.phpobject.net/blog/
PHP สามารถเปิดซ็อกเก็ตของเซิร์ฟเวอร์ระยะไกลหรือท้องถิ่นได้! นี่คือตัวอย่างง่ายๆ โดยใช้ซ็อกเก็ต: เชื่อมต่อกับเซิร์ฟเวอร์ข่าว Usenet สื่อสารกับเซิร์ฟเวอร์ และดาวน์โหลดบทความบางส่วนจากกลุ่มข่าวที่ชัดเจน
เปิดซ็อกเก็ตโดยใช้ PHP
ใช้ fsockopen() เพื่อเปิด Socket ฟังก์ชั่นนี้มีอยู่ในทั้ง PHP3 และ PHP4 ต้นแบบของฟังก์ชันมีดังนี้:
<?php
intfsockopen.php
(ชื่อโฮสต์สตริง
พอร์ต int [,
int ผิดพลาด [,
สตริงผิดพลาด [,
หมดเวลาสองครั้ง]]])
-
สำหรับโฮสต์เครือข่าย มันจะสร้างการเชื่อมต่อ TCP Socket กับพอร์ตของชื่อโฮสต์ ชื่อโฮสต์อาจเป็นชื่อโดเมนหรือที่อยู่ IP สำหรับการเชื่อมต่อ UDP คุณต้องระบุโปรโตคอล: udp://hostname สำหรับโฮสต์ยูนิกซ์ ชื่อโฮสต์จะถูกใช้ในเส้นทางไปยังซ็อกเก็ต และพอร์ตจะต้องตั้งค่าเป็น 0 ในตัวอย่างนี้ การหมดเวลาทางเลือกสามารถใช้เพื่อกำหนดจำนวนวินาทีสำหรับการหมดเวลาการเชื่อมต่อ
ข้อมูลเพิ่มเติมเกี่ยวกับ fsockopen() สามารถพบได้ ที่http://www.php.net/manual/function.fsockopen.php
โปรโตคอลการโอนข่าวเครือข่าย (NNTP)
การเข้าถึงเซิร์ฟเวอร์ข่าว usenet ต้องใช้โปรโตคอลพิเศษที่เรียกว่า NNTP ซึ่งเป็นมาตรฐาน Network News Transfer Protocol รายละเอียดของโปรโตคอลนี้อยู่ใน RFC977 ซึ่งคุณสามารถดูได้ที่ http://www.w3.org/Protocols/rfc977/rfc977.html เอกสารนี้อธิบายรายละเอียดวิธีใช้คำสั่งต่างๆ เพื่อเชื่อมต่อและพูดคุยกับเซิร์ฟเวอร์ NNTP
เซิร์ฟเวอร์การเชื่อมต่อ การเชื่อมต่อกับเซิร์ฟเวอร์ NNTP จำเป็นต้องทราบชื่อโฮสต์ของเซิร์ฟเวอร์ (หรือที่อยู่ IP) และพอร์ตที่จะรับฟัง ขอแนะนำให้คุณเพิ่มการหมดเวลาเพื่อให้โปรแกรมไม่ "ค้าง" เมื่อการเชื่อมต่อล้มเหลว
<?php
$cfgServer="your.news.host";
$cfgพอร์ต =119;
$cfgTimeOut =10;
// เปิดซ็อกเก็ต
ถ้า(!$cfgTimeOut)
// โดยไม่หมดเวลา
$usenet_handle=fsockopen($cfgServer,$cfgPort);
อื่น
// ด้วยการหมดเวลา
$usenet_handle=fsockopen($cfgServer,$cfgPort, &$errno, &$errstr,$cfgTimeOut);
ถ้า(!$usenet_handle) {
echo"การเชื่อมต่อล้มเหลวn";
ออก();
-
อื่น {
echo"เชื่อมต่อแล้วn";
$tmp=fgets($usenet_handle,1024);
-
-
การโต้ตอบกับเซิร์ฟเวอร์ ตอนนี้เราเชื่อมต่อกับเซิร์ฟเวอร์แล้วและสามารถโต้ตอบกับเซิร์ฟเวอร์ผ่านการเชื่อมต่อซ็อกเก็ตที่เปิดไว้ก่อนหน้านี้ สมมติว่าเซิร์ฟเวอร์ "เราต้องการรับ 10 บทความล่าสุดจากกลุ่มข่าวบางกลุ่ม" RFC977 กำหนดคำสั่งในการเลือกกลุ่มข่าวสารที่ถูกต้องดังนี้
GROUPggg
พารามิเตอร์ ggg ที่จำเป็นคือชื่อของกลุ่มข่าวสารที่คุณต้องการเลือก เช่น net.news การใช้คำสั่ง list คุณจะได้รับรายการข่าวที่ถูกต้อง การตอบกลับที่เลือกสำเร็จจะส่งคืนหมายเลขข่าวของบทความข่าวสองบทความแรกและสองบทความสุดท้ายในกลุ่ม และการประมาณการหมายเลขข่าวที่เก็บถาวร
ตัวอย่างเช่น
โครม:~$ telnetmy.news.host 119
กำลังลอง aa.bb.cc.dd...
เชื่อมต่อ tomy.news.host
อักขระหลีกคือ '^]'
200 my.news.hostInterNetNews เซิร์ฟเวอร์ NNRP INN 2.2.2 13-ธ.ค.-1999 พร้อมแล้ว (โพสต์ตกลง)
กลุ่ม alt.test
211 232 222996 223235alt.ทดสอบ
ล้มเลิก
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") {
echo "ข้อผิดพลาดในการรับรองความถูกต้อง 502n";
ออก();
-
-
// เลือกกลุ่มข่าวสาร
fputs($usenet_handle,"กลุ่ม ".$cfgNewsGroup."n");
$tmp=fgets($usenet_handle,1024);
if($tmp=="480 จำเป็นต้องมีการรับรองความถูกต้องสำหรับคำสั่งrn") {
เสียงก้อง "$tmpn";
ออก();
-
$info=split(" ",$tmp);
$แรก=$ข้อมูล[2];
$last=$info[3];
print"First : $firstn";
พิมพ์ "สุดท้าย : $lastn";
-
รับบทความบางส่วน ตอนนี้เมื่อเรามีหมายเลขดัชนี A ของบทความล่าสุด เราก็สามารถรับบทความสิบล่าสุดได้อย่างง่ายดาย RFC977 ระบุว่าคำสั่ง ARTICLE สามารถใช้กับหมายเลขดัชนีบทความหรือ ID ข้อความได้ เพื่อความปลอดภัย หมายเลขดัชนีของบทความและรหัสข้อความจะแตกต่างกัน เนื่องจากแต่ละเซิร์ฟเวอร์ข่าวมีคำจำกัดความที่แตกต่างกัน หมายเลขดัชนีของบทความเดียวกันบนเซิร์ฟเวอร์ข่าวที่แตกต่างกันจะแตกต่างกัน แต่รหัสข้อความควรเป็น ไม่ซ้ำกัน (รวมอยู่ในส่วนหัวของบทความ)
<?php
$cfgจำกัด =10;
// อัพโหลดบทความล่าสุด
$boucle=$last-$cfgLimit;
ในขณะที่ ($boucle<=$last) {
set_time_limit (0);
fputs($usenet_handle,"ARTICLE$bouclen");
$บทความ="";
$tmp=fgets($usenet_handle,4096);
ถ้า(substr($tmp,0,3) !="220") {
เสียงก้อง"+-----------------------+n";
echo"เกิดข้อผิดพลาดในบทความ $bouclen";
เสียงก้อง"+-----------------------+n";
-
อื่น {
ในขณะที่($tmp!=".rn") {
$tmp=fgets($usenet_handle,4096);
$article=$article.$tmp;
-
เสียงก้อง"+-----------------------+n";
echo"บทความ$bouclen";
เสียงก้อง"+-----------------------+n";
echo"$บทความn";
-
$บูเกิ้ล++;
-
-
เราได้รับข่าวสารล่าสุดเพียงสิบรายการจากกลุ่มนี้บนเซิร์ฟเวอร์นี้ คุณยังสามารถใช้คำสั่ง HEAD เพื่อรับข้อมูลส่วนหัวของบทความ หรือใช้คำสั่ง BODY เพื่อรับเนื้อหาของข่าว
ปิดการเชื่อมต่อและใช้ฟังก์ชัน fclose() เพื่อสิ้นสุดเซสชันด้วยเซิร์ฟเวอร์ NNTP แน่นอนว่าคุณสามารถสร้างไฟล์ใหม่ได้ดังต่อไปนี้:
<?php
//ปิดการเชื่อมต่อ
fclose($usenet_handle);
-
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ fclose() โปรดดู: http://www.php.net/manual/function.fclose.php
ในบทความนี้ เราแสดงเฉพาะวิธีการเปิด ใช้ และปิดการเชื่อมต่อซ็อกเก็ตภายใต้สถานการณ์บางอย่างเท่านั้น: เชื่อมต่อกับเซิร์ฟเวอร์ NNTP และดึงบทความบางส่วนจากกลุ่มข่าวสาร การเผยแพร่บทความบนเซิร์ฟเวอร์ NNTP โดยใช้คำสั่ง POST นั้นไม่ซับซ้อนมากนัก
ขั้นตอนต่อไปคือการเขียนโปรแกรมรับข่าวสาร (และตัด Netscape บางส่วนออก) ซึ่งสามารถบันทึกบทความและจัดทำดัชนีได้อย่างง่ายดายโดยใช้เครื่องมือค้นหาบางอย่าง (เช่น htgid, http://www.htdig.org/) และจะต้องมี แอปพลิเคชันเว็บที่สามารถทำการค้นหาคำสำคัญในกลุ่มข่าวสาร นี่คือตัวอย่าง คุณสามารถไปที่ http://www.phpindex.com/ng/ เพื่อดาวน์โหลด