Menampilkan pesan kepada pengguna dalam aplikasi web. Pustaka PHP untuk bekerja dengan Yandex.Money API Pesan buruk php

Saya sudah lama ingin mencoba sesuatu yang baru, jadi ketika di tempat kerja saya diminta untuk menulis contoh penggunaan API Yandex.Money bahasa yang berbeda, saya dengan senang hati menerima tawaran tantangan ini. Karena fungsi seperti ini paling sering digunakan dalam aplikasi di berbagai situs hosting, keputusan berkemauan keras dibuat untuk mencoba menulisnya terlebih dahulu dalam PHP. Terlebih lagi, saya belum pernah melihat API-nya sebelumnya; Selain itu, saya tidak memiliki pengalaman bekerja dengan PHP, kecuali pekerjaan laboratorium di universitas. Kasus ini dijanjikan akan menarik.

Pemilihan lingkungan

Hal pertama yang saya temui adalah mengembangkan dan menerapkan langsung ke hosting sangatlah tidak nyaman. Dan saya memutuskan untuk mengunduh perlengkapan pria untuk pengembang web. Sejak masa kuliah saya, nama Denwer muncul dalam ingatan saya. Saya mencobanya, tetapi segera meninggalkannya. Ia menjalani kehidupannya sendiri, dan ketika saya mencoba mengkonfigurasinya dengan menulis ulang sesuatu di file conf Apache, ia menimpa atau tidak menimpanya atas kebijakannya sendiri, tidak mengizinkan saya untuk mengkonfigurasi semuanya secara manual. Artinya, ternyata bukan saya yang mengaturnya, tapi dia yang mengaturnya untuk saya. Mengingatkan saya pada “jika saya punya kuda, ini adalah nomornya…”. Pada akhirnya, tentu saja, saya mengalahkannya, tetapi pada saat yang sama saya memutuskan untuk mencari server WAMP yang lebih sederhana. Saya ingin mencatat bahwa Denwer adalah produk yang bagus dan saya tidak menentangnya, tetapi saya tidak ingin membaca fakta dan manualnya.

Saya menemukan halaman dengan daftar WAMP di wiki dan mulai memilah-milahnya. Kriteria utama pemilihannya adalah dukungan proyek, versi build yang kurang lebih mutakhir, dan kemudahan instalasi/pengoperasian hasilnya, saya yakin dapat merekomendasikan The Uniform Server. Itu tidak memerlukan instalasi (cukup buka paket arsipnya), saat startup itu hang di baki dan dimulai dengan klik ringan =).

Otentikasi OAuth

Aku membaca instruksinya, mengunduh dokumentasinya, menghunus pedangku dan bergegas ke medan perang. Namun dalam pertempuran tersebut saya dengan cepat dikalahkan oleh otentikasi OAuth. OAuth adalah cara untuk mendapatkan akses ke layanan/akun pengguna apa pun tanpa memasukkan dan menyimpan login dan kata sandinya di aplikasi Anda. Ini datang kepada kami dari pembuat Twitter dan tampilannya seperti ini: kami membuat permintaan ke layanan (dalam kasus kami, ke Yandex.Money), pengguna memasukkan nama pengguna/kata sandinya di server Yandex.Money dan memberikan kami izin aplikasi untuk menggunakan akunnya. Setelah ini, server Yandex.Money dialihkan ke aplikasi kami, dan kami menerima kode sementara yang masa pakainya sangat singkat. Kemudian, melalui permintaan lain ke Yandex.Money, kami mengubah kode sementara ini menjadi token pengguna permanen dan kemudian bagi kami, untuk demobilisasi, semua jalan terbuka.

Namun, saat saya menjalani autentikasi OAuth, saya menemukan masalah keamanan. Saya mencoba menghubungi server Yandex.Money, tetapi PHP mulai mengumpat dan mengatakan sesuatu tentang sertifikat. Saya menjelajahi Internet sedikit dan menyadari bahwa kita memerlukan aplikasi kita untuk memeriksa sertifikat SSL server. Saya ingin melakukan pekerjaan dengan baik untuk menjamin keamanan pengguna, jadi saya melanjutkan pencarian saya. Namun hampir tidak ada contoh penerapan verifikasi sertifikat server di Runet. Aku akan memberitahumu secara berurutan.

