ThrottleX: Menskalakan kepada Sejuta Permintaan Sesaat Tanpa Melepaskan Peluh

Patricia Arquette
Lepaskan: 2024-10-22 14:59:03
asal
440 orang telah melayarinya

Tatal ke bawah jika anda mahu mengujinya sendiri!!

Pengenalan:

Mengendalikan berjuta-juta permintaan sesaat? Adakah itu mungkin? ?

Apabila kita bercakap tentang sistem pengedaran berskala tinggi, perkara boleh menjadi… rumit. Anda tahu latih tubi: pengehadan kadar adalah penting untuk mengelakkan penyalahgunaan, tetapi ia sering menjadi halangan. Bagaimana jika saya beritahu anda kami merekayasa sistem yang boleh mengendalikan 1 juta permintaan sesaat tanpa sebarang halangan? Temui ThrottleX, perpustakaan mengehadkan kadar teragih sumber terbuka saya yang ditulis dalam Go.

Dalam siaran ini, saya akan membuka tirai dan menunjukkan kepada anda cara kami mencapai skala yang menakjubkan ini. Saya akan membimbing anda melalui pengoptimuman lanjutan, model serentak Go yang membolehkan semuanya mungkin, dan juga beberapa kesesakan kejutan yang kami temui sepanjang perjalanan. Tetapi ini bukan sekadar teori – saya akan berkongsi penanda aras sebenar yang kami capai. Ikat pinggang kerana kami akan melanggar beberapa had! ?


Bahagian 1: Cabaran – Mengapa Skala Penting

Penghadan kadar penskalaan ialah salah satu perkara yang kelihatan mudah sehingga anda cuba melakukannya pada skala yang melampau. Kebanyakan sistem baik dengan beberapa ratus atau seribu permintaan sesaat. Tetapi apabila anda mencapai berjuta-juta permintaan, keadaan menjadi hancur dengan cepat:

  • Isu pengurusan ingatan ?
  • Rangkaian kesesakan ?
  • Mimpi ngeri Concurrency ?

Caranya bukan sahaja mengehadkan kadar – ia melakukannya dengan cekap merentas berbilang nod, memastikan setiap permintaan dikendalikan dengan sepantas kilat tanpa menggunakan semua sumber yang ada. Di situlah ThrottleX masuk. Dibina untuk kelajuan, direka bentuk untuk skala, ia menggunakan gabungan algoritma pengehad kadar dan pengoptimuman masa nyata untuk kekal mendahului permainan.

Tetapi kenapa perkara ini penting? Mari lihat beberapa senario dunia sebenar:

  • API di bawah beban berat: API anda ialah tulang belakang apl anda dan apabila trafik meningkat (hello, detik viral! ?), anda memerlukan cara untuk mengendalikan kemasukan itu tanpa mengurangkan segala-galanya.
  • Perkhidmatan mikro teragih: Apabila perkhidmatan bergantung pada API luaran, memastikan prestasi yang konsisten merentas berjuta-juta permintaan memastikan keseluruhan sistem stabil.
  • Apl skala awan: Dengan infrastruktur awan, anda perlu mengoptimumkan kos sambil menguruskan beban kerja yang tidak dapat diramalkan – di sinilah pengehadan kadar yang cekap menjimatkan hari (dan bil awan anda ?).

ThrottleX bukan sebarang pengehad kadar – ia direka untuk keadaan melampau dan saya akan menunjukkan kepada anda dengan tepat cara kami mengehadkannya.


Bahagian 2: Memecahkannya – Seni Bina ThrottleX

Di tengah-tengah ThrottleX ialah gabungan algoritma pengehadan kadar pintar dan model serentak yang sangat dioptimumkan. Tetapi ini bukan hanya algoritma - ia adalah cara ia dilaksanakan dan cara kami menjadikannya berskala merentas persekitaran yang diedarkan. Mari kita gali seni bina teras yang menjadikan semuanya terdetik.

1. Algoritma Di Sebalik Keajaiban

Mengenai pengehadan kadar, anda mungkin pernah mendengar tentang klasik:

  • Token Baldi: Membenarkan trafik yang sesak tetapi mengisi semula token pada kadar yang stabil.
  • Tetingkap Gelongsor: Melancarkan trafik dari semasa ke semasa, mengira permintaan dalam selang masa gelongsor.
  • Badi Bocor: Anggap ia seperti baldi berlubang – meminta "bocor" keluar pada kadar yang stabil.

