Pengarang: Armel Fauveau
Alamat asli: http://www.phpbuilder.net/columns/armel20010427.php3
Penerjemah: Xu [email protected]
Http://www.phpobject.net/blog/
PHP dapat membuka soket server jarak jauh atau lokal! Berikut adalah contoh sederhana penggunaan soket: sambungkan ke server berita Usenet, berkomunikasi dengan server, dan unduh beberapa artikel dari grup berita tertentu.
Buka Soket menggunakan PHP
Gunakan fsockopen() untuk membuka Socket. Fungsi ini ada di PHP3 dan PHP4. Prototipe fungsinya adalah sebagai berikut:
<?php
intfsockopen
(string nama host,
ke dalam pelabuhan[,
int salah[,
string errstr[,
batas waktu ganda]]])
?>
Untuk host jaringan, ini akan membuat koneksi TCP Socket ke port nama host. Nama host dapat berupa nama domain atau alamat IP. Untuk koneksi UDP, Anda perlu menentukan protokol: udp://hostname. Untuk host unix, nama host akan digunakan di jalur ke soket, dan port harus disetel ke 0 dalam contoh ini. Batas waktu opsional dapat digunakan untuk mengatur jumlah detik batas waktu koneksi.
Informasi lebih lanjut tentang fsockopen() dapat ditemukan di http://www.php.net/manual/function.fsockopen.php
Protokol Transfer Berita Jaringan (NNTP)
Mengakses server berita usenet memerlukan penggunaan protokol khusus yang disebut NNTP, standar Network News Transfer Protocol. Detail protokol ini ada di RFC977, yang dapat Anda lihat di http://www.w3.org/Protocols/rfc977/rfc977.html . Dokumen ini menjelaskan secara rinci cara menggunakan perintah berbeda untuk menyambung dan berbicara ke server NNTP.
Server Koneksi Menghubungkan ke server NNTP memerlukan mengetahui nama host server (atau alamat IP) dan port yang akan didengarkannya. Anda juga disarankan untuk menambahkan batas waktu agar program tidak "membeku" saat koneksi gagal.
<?php
$cfgServer="host.berita Anda";
$cfgPort =119;
$cfgTimeOut =10;
// buka soket
jika(!$cfgTimeOut)
// tanpa batas waktu
$usenet_handle=fsockopen($cfgServer,$cfgPort);
kalau tidak
// dengan batas waktu
$usenet_handle=fsockopen($cfgServer,$cfgPort, &$errno, &$errstr,$cfgTimeOut);
jika(!$usenet_handle) {
echo"Koneksi gagaln";
KELUAR();
}
kalau tidak {
echo"Tersambungn";
$tmp=fgets($usenet_handle,1024);
}
?>
Berinteraksi dengan Server Sekarang kita sudah terhubung dengan server dan dapat berinteraksi dengan server melalui koneksi socket yang telah dibuka sebelumnya. Katakanlah ke server "Kami ingin mendapatkan 10 artikel terbaru dari grup berita tertentu". RFC977 mendefinisikan perintah cara memilih pengelompokan berita yang benar, sebagai berikut:
KELOMPOKggg
Parameter yang diperlukan ggg adalah nama grup berita yang ingin Anda pilih, seperti net.news. Menggunakan perintah daftar Anda bisa mendapatkan daftar berita yang valid. Respons seleksi yang berhasil akan menghasilkan nomor berita dari dua artikel berita pertama dan terakhir dalam grup serta perkiraan nomor berita yang diarsipkan.
Misalnya
chrome:~$telnetmy.news.host 119
Mencoba aa.bb.cc.dd...
Terhubung tomy.news.host.
Karakter pelariannya adalah '^]'.
200 my.news.hostInterNetNews NNRP server INN 2.2.2 13-Des-1999 siap (posting oke).
KELOMPOK alt.tes
211 232 222996 223235alt.test
berhenti
205.
Setelah menerima perintah "GROUP alt.test", server berita mengembalikan "211232 222996 223235 alt.test". 211 adalah kode identifikasi RFC (penjelasan sederhana bahwa perintah telah berhasil dijalankan - periksa RFC untuk informasi lebih detail). Informasi yang dikembalikan menunjukkan bahwa terdapat 232 artikel, di antaranya nomor indeks berita terlama adalah 222996, dan nomor indeks berita terlama adalah 222996. terbaru Nomor indeks berita adalah 223235. Sekarang mari kita hitung: 222996+232 tidak sama dengan 232235. Artikel yang hilang telah dihapus dari server, dibatalkan oleh penulisnya (ya, itu mungkin dan mudah dilakukan), atau dihapus.
Sebagai tindakan pencegahan, server mungkin memerlukan otentikasi sebelum memilih grup berita, tergantung pada apakah server bersifat publik atau pribadi. Secara umum, siapa pun diperbolehkan memperoleh berita, namun penerbitan berita memerlukan sertifikasi.
<?php
//$cfgPengguna = "xxxxxx";
//$cfgPasswd = "yyyyyy";
$cfgNewsGroup="alt.php";
// identifikasi diperlukan di server pribadi
if($cfgPengguna) {
fputs($usenet_handle,"AUTHINFO USER".$cfgUser."n");
$tmp=fgets($usenet_handle,1024);
fputs($usenet_handle,"AUTHINFOPASS".$cfgPasswd."n");
$tmp=fgets($usenet_handle,1024);
// periksa kesalahan
if($tmp!="281Okern") {
echo "502Kesalahan autentikasin";
KELUAR();
}
}
// pilih grup berita
fputs($usenet_handle,"GROUP ".$cfgNewsGroup."n");
$tmp=fgets($usenet_handle,1024);
if($tmp=="480 Otentikasi diperlukan untuk perintahrn") {
gema "$tmpn";
KELUAR();
}
$info=berpisah(" ",$tmp);
$pertama=$info[2];
$terakhir=$info[3];
print"Pertama : $pertaman";
print"Terakhir : $terakhirn";
?>
Dapatkan beberapa artikel Sekarang kita memiliki nomor indeks A dari artikel terbaru, kita dapat dengan mudah mendapatkan sepuluh artikel terbaru. RFC977 menyatakan bahwa perintah ARTICLE dapat digunakan dengan nomor indeks artikel atau ID pesan. Demi kehati-hatian, di sini nomor indeks artikel dan ID pesan berbeda. Karena setiap server berita memiliki definisi yang berbeda, maka nomor indeks artikel yang sama di server berita yang berbeda akan berbeda, tetapi ID pesan harusnya sama. unik. (Tercantum dalam header artikel)
<?php
$cfgLimit =10;
// unggah artikel terakhir
$boucle=$terakhir-$cfgLimit;
sementara ($boucle<=$last) {
set_time_limit(0);
fputs($usenet_handle,"ARTICLE$bouclen");
$artikel="";
$tmp=fgets($usenet_handle,4096);
if(substr($tmp,0,3) !="220") {
echo"+-------+n";
echo"Kesalahan pada artikel $bouclen";
echo"+-------+n";
}
kalau tidak {
while($tmp!=".rn") {
$tmp=fgets($usenet_handle,4096);
$artikel=$artikel.$tmp;
}
echo"+-------+n";
echo"Artikel$bouclen";
echo"+-------+n";
echo"$artikeln";
}
$boucle++;
}
?>
Kami hanya mendapatkan sepuluh berita terbaru dari grup ini di server ini. Anda juga dapat menggunakan perintah HEAD untuk mendapatkan informasi header artikel, atau perintah BODY untuk mendapatkan isi berita.
Tutup koneksi dan gunakan fungsi fclose() untuk mengakhiri sesi dengan server NNTP. Tentu saja Anda dapat membuat file baru, sebagai berikut:
<?php
// hubungan dekat
fclose($usenet_handle);
?>
Untuk informasi lebih lanjut tentang fclose(), silakan lihat: http://www.php.net/manual/function.fclose.php
Kesimpulan Pada artikel ini, kami hanya menunjukkan cara membuka, menggunakan, dan menutup koneksi soket dalam kondisi tertentu: menyambung ke server NNTP dan mengambil beberapa artikel dari grup berita. Menerbitkan artikel di server NNTP menggunakan perintah POST tidak jauh lebih rumit.
Jadi langkah selanjutnya adalah menulis klien berita (dan menghapus beberapa Netscape) yang dapat dengan mudah menyimpan artikel dan mengindeksnya menggunakan beberapa mesin pencari (seperti htgid, http://www.htdig.org/), dan harus ada aplikasi WEB yang dapat melakukan pencarian kata kunci di bawah grup berita. Berikut contohnya, Anda dapat mengunjungi http://www.phpindex.com/ng/ untuk mendownloadnya.