Pertama, kami perlu memeriksa sertifikat dalam kode saat mengirim permintaan. Bagaimana cara mendapatkan cURL yang saya gunakan untuk mengirim permintaan yang divalidasi sertifikat? Saya mulai mencari dan terkejut karena saran paling populer untuk kesalahan sertifikat adalah: NONAKTIFKAN verifikasi. Dan ini ditawarkan di banyak situs dan forum (misalnya). Mengerikan, secara umum. Berikut kode yang paling sering disarankan:

Curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, SALAH);

Ingatlah itu, anak-anak, dan jangan pernah menulis. “Sekarang, Nak, ulangi semua kata-kata buruk yang seharusnya kamu lupakan itu.” Alhamdulillah tidak semuanya seburuk itu di Internet berbahasa Inggris dan saya menemukan tautan yang menjelaskan semuanya. Saya melakukan apa yang tertulis di sana dan semuanya berhasil.

Kemudian Anda harus menyimpan sertifikat publik Yandex.Money bersama Anda sehingga Anda memiliki sesuatu untuk dibandingkan saat mengirim permintaan. Tampaknya saya tidak sepenuhnya terbelakang, namun hal itu tampak cukup sulit bagi saya. Mungkin ini akan membantu Anda di masa depan ketika bekerja dengan SSL. Kami pergi ke situs yang diinginkan melalui https, klik pada sertifikat dan ekspor. Tapi ada 3, yang mana yang dibutuhkan? “Ambil pai dari rak; Ada dua, ambil yang di tengah.” Ternyata Anda perlu mengekspor sertifikat dari otoritas sertifikasi (root) dan perantara (Yandex). Sertifikat akhir berubah setahun sekali, dan jika kita memasukkannya ke dalam rantai dan lupa mengubahnya ketika rusak, maka semua yang ada di aplikasi kita akan rusak. Oleh karena itu, kami hanya mengekspor 2 sertifikat yang ditentukan dan menyimpannya menjadi satu berkas teks(tangkapan layar). Di perpustakaan saya dia muncul sebagai ym.crt.

Setelah itu, permintaan mulai bekerja untuk saya. Hore! Apa yang terjadi selanjutnya adalah soal teknik. Semuanya jelas dalam dokumentasi; sebenarnya, itu sebabnya saya menyalinnya ke dalam dokumentasi kode. Saya juga akan membuat reservasi bahwa saya menulisnya sebagai objek; menurut saya, bekerja dengan objek itu bagus dan nyaman.

Enkripsi

Ada juga beberapa kesulitan kecil dengan enkripsi. Pertama, menyimpan/memulihkan token pengguna diimplementasikan menggunakan perpustakaan PHP standar Mcrypt. Namun ternyata, ada masalah di dalamnya. Misalnya, dari contoh yang diambil di manual, hanya satu fungsi yang tidak digunakan lagi yang langsung berfungsi. Fungsi lainnya tidak mempedulikan keinginan saya untuk membuatnya berfungsi, dan hanya mengatakan sesuatu tentang inisialisasi modul yang gagal. Kami harus mencari tahu. Ternyata hoster tidak terlalu menyukai perpustakaan ini. Saya bertanya kepada dukungan hoster saya mengapa tidak ada modul Mcrypt saat membuat situs di PHP 5.3. Mereka menjawab saya (secara harfiah): "Itu bermasalah di 5.2 selama bertahun-tahun - mereka tidak secara otomatis menambahkannya ke 5.3 sebagai modul yang diingat setiap lima tahun sekali, tetapi ada masalah dengannya." Pustaka standar nyaman lainnya dengan implementasi enkripsi simetris Saya tidak menemukannya di PHP (ada perpustakaan OpenSSL, tapi sebenarnya bukan untuk ini). Setelah ini, saya memutuskan untuk mengubah perpustakaan enkripsi menjadi perpustakaan yang terbuka dan mendukung algoritma AES yang populer. Ini berhasil dengan segera dan tanpa masalah.

Fungsionalitas dan contoh penggunaan

Juga, untuk "pelatihan tentang kucing", atau lebih tepatnya pengujian dan debugging, panggilan ke fungsi perpustakaan ditulis, yang kemudian saya sempurnakan dengan tata letak yang enak dipandang, diisi dengan komentar dan disebut contoh penggunaan perpustakaan.