ThrottleX tidak mencipta semula roda, tetapi kami mengambil algoritma yang telah dicuba dan benar ini dan menjadikannya lebih pintar. Begini caranya:

  • Penghadan Kadar Dinamik: Kami melaksanakan sistem yang fleksibel di mana had kadar boleh menyesuaikan diri dalam masa nyata berdasarkan keadaan trafik. Jika trafik tiba-tiba meningkat, ThrottleX boleh mengendalikan beban tanpa pendikitan berlebihan, membolehkan pemprosesan optimum.
  • Pengendalian Concurrency: Pengehadan kadar boleh menjadi sangat rumit apabila mengendalikan permintaan serentak. Kami menggunakan mutex lock untuk memastikan tiada keadaan perlumbaan berlaku, sementara masih membenarkan keselarasan maksimum.

2. Go Concurrency Model – Sos Rahsia

Salah satu sebab ThrottleX terbina dalam Go ialah goroutine dan salurannya, yang memberikan kita keselarasan gila dengan overhed minimum. Inilah sebabnya model konkurensi Go merupakan pengubah permainan untuk kami:

  • Gorotin adalah murah: Tidak seperti benang tradisional, gorouti mempunyai jejak ingatan yang kecil. Ini bermakna kita boleh melahirkan berjuta-juta daripadanya tanpa menghancurkan sumber sistem.
  • Pemprosesan Asynchronous: Dengan memproses permintaan secara tidak segerak, kami mengelak daripada menyekat operasi. Ini adalah kunci untuk memastikan ThrottleX responsif di bawah trafik yang tinggi. Setiap permintaan dikendalikan dalam goroutinenya sendiri, dengan saluran memudahkan komunikasi antara mereka untuk penyelarasan yang lancar.

Dalam istilah orang awam, ia seperti mempunyai barisan pemasangan yang sangat cekap – setiap pekerja (goroutine) melakukan tugas mereka tanpa menunggu orang lain selesai.

3. Pengoptimuman Storan Teragih dengan Redis

Penghad kadar teragih memerlukan keadaan kongsi, di mana Redis berperanan. Tetapi kami tidak boleh hanya memasukkan Redis dan memanggilnya sehari – kami terpaksa mengoptimumkannya:

  • Dasar Tamat Tempoh Utama: Redis menyimpan pasangan nilai kunci untuk setiap pelanggan terhad kadar, tetapi menetapkan masa tamat tempoh yang cekap untuk kunci ini adalah penting. Jika kunci tidak tamat tempoh dengan cukup cepat, anda membazirkan ingatan; terlalu pantas, dan anda kehilangan jejak had kadar. Kami memperhalusi TTL (masa untuk hidup) untuk memastikan kami mencapai titik manis antara kecekapan dan ketepatan memori.
  • Meminimumkan Kependaman Redis: Redis sudah pun pantas, tetapi di bawah beban yang berat, lonjakan kependaman masih boleh berlaku. Kami mengoptimumkan dengan mengubah tetapan pelipisan paip dan replikasi. Ini membolehkan kami menolak lebih banyak permintaan sesaat sambil mengekalkan kependaman pangkalan data di bawah kawalan.

4. Permintaan Berkelompok untuk Keuntungan Prestasi

Helah lain yang kami gunakan untuk meningkatkan ialah permintaan kelompok. Daripada memproses setiap permintaan secara individu, ThrottleX menyusunnya bersama-sama di latar belakang. Ini mengurangkan bilangan operasi yang melanda bahagian belakang Redis, membawa kepada lebih sedikit perjalanan pergi dan balik dan daya pemprosesan yang lebih pantas.

Fikirkan ia seperti menghantar pakej melalui mel. Daripada membuat perjalanan ke pejabat pos untuk setiap surat, anda menunggu sehingga anda mempunyai timbunan dan menghantarnya sekali gus – menjimatkan masa dan tenaga.


Seni bina ini, dibina atas kuasa Go dan konfigurasi Redis yang dioptimumkan, memberikan ThrottleX keupayaan untuk mengendalikan beban trafik yang besar dengan cekap. Dan bahagian yang terbaik? Semuanya direka bentuk untuk berskala dengan tweak yang minimum, jadi sama ada anda mengendalikan beribu-ribu atau berjuta-juta permintaan, ThrottleX telah membantu anda.