Hasilnya, panggilan ke fungsi API Yandex.Money berikut diterapkan: informasi akun, riwayat transaksi, informasi rinci tentang transaksi, transfer uang ke pengguna lain. Kelebihan dan kemampuan:

  • Otorisasi pengguna OAuth;
  • keamanan operasional (verifikasi rantai sertifikat didukung);
  • kemudahan penggunaan (respons server disajikan dalam bentuk objek) dan mulai cepat;
  • solusi yang relatif aman dan sederhana untuk menyimpan token pengguna menggunakan enkripsi dan tanpa menggunakan database. Anda dapat dengan mudah menulis ulang penerapan solusi ini untuk penyimpanan Anda.
Perpustakaan itu sendiri adalah file rantai sertifikat ym.crt dan mengajukan ym.php yang berisi:
  • antarmuka perangkat lunak IYandexMoney;
  • kelas utama YandexMoney (implementasi antarmuka);
  • kelas pencacahan dengan hak akses (ruang lingkup);
  • kelas tambahan (objek respons untuk mengeluarkan hasil permintaan ke API).
Kit perpustakaan mencakup 2 file yang mengimplementasikan enkripsi: Rijndael.php dan AES.php. File-file ini diambil dari perpustakaan. Mereka diperlukan jika Anda menggunakan metode penyimpanan dan pemulihan token.
Perhatian: kegunaan versi PHP 5, serta perpustakaan cUrl standar untuk permintaan http.

Bagi mereka yang tidak mau menginstal dan melihat contoh detailnya, kami akan menunjukkan beberapa panggilan.
Untuk melakukan operasi akun melalui API, Anda harus mendapatkan izin pengguna, yaitu token. Itu dapat diperoleh melalui panggilan berikut (misalnya, dengan akses untuk melihat informasi tentang akun dan riwayat transaksi):

YandexMoney::authorize(Consts::CLIENT_ID, "riwayat operasi info akun", Consts::REDIRECT_URL); // kemudian, pada halaman pengalihan, mulai pembuatan objek dan menerima token $ym = new YandexMoney(Consts::CLIENT_ID, Consts::CERTIFICATE_CHAIN_PATH); $token = $ym->receiveOAuthToken($_GET["code"], Consts::REDIRECT_URL);
Saat objek $ym dibuat, objek tersebut meneruskan ID aplikasi dan jalur absolut di server ke rantai sertifikat (file ym.crt). Keduanya biasanya ditulis dalam konstanta di beberapa modul (consts.php dalam contoh kita).
Baiklah, kami akan menunjukkan cara mendapatkan informasi tentang akun pengguna. Dengan cara yang sama, kita membuat sebuah objek dan kemudian memanggil metode tersebut, meneruskannya dengan token pengguna:

$ym = YandexMoney baru(Konstan::CLIENT_ID, Konstan::CERTIFICATE_CHAIN_PATH); $accountInfoResponse = $ym->accountInfo($token); gema "Nomor Rekening: " . $accountInfoResponse->getAccount() . "\N"; gema "Saldo: " . $accountInfoResponse->getBalance() . "\N"; echo "Kode mata uang: " . $accountInfoResponse->getCurrency() . "\N";
Informasi akun diterima.

Situasinya hampir sama dengan tantangan lainnya.