Bahagian 3: Rahsia Sejuta Permintaan – Pengoptimuman Utama

Jadi, bagaimanakah kita sebenarnya menolak ThrottleX untuk mengendalikan juta permintaan sesaat tanpa merosakkan sistem atau meletupkan infrastruktur? Ia datang kepada satu siri pengoptimuman yang dibuat dengan teliti, baik dalam algoritma pengehad kadar dan seni bina sistem asas. Inilah sos rahsianya:

1. Permintaan Batching untuk Throughput Tinggi

Salah satu pengubah permainan terbesar ialah permintaan batching. Daripada mengendalikan setiap permintaan secara individu, kami mengumpulkannya ke dalam kelompok. Ini secara besar-besaran mengurangkan bilangan operasi yang melanda bahagian belakang kami (Redis), yang membawa kepada lebih sedikit perjalanan pergi dan balik, kependaman yang lebih rendah dan daya pemprosesan yang lebih pantas.

Dalam erti kata lain, ia seperti memproses seratus permintaan dalam masa yang biasanya diperlukan untuk memproses sepuluh. Pengoptimuman ini sahaja memberikan 50% peningkatan dalam daya pemprosesan dalam penanda aras kami.

2. Pemutus Litar untuk Mengelakkan Beban Lebih

Apabila anda mengendalikan trafik pada skala ini, perkara boleh dan akan menjadi salah. Untuk mengelakkan ThrottleX daripada tertekan semasa trafik lonjakan, kami melaksanakan corak pemutus litar.

Begini cara ia berfungsi:

  • Jika perkhidmatan hiliran (seperti Redis atau perkhidmatan pelanggan) mula ketinggalan atau gagal, pemutus litar terputus, serta-merta menghentikan permintaan kepada perkhidmatan itu.
  • Ini menghalang beban berlebihan, membolehkan sistem pulih dengan anggun tanpa ranap.
  • Setelah isu diselesaikan, pemutus "ditetapkan semula", dan trafik mengalir seperti biasa semula.

Reka bentuk ini membantu mengekalkan ketersediaan tinggi, walaupun di bawah beban yang kuat atau kegagalan sementara dalam sistem. Tanpanya, ThrottleX akan runtuh apabila replikasi Redis ketinggalan atau apabila trafik melonjak secara tidak dijangka.

3. Kecekapan Memori – Mengoptimumkan Goroutine dan Penggabungan

Concurrency ialah pedang bermata dua. Walaupun goroutin Go ringan, ia masih memerlukan pengurusan memori. Semasa kami membuat skala, proses pengumpulan sampah (GC) menjadi halangan – menjejaskan prestasi kami, terutamanya di bawah beban berat.

Penyelesaian kami? Sumber pengumpulan:

  • Kami menggunakan semula gorouti di mana mungkin, mengurangkan jejak memori dan meminimumkan overhed GC.
  • Kami juga melaksanakan kolam memori tersuai untuk struktur data yang kerap digunakan untuk mengelakkan peruntukan memori dan urusan jual beli yang berterusan.

Hasilnya? Pengurangan 30% dalam penggunaan memori dan prestasi yang lebih lancar semasa trafik sesak.

4. Pengoptimuman Saluran Paip Redis

Untuk memastikan Redis dapat bersaing dengan beban permintaan yang besar, kami memperhalusi ciri pelipisan paip. Daripada menghantar setiap perintah kepada Redis satu demi satu (yang memperkenalkan kependaman), kami menggabungkan berbilang perintah bersama menjadi permintaan tunggal. Ini membolehkan Redis memproses kumpulan perintah secara selari, mengurangkan masa tindak balas secara drastik.

Keajaiban saluran paip Redis terletak pada cara ia meminimumkan rangkaian I/O dan meningkatkan daya pemprosesan. Dengan pengoptimuman ini, Redis dapat mengendalikan berjuta-juta permintaan sesaat dengan kependaman sub-milisaat.

5. Pengehadan Kadar Suaian

Kami mengambil pengehadan kadar ke tahap seterusnya dengan menjadikannya adaptif. Daripada menggunakan kadar tetap secara menyeluruh, ThrottleX boleh melaraskan had kadar secara dinamik berdasarkan keadaan trafik masa nyata.

Bayangkan ini: semasa trafik biasa, sistem membenarkan aliran permintaan yang konsisten. Tetapi semasa lonjakan mendadak (katakan, jualan kilat di tapak e-dagang atau detik apl tular), ThrottleX akan melonggarkan buat sementara waktu had, membolehkan lebih banyak trafik melalui tanpa pendikitan terlalu agresif. Setelah lonjakan reda, ia mendail semula kadar secara automatik.

Pendekatan penyesuaian ini memastikan pengguna yang sah tidak terbantut semasa trafik meningkat, sambil tetap melindungi bahagian belakang anda daripada penyalahgunaan.

6. Metrik dan Pemantauan Masa Nyata

Kami mahu melangkaui pengehadan kadar – kami mahu keterlihatan terhadap perkara yang berlaku pada skala. Untuk melakukan ini, kami menyepadukan pemantauan masa nyata dengan alatan seperti Prometheus dan Grafana. Ini membolehkan kami menjejaki metrik utama:

  • Keupayaan permintaan (RPS – Permintaan sesaat)
  • Kadar ralat
  • Latensi Redis
  • Penggunaan Goroutine

Cerapan ini membolehkan kami menangkap kesesakan prestasi lebih awal dan memperhalusi sistem sebelum ia menjadi isu. Dengan papan pemuka yang menunjukkan trafik masa nyata dan kesihatan sistem, kami boleh memantau prestasi ThrottleX walaupun semasa beban puncak.


Pengoptimuman ini, bekerjasama, adalah yang membuka kunci keupayaan untuk mengendalikan 1 juta permintaan sesaat. Setiap tweak, daripada batching dan pipelining kepada pengoptimuman memori dan pengehadan kadar penyesuaian, mendorong ThrottleX lebih jauh ke dalam wilayah hiperskala. ?


Bahagian 4: Penanda Aras Sebenar – Buktikan atau Kalah

Mari menjadi nyata: mudah untuk bercakap tentang pengoptimuman, tetapi buktinya sentiasa dalam angka. Selepas pusingan ujian tekanan, penanda aras dan penalaan halus, berikut ialah metrik sebenar yang kami capai dengan ThrottleX.

Persediaan Penanda Aras

Kami menjalankan ujian menggunakan konfigurasi berikut:

  • Persekitaran: Persediaan sistem teragih dengan 5 nod, setiap satu dijalankan pada CPU 4 teras dengan 16GB RAM.
  • Backend: Redis untuk keadaan dikongsi merentas nod, diperhalusi dengan saluran paip dan tamat tempoh kunci yang dioptimumkan.
  • Beban Trafik: Kami mensimulasikan sehingga 1 juta permintaan sesaat dengan kedua-dua corak trafik biasa dan pecah.
  • Alat: Prometheus untuk pemantauan dan Grafana untuk visualisasi metrik masa nyata.

Sekarang, ke bahagian yang menyeronokkan. Berikut ialah hasilnya:

1. Throughput – 1 Juta Permintaan sesaat

  • Permintaan sesaat (RPS): Kami secara konsisten mengendalikan 1 juta RPS merentas berbilang nod.
  • Trafik Puncak: Semasa senario pecah, ThrottleX mengendalikan lonjakan trafik sehingga 1.2 juta RPS tanpa sebarang penurunan prestasi yang ketara.

ThrottleX mengendalikan beban ini sambil mengekalkan pendaman rendah dan penggunaan sumber yang minimum secara menyeluruh.

2. Latensi – Masa Tindak Balas Sub-Millisaat

Latensi sentiasa menjadi kebimbangan apabila berurusan dengan sistem teragih, terutamanya pada skala ini. Walau bagaimanapun, ThrottleX secara konsisten menyampaikan masa tindak balas sub-milisaat, walaupun di bawah trafik yang melampau.

  • Purata Latensi Redis: 0.7 ms
  • Purata Kependaman Permintaan: 0.8 ms

Terima kasih kepada pengoptimuman seperti saluran paip Redis dan permintaan kelompok, kami meminimumkan perjalanan pergi dan balik ke pangkalan data, mengekalkan kependaman dengan baik di bawah 1 ms.