Akibatnya, mereka memutuskan untuk menyebut perpustakaan itu dengan nama besar SDK dan memakainya

    Menjadi berkemauan sendiri, berkemauan sendiri, berkemauan sendiri, tidak kompeten. (bahasa sehari-hari). Bertindak sewenang-wenang, berperilaku sewenang-wenang. Kamus penjelasan Ushakov. D.N. Ushakov. 1935 1940 ... Kamus Penjelasan Ushakov

    JADILAH KEINGINAN DIRI, oh, oh; tidak sempurna (bahasa sehari-hari). Bertindak sewenang-wenang. Kamus penjelasan Ozhegov. S.I. Ozhegov, N.Yu. Shvedova. 1949 1992 … Kamus Penjelasan Ozhegov

    Nesov. nepereh. penguraian Lakukan sesuai keinginan Anda, sesuai keinginan Anda. Kamus penjelasan Efraim. T.F.Efremova. 2000... Kamus penjelasan modern bahasa Rusia oleh Efremova

    Berkehendak sendiri, berkemauan sendiri, berkemauan sendiri, berkemauan sendiri, berkemauan sendiri, berkemauan sendiri, berkemauan sendiri, berkemauan sendiri, berkemauan sendiri, berkemauan sendiri, berkemauan sendiri, berkemauan sendiri, berkemauan sendiri, berkemauan sendiri, berkemauan sendiri berkehendak, berkehendak sendiri, berkehendak sendiri, ... ... Bentuk kata

    bertindak tanpa izin- menjadi sombong, ay, ay... Kamus ejaan bahasa Rusia

    bertindak tanpa izin- (Saya), saya bermalas-malasan, saya minum teh, saya minum teh... Kamus ejaan bahasa Rusia

    Ayu, ya; nsv. Razg. Bertindak sesuai keinginan, sesuka hati, tanpa meminta izin kepada siapa pun. S.mengunjungi. S.di tempat kerja. Lakukan urusanmu sendiri di rumah. ◁ Keinginan sendiri, saya; Menikahi Tolong jangan ada keinginan sendiri, kalau tidak saya akan memecat Anda! ... Kamus Ensiklopedis

    bertindak tanpa izin- oh oh; nsv.; penguraian lihat juga kemauan sendiri Bertindak menurut keinginannya sendiri, atas kemauannya sendiri, tanpa meminta izin kepada siapa pun. Samovo / kemalasan di pesta. Samovo/malas bekerja. Kerjakan urusanmu sendiri di rumah... Kamus banyak ekspresi

3.3K

Menampilkan pesan kepada pengguna adalah tindakan umum yang harus dilakukan aplikasi web. Hal ini dapat terjadi saat memproses formulir, dapat berupa pesan kesalahan, pesan yang meminta Anda untuk mendaftar ketika pengguna mencoba mengakses bagian situs yang dibatasi, dan dalam banyak kasus lainnya.

Seringkali, pembuatan dan keluaran pesan dipisahkan menjadi permintaan HTTP yang berbeda. Biasanya, akan lebih mudah untuk menggunakan pengalihan setelah memproses formulir (untuk menghindari masalah dengan tombol Kembali dan Segarkan), tetapi pada saat yang sama, momen alami untuk membuat pesan adalah saat memproses formulir dan melakukan tindakan yang menyertainya. dia. Mengapa? Bayangkan teks pesannya akan terlihat seperti ini: “Jumlah unit yang dipesan untuk item ‘Mouse Pad’ telah berhasil diubah dari 7 menjadi 12.” Setelah pengalihan, mungkin ke halaman yang sama sekali berbeda dalam hal fungsionalitas, akan sangat memusingkan untuk menentukan apa yang telah dilakukan sebelumnya.

Paling sering, pesan ditampilkan dalam permintaan POST yang memproses formulir - ini tidak baik, tulisan "halaman ini kedaluwarsa" merusak kehidupan (ketika pengguna memutuskan untuk mencoba tombol Kembali).

Seseorang menggunakan pengalihan, menyerah pada pesan ramah.

Pada saat yang sama, ada cara sederhana dan jelas untuk membuat hidup lebih baik. Meskipun sudah jelas, untuk beberapa alasan saya tidak pernah melihat orang menggunakannya - setidaknya ketika saya melihat sumber orang lain.

Jadi, kami memiliki masalah - pesan tersebut harus "hidup" dalam permintaan yang berbeda. Kita memerlukan mekanisme untuk mentransfer teks pesan ke halaman yang seharusnya menampilkannya. Anda mungkin sudah ingat tentang sesi tersebut.

Ya, secara umum Anda benar. Metode lain, misalnya melalui variabel global, tidak mengizinkan penyimpanan data jika pengalihan digunakan (catatan oleh Maxim Naumenko). Selain itu, saya biasanya memastikan bahwa setiap layar dalam aplikasi memiliki kemampuan, bersama dengan informasi lainnya, untuk menampilkan pesan yang dibuat pada layar sebelumnya. Ini nyaman karena tidak perlu menyiapkan layar terpisah untuk menampilkan pesan, dan pengguna tidak perlu mengklik mouse lagi. Namun, sebenarnya, perancang perlu berpikir di sini - untuk menyorot area di mana pesan akan muncul.

Idenya sangat sederhana dan dapat diimplementasikan dalam beberapa kelas.