3. Kecekapan Memori – 30% Lebih Rendah Penggunaan Memori

Dengan mengoptimumkan goroutines dan pengumpulan memori, kami mencapai pengurangan penggunaan memori

30% berbanding dengan pengehad kadar tradisional. Berikut ialah pecahan:
  • Pengumpulan Goroutine
  • : Mengurangkan overhed untuk melahirkan jutaan permintaan serentak.
  • Kolam Memori Tersuai
  • : Mengurangkan dengan ketara bilangan peruntukan semasa trafik pecah, membawa kepada prestasi yang lebih stabil dan kurang kerap kutipan sampah berhenti seketika.

Walaupun dengan berjuta-juta permintaan melalui sistem, ThrottleX kekal cekap memori, mengekalkan penggunaan sumber yang rendah.

4. Kadar Ralat – Kurang Daripada 0.001%

Apa gunanya mengendalikan trafik besar-besaran jika sistem melemparkan ralat ke merata tempat? Nasib baik, ThrottleX

menyampaikan kebolehpercayaan kukuh:
  • Kadar Ralat: Kurang daripada 0.001%
  • permintaan gagal atau dikurangkan tanpa perlu, walaupun dalam keadaan beban puncak.

Kebolehpercayaan ini adalah bukti keberkesanan penghad kadar penyesuaian kami dan corak pemutus litar

, yang membantu mengelakkan beban lampau sistem dan kegagalan berlatarkan.

Penanda aras ini bukan sahaja menarik di atas kertas – ia disokong oleh ujian tekanan dunia sebenar dan menunjukkan bahawa ThrottleX

mampu mengendalikan beban trafik yang melampau tanpa menjejaskan prestasi.

Dan inilah bahagian yang terbaik: anda boleh mencubanya sendiri! ?

Cuba Sendiri

Semua kod dan konfigurasi yang saya gunakan untuk penanda aras ini tersedia dalam repositori ThrottleX. Berhenti, jalankan ujian anda sendiri, dan lihat sama ada anda boleh meneruskannya lebih jauh. Projek ini adalah sumber terbuka, dan saya sentiasa teruja untuk melihat perkara yang boleh dibawa oleh komuniti ke meja. Sama ada menambah baik algoritma atau mengoptimumkan daya pemprosesan yang lebih tinggi, saya mengalu-alukan sumbangan dan idea.

Pautan ke aplikasi contoh ini, kod pemantauan: https://github.com/neelp03/ThrottleX-Test

ThrottleX: Scaling to a Million Requests Per Second Without Breaking a Sweat


Bahagian 5: Pengajaran yang Diperoleh – Perkara yang Mengejutkan Kami

Membina sesuatu yang boleh menangani 1 juta permintaan sesaat merupakan satu perjalanan yang sukar, dan sepanjang perjalanan, kami menghadapi beberapa cabaran yang tidak dijangka yang memberi kami pelajaran berharga. Inilah perkara yang paling mengejutkan kami dan cara kami menangani sekatan jalan raya ini.

1. Go’s Garbage Collection – A Silent Bottleneck

Apabila kami mula meningkatkan skala, kami melihat lonjakan rawak dalam masa tindak balas semasa trafik sesak. Selepas mengkaji isu ini, kami menyedari bahawa kutipan sampah (GC) Go secara senyap menyebabkan gangguan prestasi.

  • Isunya: Dengan berjuta-juta gorout berterbangan, GC dicetuskan terlalu kerap, mengakibatkan jeda yang menjejaskan kependaman.
  • Pembetulan: Kami mengoptimumkan cara memori diperuntukkan dengan melaksanakan kumpulan memori tersuai dan menggunakan semula objek jika boleh. Ini mengurangkan kekerapan kitaran GC dan melancarkan prestasi semasa trafik meningkat.

Pelajaran yang dipelajari: Walaupun pengurusan memori Go adalah cekap, pada skala, anda perlu mengurus memori mikro untuk mengelakkan kesesakan prestasi.

2. Selang Replikasi Redis – Bom Masa Tersembunyi