Hal pertama yang terlintas dalam pikiran adalah membuat kelas Message, yang sebenarnya mewakili pesan dalam diagram kelas sederhana kita. Pesan tersebut harus dapat disimpan sendiri dalam sesi tersebut, serta ditampilkan sendiri di layar.

kelas Pesan ( /** * Konten pesan. */ var $konten; /** * Konstruktor untuk menginisialisasi teks pesan. * * @param konten konten pesan */ fungsi Pesan($konten) ( $ini->konten = $ content ; ) /** * Tulis pesan ke sesi. */ function send() ( $_SESSION["session_messages"] = $this->content; ) /** * Keluarkan pesan ke halaman */ function toPage () ( echo. " - " .$this->content .
"; } }

Variabel $_SESSION digunakan untuk mengakses sesi.

Perhatikan bahwa $_SESSION adalah sebuah array, kami hanya menggunakan satu elemen dari array ini dengan indeks 'session_message'.

Dalam hal ini, kita berurusan dengan "array of array" - apa yang kita simpan di elemen 'session_message' adalah sebuah array, ini adalah daftar pesan yang dikirimkan (tentu saja, mungkin ada beberapa di antaranya).

Jika Anda tidak dapat menemukan threadnya, inilah waktunya untuk mempelajari bagian manual yang didedikasikan untuk sesi dan array.

Anda mungkin memiliki pertanyaan. Mengapa kelas dibutuhkan di sini? Dimungkinkan untuk bertahan dengan dua fungsi. Tapi mari kita lihat lebih jauh. Kita mungkin perlu membuat pesan dengan berbagai jenis(info, kesalahan, peringatan), tentukan penerima pesan.

Harap dicatat bahwa di saat ini Bukan objek itu sendiri yang ditempatkan dalam sesi tersebut, tetapi hanya teks pesannya. OOP memungkinkan kita untuk kemudian mengubah perilaku metode send() tanpa mengubah kode klien yang mengakses metode ini (misalnya, di masa depan kita dapat menulis seluruh objek Pesan ke sesi jika memiliki banyak bidang).

Bayangkan kita melakukan ini menggunakan fungsi. Kita mungkin memiliki fungsi message_send($txt), dan kita juga memiliki fungsi message_to_page($txt). Sekarang kita perlu menambahkan kemungkinan perilaku yang berbeda berbagai jenis pesan. Panggilan fungsi berubah: message_send($txt, $kind), message_to_page($txt, $kind). Anda harus menyisir seluruh kode aplikasi untuk mencari fungsi-fungsi tersebut, melakukan koreksi.

Hal ini dapat dihindari dengan mengantisipasi situasi terlebih dahulu dengan merepresentasikan pesan sebagai array asosiatif: $msg['txt'], $msg['kind'], maka hanya akan ada satu parameter dalam pemanggilan fungsi. Dapatkah Anda merasakan bagaimana ini mencoba menjadi sebuah kelas?

Jadi, OOP memberi Anda kesempatan untuk mendapatkan kemewahan tanpa memikirkan segala sesuatunya terlebih dahulu.

Kelas berikutnya - Kotak Masuk - dimaksudkan hanya untuk ini.

class Inbox ( /** * Array pesan yang diterima. */ var $messages = array(); /** * Di konstruktor, kita mendapatkan semua pesan yang diterima * dan menghapusnya dari sesi. */ function Inbox() ( if (is_array($ _SESSION["session_messages"])) ( $messages = $_SESSION["session_messages"]; $co = sizeof($messages); for ($i = 0; $i< $co; $i++) { $this->pesan = Pesan baru($pesan[$i]);
) ) /* menghapus array pesan */ $_SESSION["session_messages"] = array();< $co; $i++) { $this->) /** * Menampilkan isi Kotak Masuk pada halaman.

*/ function toPage() ( $co = sizeof($this->messages); if ($co > 0) ( echo "Pesan dari sistem:

"; ) untuk ($i = 0; $i

pesan[$i]->ToPage();

) ) )

Mari kita coba sistem pesan kami.

Mari kita buat contoh sederhana yang akan merespons pengiriman formulir dengan melaporkan jumlah detik dalam menit saat ini.

mengirim(); /* mengarahkan ke diri sendiri */ header("lokasi:"); ) lain ( $inbox = new Inbox(); $inbox->toPage(); ) ?>

Kami menyembunyikan semua pekerjaan dengan array dan sesi di dalam kelas, dan kode akhir terlihat sederhana dan indah.
Buat direktori di server web Anda, lalu buat tiga file ini di dalamnya dan coba skripnya. Perlu diketahui bahwa tidak ada masalah pada tombol Back dan Refresh. Sekarang bayangkan Anda membuat portal yang kompleks, yang biasanya memiliki beberapa blok pada halaman, dan masing-masing blok dapat berisi aplikasi terpisah. Di sini kita menghadapi dua kesulitan:
* Saya ingin daftar pesan muncul di bagian halaman tertentu, dan Anda telah menemukan tempat yang bagus untuk ini. Masalahnya adalah Anda harus menjalankan perintah $inbox->toPage() tepat pada saat yang sesuai dengan posisi daftar pesan di halaman. Jika kita ingin mengubah posisi daftar ini, kita harus memasukkan kodenya, tetapi tidak baik untuk terus-menerus mengubah bingkai portal untuk ini. Solusi terbaik
Dimungkinkan untuk mengeluarkan pesan dalam bentuk modul terpisah, yang hanya diketahui bahwa modul tersebut perlu dihubungkan ke frame. Artinya, bebaskan diri Anda dari urutan peluncuran modul yang ketat. Memang benar, karena hasil keluaran Kotak Masuk tidak bergantung pada pengoperasian sistem (on langkah ini

Untuk mencoba mengatasi masalah pertama, Anda dapat membuat buffer yang menyimpan hasil keluaran Inbox.

Mungkin kita masih memiliki beberapa hal serupa (dengan Inbox), dan kita perlu membuat sistem buffer. Agar tidak bingung keluaran siapa, kita mungkin akan memberi nama pada buffer. Kami akan menyimpan di suatu tempat urutan yang sesuai dengan output buffer - sebaiknya di file eksternal untuk membuat perubahan lebih mudah.

Upaya solusi ini telah memberi kita ide untuk menggunakan XML sebagai sarana penyimpanan data perantara. Dan menggunakan gaya XSLT akan membantu memecahkan masalah kedua.

Saya tidak akan membahas apa itu XML dan XSLT. Jika Anda belum familiar dengan hal-hal ini, zvon.org adalah tempat yang baik untuk mulai mencari.

Idenya adalah untuk menghasilkan bukan kode HTML, tetapi struktur XML dalam metode toPage(). Dokumen halaman akan dibuat sebagai string dengan kode XML (akan berfungsi sebagai "buffer"), dan pada tahap terakhir skrip kita akan menggunakan transformasi XSL.

Pertama, mari kita bayangkan apa yang seharusnya menjadi hasil dari bagian utama kode tersebut.

menit 57 kedua: 45

Apa yang cukup mudah ditebak - dua pesan dan sebuah formulir. Harap dicatat bahwa skrip PHP hanya perlu menyiapkan string seperti itu - ini sangat sederhana. Selain itu, urutan tag utama tidak penting - Anda dapat meletakkannya di awal, misalnya, karena akan memudahkan pemrogram. Bagaimana cara menerapkannya. Anda dapat, tanpa mengubah apa pun, menggunakan buffering keluaran, mengeluarkan XML alih-alih kode HTML, dan pada akhirnya cukup menangkap keluaran dalam sebuah string. Namun kemudian kita akan kehilangan fleksibilitas - misalnya, terkadang Anda ingin menampilkan informasi debug langsung ke halaman (menggunakan echo). Pada saat yang sama, Pengembang PHP sedang mengerjakan modul DOM yang menawarkan cara yang lebih canggih dalam membuat dan meneruskan dokumen pohon. Jika kita ingin mengimplementasikan DOM, kita harus mendesain ulang seluruh aplikasi, mengubah keluaran string hingga pembuatan elemen DOM. Oleh karena itu, saya lebih suka menyimpan representasi objek XML di dalam objek itu sendiri, secara berurutan menyusun dokumen XML umum. Caranya tidak terlalu sulit, hanya perlu sedikit modifikasi. Anda akan melihat bahwa teknik ini tidak terikat secara ketat pada cara tertentu menyimpan data XML, dan ini akan memungkinkan Anda melakukan transisi menggunakan DOM dengan sedikit biaya. Pertama-tama, perhatikan bahwa setiap objek kita memiliki metode toPage(). Kesamaan ini seharusnya membuat kita berpikir untuk memperkenalkan kelas induk umum yang baru. Biarkan setiap kelas yang dapat membuat potongan dokumen XML untuk suatu halaman mewarisi dari kelas yang akan menangani representasi XML objek tersebut. Sebut saja Outputable.

class Outputable ( /** * XML container (string). */ var $output = ""; /** * Berikan isi container dan kosongkan container. * * @return string dengan data XML */ function getOutput () ( $out = $this->output; $this->output = ""; return $out; ->output .= $string . "n" ) /** * Metode "Abstrak" */ fungsi toPage( ) ( ) )

Metode toPage() dibuat kosong - dalam hal ini diperlukan sebagai indikator bagaimana kelas “matryoshka” eksternal harus berkomunikasi dengan kelas dalam. Namun, kami dapat menawarkan implementasi default di sini jika kami memperhatikan bahwa ada banyak objek yang menampilkan dirinya pada halaman dengan cara yang sama.

Kelas Message dan Inbox akan sedikit berubah - keduanya sekarang harus mewarisi dari Outputable, dan metode toPage() juga akan berubah
Pesan.php

kelas Pesan meluas Outputable ( /** * Konten pesan. */ var $konten; /** * Konstruktor untuk menginisialisasi teks pesan. * * @param konten konten pesan */ fungsi Pesan($konten) ( $ini->konten = $content; ) /** * Tulis pesan ke sesi */ function send() ( $_SESSION["session_messages"] = $this->content; ) /** * Keluarkan pesan ke halaman ( $ ini->tambahkanOutput(" ".$ini->konten.""); } }

class Inbox extends Outputable ( /** * Array pesan yang diterima. */ var $messages = array(); /** * Di konstruktor, kita menerima semua pesan yang diterima * dan menghapusnya dari sesi. */ function Inbox( ) ( if (is_array ($_SESSION["session_messages"])) ( $messages = $_SESSION["session_messages"]; $co = sizeof($messages); for ($i = 0; $i< $co; $i++) { $this->pesan = Pesan baru($pesan[$i]); ) ) /* menghapus array pesan */ $_SESSION["session_messages"] = array();< $co; $i++) { $this->) /** * Menampilkan isi Kotak Masuk pada halaman."); } }

*/ fungsi toPage() ( $co = sizeof($ini->pesan); $ini->appendOutput("

"); untuk ($i = 0; $i
pesan[$i]->toPage();

$ini->appendOutput($ini->pesan[$i]->getOutput()); ) $ini->appendOutput("Metode keluaran telah berubah - sekarang, alih-alih langsung mengeluarkan ke halaman, representasi eksternal untuk sementara waktu disimpan di Outputable, yang “berada” di setiap objek. Metode appendOutput() berfungsi sebagai pengganti konstruksi echo(). Untuk mendapatkan output suatu objek, digunakan metode getOutput(). Sekarang mari kita lihat apa bagian klien dari kode tersebut, yang akan menyelesaikan masalah yang sama seperti sebelumnya. indeks.php


mengirim();   /* detik saat ini */ $msg_sec = new Message("detik: " .date("s"));
"; ?>

$msg_sec->kirim(); /* mengarahkan ke diri sendiri */ header("lokasi:"); KELUAR; ) else ( /* menyiapkan daftar pesan dalam bentuk XML */ $inbox = new Inbox(); $inbox->toPage(); $global_content->appendOutput($inbox->getOutput()); ) $global_content- >tambahkanOutput("

"); $xml_string = $global_content->getOutput(); $xh = xslt_create(); $xarg = array(); /* header dokumen XML */ $xarg["xml"] = "

Untuk melihat hasilnya, tinggal menyiapkan template XSL.
gaya.xsl

Contoh XSLT

pesan

Apa yang telah kita capai?

Pertama-tama, Anda dapat lebih percaya diri mengerjakan proyek yang kompleks - kemandirian modul yang sesungguhnya terjamin. Urutan penempatan hasil pada halaman sekarang dikontrol menggunakan templat XSL eksternal dan tidak bergantung pada urutan pengoperasian modul.

Modul apa pun yang menghasilkan data XML sebagai hasil kerjanya dapat digunakan dalam sebuah proyek. Omong-omong, ini adalah salah satu keunggulan dibandingkan mesin templat, di mana pembuatan data terdiri dari serangkaian metode pemanggilan (penetapan, dll.) dari mesin tertentu, yang tidak memiliki standar umum.

Keuntungan lainnya adalah kemudahan debugging. Jika Anda menjalankan skrip, Anda akan melihat bahwa setiap halaman berisi keluaran debug - prototipe XML yang sangat menyederhanakan proses debug aplikasi.

Hal lain yang perlu Anda pikirkan adalah cara membuat objek pesan. Tidak selalu nyaman untuk menggunakan new secara langsung dalam kode klien. Tapi mungkin ini adalah topik untuk artikel tersendiri.

Terakhir, mari kita bahas prospeknya:

* Jendela pop-up untuk daftar pesan penting
* "halaman pengirim" dan "halaman tujuan" dalam pesan
* mencatat pesan dalam database
* tombol "tampilkan riwayat tindakan saya"
* Analisis statistik tindakan pengguna dalam sesi
* "asisten cerdas" dalam aplikasi web

Halo semuanya!

Dalam edisi sebelumnya, kita telah mempelajari cara memproses sinyal yang diterima dengan benar. Sekarang kita telah mendekati momen ketika iblis kita harus belajar berkomunikasi dengan program lain, atau dengan dirinya sendiri, tetapi dalam salinan yang berbeda.

Di dunia unix, ada banyak sekali cara untuk meneruskan perintah atau pesan dari daemon ke skrip web dan sebaliknya. Namun sekarang saya hanya ingin berbicara tentang antrian pesan - “Antrian Pesan IPC Sistem V”.

Sebagai seorang anak, ibu Anda pasti sudah memberi tahu Anda bahwa antrian dapat ditemukan baik dalam implementasi Sistem V IPC maupun implementasi Posix. Saya hanya ingin menyentuh topik Sistem V, karena topik ini dekat dengan saya pribadi. Dan saya akan mencoba menghindari topik posix jika memungkinkan.

Jadi mari kita mulai. Antrian beroperasi pada tingkat “normal”. sistem operasi, disimpan dalam memori dan mewakili struktur data yang dapat diakses oleh semua orang program sistem. Dalam antrian, sama seperti di sistem file, dimungkinkan untuk mengonfigurasi hak akses dan ukuran pesan. Biasanya pesan dalam antrian diatur ke ukuran kecil, tidak lebih dari 8 kilobyte.

Ini mengakhiri bagian pendahuluan, mari kita lanjutkan ke latihan.

Mengirim pesan

antrian-kirim.php

Kami menerima pesan

antrian-terima.php

Mari kita jalankan filenya satu per satu terlebih dahulu antrian-kirim.php kemudian antrian-terima.php.

U% php queue-send.php mengirim 4 pesan u% php queue-receive.php ketik: 1 ketik: 1, tipe pesan: 1, pesan: s:15:"pesan, ketik 1"; ketik: 1, tipe pesan: 1, pesan: s:15:"pesan, ketik 1"; ketik: 2 ketik: 2, tipe pesan: 2, pesan: s:15:"pesan, ketik 2"; ketik: 3 ketik: 3, tipe pesan: 3, pesan: s:15:"pesan, ketik 3";

Anda dapat melihat bahwa pesan-pesan tersebut dikelompokkan, dan 2 pesan dari jenis pertama ditampilkan terlebih dahulu, lalu semua pesan lainnya.
Jika kami menentukan untuk menerima pesan bertipe 0, kami akan menerima semua pesan apa pun jenisnya.

Sementara (msg_receive($queue, $i, $msgtype, 4096, $message, false, MSG_IPC_NOWAIT)) ( // ...

Juga, di sini perlu diperhatikan satu lagi fitur antrian: jika kita menghapus konstanta MSG_IPC_NOWAIT, menghapus hal-hal yang tidak perlu dari skrip, dan menjalankan file dalam satu terminal antrian-terima.php, dan di sisi lain kami akan menjalankan file tersebut secara berkala antrian-kirim.php, lalu kita akan melihat bagaimana daemon dapat menggunakan antrian secara efektif dengan menunggu tugas darinya.

antrian-terima-tunggu.php

Sebenarnya, saya sudah memberi tahu Anda semua hal paling menarik tentang antrian. Terdapat juga fungsi untuk memperoleh statistik antrian, menghapus dan memeriksa keberadaan antrian.

Sekarang mari kita coba menulis daemon yang mendengarkan antrian:
antrian-daemon.php