Walaupun Redis pantas, apabila menangani berjuta-juta permintaan sesaat, kami menghadapi selang replikasi. Di bawah trafik yang padat, keupayaan Redis untuk mereplikasi data merentas nod tidak dapat bersaing dengan beban tulis.

  • Isunya: Selang replikasi Redis menyebabkan kelewatan dalam menyegerakkan data antara nod induk dan replika, yang membawa kepada had kadar yang tidak konsisten merentas sistem teragih.
  • Pembetulan: Kami mengurangkan kekerapan replikasi dan Redis diperhalusi untuk memilih ketersediaan tinggi berbanding konsisten dalam senario tertentu. Ini memberikan kami prestasi yang lebih baik pada kos data basi sekali-sekala, tetapi untuk pengehadan kadar, pertukaran ini boleh diterima.

Pelajaran yang dipelajari: Redis adalah binatang, tetapi pada skala besar, pertukaran antara konsistensi dan ketersediaan menjadi perlu untuk mengekalkan prestasi yang tinggi.

3. Kependaman Rangkaian – Pembunuh Halimunan

Apabila menguji merentasi nod yang diedarkan, kami mendapati bahawa kependaman rangkaian telah ditambah dengan cepat, terutamanya apabila permintaan perlu merentasi wilayah. Pada skala, walaupun beberapa milisaat kelewatan yang didarabkan merentas berjuta-juta permintaan boleh menyebabkan kemerosotan prestasi yang serius.

  • Isunya: Pengehadan kadar teragih melibatkan komunikasi berterusan antara nod dan kembali ke Redis, malah kelewatan rangkaian kecil ditambah.
  • Pembetulan: Kami mengoptimumkan sistem dengan menyetempatkan sebanyak mungkin logik pengehad kadar, meminimumkan bilangan perjalanan ke Redis. Dengan memproses permintaan secara setempat terlebih dahulu dan hanya menyegerakkan keadaan secara berkala, kami mengurangkan kebergantungan keseluruhan pada panggilan rangkaian.

Pelajaran yang dipelajari: Meminimumkan panggilan rangkaian adalah penting untuk sistem yang diedarkan. Semakin kurang anda bergantung pada komunikasi luaran, semakin berdaya tahan dan pantas sistem anda.

4. Pengehadan Kadar Suaian – Mencari Baki

Walaupun penghadan kadar suaian merupakan pengubah permainan, mendapatkan keseimbangan yang betul antara membenarkan lonjakan trafik dan mengekalkan perlindungan adalah lebih rumit daripada yang dijangkakan.

  • Isunya: Pada mulanya, had kadar dilaraskan terlalu agresif, membenarkan terlalu banyak trafik semasa lonjakan, yang membawa kepada lebihan sementara.
  • Pembetulan: Kami mengubahsuai algoritma untuk mengambil kira trend trafik jangka panjang, melicinkan pelarasan kadar dari semasa ke semasa. Ini menghalang perubahan liar dalam lalu lintas dan memberikan sistem lebih ruang bernafas semasa lonjakan trafik yang berterusan.

Pelajaran yang diperoleh: Penyesuaian adalah berkuasa, tetapi ia perlu ditala dengan baik untuk mengelakkan pembetulan yang berlebihan. Terlalu banyak pelarasan boleh berbahaya seperti terlalu sedikit.


Membina dan menskalakan ThrottleX mengajar kami bahawa prestasi pada skala adalah tentang mencari keseimbangan yang betul: mengimbangi penggunaan memori, kependaman rangkaian, replikasi dan had kadar. Setiap pengoptimuman melibatkan pertukaran, tetapi setiap cabaran mendorong kami untuk membina sistem yang lebih berdaya tahan dan lebih pantas.


Kesimpulan – Giliran Anda: Tolak ThrottleX Lebih Jauh

ThrottleX kini merupakan pengehad kadar teragih yang diuji pertempuran yang mampu mengendalikan beban trafik yang melampau. Tetapi sentiasa ada ruang untuk lebih! Sama ada anda ingin menyumbang ciri baharu, mengujinya dalam keadaan berbeza atau mengubahnya untuk prestasi yang lebih baik, repositori ThrottleX dibuka dan menunggu anda.

Mari kita tolak had bersama-sama dan lihat sejauh mana kita boleh melakukannya.

Atas ialah kandungan terperinci ThrottleX: Menskalakan kepada Sejuta Permintaan Sesaat Tanpa Melepaskan Peluh. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!