cari
RumahPeranti teknologiindustri ITAplikasi Web Python: Asas WSGI

Aplikasi Web Python: Asas WSGI

Takeaways Key

    WSGI, atau antara muka Gateway Web Server, menyokong semua rangka kerja Web Python, menyediakan spesifikasi umum untuk pelayan web yang membolehkan interaksi antara pelayan web dan kerangka aplikasi yang berbeza.
  • Aplikasi WSGI adalah python callable yang mesti menerima dua argumen, persekitaran (python dict yang mengandungi data permintaan) dan start_fn (yang boleh dipanggil). Permohonan mesti memanggil start_fn dengan dua argumen: kod status dan senarai tajuk, dan mengembalikannya yang mengandungi bait dalam badan tindak balas.
  • Middleware boleh digunakan untuk memperluaskan fungsi aplikasi WSGI, dengan middleware dan pengendali yang tidak perlu mengetahui atau peduli antara satu sama lain. Ini memudahkan untuk menambah fungsi seperti penebangan atau pengendalian ralat.
  • Aplikasi WSGI boleh dihidangkan dalam pelbagai cara, dengan Gunicorn dan UWSGI menjadi dua pilihan popular. Adalah disyorkan untuk menubuhkan sesuatu seperti Nginx di hadapannya untuk berkhidmat dengan aset statik.
Aplikasi Web Python: Asas WSGI di bawah Django, Flask, Botol, dan setiap Rangka Web Python yang lain, terletak antara muka Gateway Web Server, atau WSGI untuk jangka pendek. WSGI adalah untuk python apa servlets untuk Java - spesifikasi umum untuk pelayan web yang membolehkan pelayan web dan rangka kerja yang berbeza untuk berinteraksi berdasarkan API biasa. Walau bagaimanapun, seperti kebanyakan perkara, versi Python jauh lebih mudah. ​​

WSGI ditakrifkan dalam PEP 3333, yang saya menggalakkan anda membaca sebagai rujukan jika anda mahukan maklumat lanjut selepas intro cepat ini.

Artikel ini akan memperkenalkan anda kepada spesifikasi WSGI dari perspektif pemaju aplikasi, dan menunjukkan kepada anda bagaimana untuk bekerja secara langsung dengan WSGI untuk membuat aplikasi (jika anda inginkan).

aplikasi WSGI pertama anda

Berikut adalah aplikasi web Python yang paling asas:

<span>def app(environ, start_fn):
</span>    start_fn<span>('200 OK', [('Content-Type', 'text/plain')])
</span>    <span>return ["Hello World!\n"]
</span>
Itu sahaja! Keseluruhan fail. Panggilnya App.py dan jalankan dengan mana-mana pelayan WSGI yang serasi dan anda akan mendapat respons Hello World dengan status 200. Anda boleh menggunakan Gunicorn untuk ini; Cukup pasang melalui PIP (Pip Pasang Gunicorn) dan jalankan dengan aplikasi Gunicorn: App. Perintah ini memberitahu Gunicorn untuk mendapatkan WSGI boleh dipanggil dari pembolehubah aplikasi dalam modul aplikasi.

Sekarang, anda harus sangat teruja. Hanya 3 baris untuk aplikasi yang sedang berjalan? Itu mestilah semacam rekod (sekatan PHP, kerana mod_php adalah penipuan). Saya yakin anda hanya perlu mengetahui lebih lanjut.

Jadi apakah bahagian -bahagian penting aplikasi WSGI?

  • Aplikasi WSGI adalah python callable , seperti fungsi, kelas, atau contoh kelas dengan kaedah __call__
  • Aplikasi yang boleh dipanggil mesti menerima dua argumen: persekitaran, yang merupakan python dict yang mengandungi data permintaan, dan start_fn, sendiri yang boleh dipanggil.
  • Permohonan mesti memanggil start_fn dengan dua argumen: kod status (sebagai rentetan), dan senarai tajuk yang dinyatakan sebagai 2-tuple.
  • Aplikasi ini mengembalikan satu bait yang mengandungi bait dalam badan tindak balas dalam ketulan yang berguna dan boleh ditembusi - dalam kes ini, senarai rentetan yang mengandungi hanya "Hello, World!". (Jika aplikasi adalah kelas, ini dapat dicapai dalam kaedah __iter__.)

Contohnya, dua contoh berikutnya bersamaan dengan yang pertama:

<span>def app(environ, start_fn):
</span>    start_fn<span>('200 OK', [('Content-Type', 'text/plain')])
</span>    <span>return ["Hello World!\n"]
</span>
<span>class app(object):
</span>
    <span>def __init__(self, environ, start_fn):
</span>        self<span>.environ = environ
</span>        self<span>.start_fn = start_fn
</span>
    <span>def __iter__(self):
</span>        self<span>.start_fn('200 OK', [('Content-Type', 'text/plain')])
</span>        <span>yield "Hello World!\n"
</span>

Anda mungkin sudah memikirkan cara anda boleh menggunakan maklumat ini, tetapi mungkin yang paling relevan adalah menulis middlewares.

jazzing It Up

middlewares adalah cara mudah untuk memperluaskan fungsi aplikasi WSGI. Oleh kerana anda hanya perlu memberikan yang boleh dipanggil, anda boleh membungkusnya dalam fungsi lain namun anda suka.

Sebagai contoh, katakan kita mahu memeriksa kandungan persekitaran. Kita boleh membuat middleware dengan mudah untuk melakukannya, seperti dalam contoh ini:

<span>class Application(object):
</span>    <span>def __call__(self, environ, start_fn):
</span>        start_fn<span>('200 OK', [('Content-Type', 'text/plain')])
</span>        <span>yield "Hello World!\n"
</span>
app <span>= Application()
</span>

di sini, log_environ adalah fungsi yang mengembalikan fungsi, yang cukup mencetak hujah persekitaran sebelum menangguhkan panggilan balik asal.

Kelebihan menulis middlewares dengan cara ini adalah bahawa middleware dan pengendali tidak perlu tahu atau peduli tentang satu sama lain. Anda boleh dengan mudah bolt log_environ ke aplikasi flask, sebagai contoh, kerana aplikasi flask adalah aplikasi wsgi.

Beberapa idea middleware berguna yang lain:

<span>import pprint
</span>

<span>def handler(environ, start_fn):
</span>    start_fn<span>('200 OK', [('Content-Type', 'text/plain')])
</span>    <span>return ["Hello World!\n"]
</span>

<span>def log_environ(handler):
</span>    <span>def _inner(environ, start_fn):
</span>        pprint<span>.pprint(environ)
</span>        <span>return handler(environ, start_fn)
</span>    <span>return _inner
</span>

app <span>= log_environ(handler)
</span>

Anda boleh menggunakan mengurangkan untuk memohon sekumpulan middleware sekaligus jika anda tidak mahu membuat piramid besar di bahagian bawah fail anda:

<span>import pprint
</span>

<span>def handle_error(handler):
</span>    <span>def _inner(environ, start_fn):
</span>        <span>try:
</span>            <span>return handler(environ, start_fn)
</span>        <span>except Exception as e:
</span>            <span>print e  # Log error
</span>            start_fn<span>('500 Server Error', [('Content-Type', 'text/plain')])
</span>            <span>return ['500 Server Error']
</span>    <span>return _inner
</span>

<span>def wrap_query_params(handler):
</span>    <span>def _inner(environ, start_fn):
</span>        qs <span>= environ.get('QUERY_STRING')
</span>        environ<span>['QUERY_PARAMS'] = urlparse.parse_qs(qs)
</span>        <span>return handler(environ, start_fn)
</span>    <span>return _inner
</span>

Anda juga boleh menulis middleware yang mengubah respons, dengan memanfaatkan argumen Start_FN. Berikut adalah middleware yang membalikkan output jika pengepala jenis kandungan adalah teks/biasa:

<span># Applied from bottom to top on the way in, then top to bottom on the way out
</span>MIDDLEWARES <span>= [wrap_query_params,
</span>               log_environ<span>,
</span>               handle_error<span>]
</span>
app <span>= reduce(lambda h, m: m(h), MIDDLEWARES, handler)
</span>

Ini sedikit lebih kusut terima kasih kepada pemisahan start_fn dan respons, tetapi masih boleh dilaksanakan dengan sempurna.

Juga ambil perhatian bahawa, untuk mematuhi spesifik dengan WSGI, kita mesti menyemak kaedah pada respons dan memanggilnya jika ada. Aplikasi WSGI Legacy juga boleh mengembalikan fungsi tulis dan bukannya sebagai pengendali panggilan; Jika anda mahu middleware anda menyokong aplikasi yang lebih lama, anda mungkin perlu mengendalikan kes ini.

Sebaik sahaja anda mula bermain dengan WSGI mentah sedikit, anda mula memahami mengapa Python mempunyai puluhan kerangka web secara harfiah. WSGI menjadikannya cukup mudah untuk membina sesuatu bermula dari awal. Sebagai contoh, anda mungkin mempertimbangkan masalah penghalaan:

<span>def reverser(handler):
</span>
    <span># A reverse function
</span>    rev <span>= lambda it: it[::-1]
</span>
    <span>def _inner(environ, start_fn):
</span>        do_reverse <span>= []  # Must be a reference type such as a list
</span>
        <span># Override start_fn to check the content type and set a flag
</span>        <span>def start_reverser(status, headers):
</span>            <span>for name, value in headers:
</span>                <span>if (name.lower() == 'content-type'
</span>                        <span>and value.lower() == 'text/plain'):
</span>                    do_reverse<span>.append(True)
</span>                    <span>break
</span>
            <span># Remember to call `start_fn`
</span>            start_fn<span>(status, headers)
</span>
        response <span>= handler(environ, start_reverser)
</span>
        <span>try:
</span>            <span>if do_reverse:
</span>                <span>return list(rev(map(rev, response)))
</span>
            <span>return response
</span>        <span>finally:
</span>            <span>if hasattr(response, 'close'):
</span>                response<span>.close()
</span>    <span>return _inner
</span>

bekerja dengan WSGI secara langsung boleh menjadi baik jika anda menikmati fleksibiliti pemasangan perpustakaan di atas

  • perpustakaan templat: Hanya lepaskan mana -mana perpustakaan templat yang anda suka (mis. Jinja2, pystashe) dan kembalikan templat yang diberikan dari pengendali anda!
  • membantu penghalaan anda dengan perpustakaan seperti laluan atau mungkin penghalaan Werkzeug. Sebenarnya, lihatlah Werkzeug jika anda ingin menggunakan abstraksi yang sentiasa ada di atas WSGI.
  • Gunakan mana -mana perpustakaan pangkalan data/penghijrahan seperti yang anda lakukan dengan Flask atau serupa.

Sudah tentu, untuk aplikasi yang tidak khusus, anda mungkin masih mahu menggunakan rangka kerja supaya kes-kes kelebihan dikendalikan dengan betul dan tidak.

tetapi bagaimana dengan pelayan?

Terdapat banyak cara untuk melayani aplikasi WSGI. Kami sudah bercakap tentang Gunicorn, yang merupakan pilihan yang baik. UWSGI adalah satu lagi pilihan hebat. Pastikan anda menyediakan sesuatu seperti nginx di hadapan ini untuk melayani aset statik dan anda harus mempunyai titik permulaan yang kukuh.

dan itu semua ada!

Soalan Lazim (Soalan Lazim) Mengenai Aplikasi Web Python dan WSGI

Apakah peranan WSGI dalam Aplikasi Web Python? Ia memainkan peranan penting dalam aplikasi web python kerana ia membolehkan aplikasi dan pelayan web berkomunikasi dan menghantar permintaan kepada satu sama lain. WSGI bertindak sebagai jambatan, membolehkan pelayan web untuk menghantar permintaan dari klien (seperti pelayar web) ke aplikasi web. Permohonan itu kemudian memproses permintaan dan menghantar respons kepada pelanggan melalui pelayan web. Pelayan web untuk berkomunikasi dengan aplikasi web. Apabila pelanggan menghantar permintaan ke pelayan web, pelayan menggunakan antara muka WSGI untuk lulus permintaan tersebut ke aplikasi web. Permohonan memproses permintaan dan mengembalikan respons, yang mana pelayan kemudian menghantar kembali kepada klien. Proses ini membolehkan cara yang konsisten dan boleh dipercayai untuk pelayan web dan aplikasi untuk berinteraksi, tanpa mengira pelaksanaan khusus mereka. Tersedia untuk Python, masing -masing dengan kekuatan dan kelemahannya sendiri. Sebahagian daripada yang paling biasa digunakan termasuk Gunicorn, UWSGI, dan Mod_WSGI. Gunicorn terkenal dengan kesederhanaan dan kemudahan penggunaannya, sementara UWSGI dipuji untuk kelajuan dan kecekapannya. Mod_WSGI, sebaliknya, adalah modul untuk pelayan Apache dan sering digunakan dalam persekitaran perusahaan.

Bagaimana saya menggunakan aplikasi web python menggunakan wsgi?

Menggunakan aplikasi web python menggunakan WSGI melibatkan beberapa langkah. Pertama, anda perlu memasang pelayan WSGI, seperti Gunicorn atau UWSGI. Seterusnya, anda perlu mengkonfigurasi pelayan web anda untuk menggunakan pelayan WSGI sebagai proksi untuk permintaan pengendalian ke aplikasi anda. Ini melibatkan mengubah fail konfigurasi pelayan anda untuk memasukkan tetapan WSGI yang diperlukan. Akhirnya, anda perlu memulakan pelayan WSGI anda dan menunjuknya ke fail WSGI aplikasi anda.

Bolehkah saya menggunakan WSGI dengan django? Malah, Django dilengkapi dengan aplikasi WSGI terbina dalam yang boleh anda gunakan untuk menggunakan projek Django anda. Aplikasi Django WSGI bertindak sebagai jambatan antara projek Django anda dan pelayan web, membolehkan mereka berkomunikasi dan bertukar permintaan dan respons. ASGI adalah kedua -dua antara muka untuk aplikasi web python, tetapi mereka melayani tujuan yang berbeza. WSGI adalah antara muka segerak yang membolehkan komunikasi antara pelayan web dan aplikasi web. ASGI, atau antara muka Gateway Server Asynchronous, adalah lanjutan WSGI yang menyokong operasi asynchronous. Ini bermakna dengan ASGI, aplikasi anda boleh mengendalikan pelbagai permintaan pada masa yang sama tanpa menyekat, menjadikannya lebih cekap untuk aplikasi masa nyata. > Mewujudkan aplikasi WSGI di Python melibatkan menentukan fungsi yang menerima dua argumen: kamus persekitaran dan start_response callable. Kamus Alam Sekitar mengandungi maklumat mengenai permintaan yang masuk, manakala Callable Start_Response digunakan untuk memulakan respons terhadap permintaan tersebut. Fungsi anda harus mengembalikannya yang menghasilkan badan respons. Pertama, ia menyediakan antara muka standard untuk pelayan web dan aplikasi, menjadikannya lebih mudah untuk membangun dan menggunakan aplikasi web Python. Kedua, ia membolehkan fleksibiliti yang lebih besar, kerana anda boleh memilih dari pelbagai pelayan dan aplikasi yang serasi WSGI. Akhirnya, ia menggalakkan kebolehgunaan semula kod, kerana anda boleh menggunakan aplikasi WSGI yang sama dengan pelayan dan middleware yang berbeza.

Bolehkah saya menggunakan WSGI dengan Flask? Malah, aplikasi Flask adalah aplikasi WSGI secara lalai. Apabila anda membuat aplikasi flask, anda sebenarnya membuat aplikasi WSGI bahawa kerangka flask akan digunakan untuk mengendalikan permintaan masuk dan menghantar respons.

Apakah middleware WSGI?

Middleware WSGI adalah komponen yang terletak di antara pelayan WSGI dan aplikasi WSGI. Ia boleh memproses permintaan sebelum mereka mencapai permohonan dan respons sebelum dihantar kembali kepada pelanggan. Middleware boleh digunakan untuk melaksanakan pelbagai fungsi, seperti pengurusan sesi, penghalaan URL, dan pengesahan.

Atas ialah kandungan terperinci Aplikasi Web Python: Asas WSGI. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan
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
Membina pengimbas kelemahan rangkaian dengan pergiMembina pengimbas kelemahan rangkaian dengan pergiApr 01, 2025 am 08:27 AM

Pengimbas kelemahan rangkaian berasaskan GO ini dengan cekap mengenal pasti kelemahan keselamatan yang berpotensi. Ia memanfaatkan ciri konkurensi Go untuk kelajuan dan termasuk pengesanan perkhidmatan dan pemadanan kelemahan. Mari kita meneroka keupayaan dan etika

Top 10 alat pemeriksa backlink terbaik terbaik pada tahun 2025Top 10 alat pemeriksa backlink terbaik terbaik pada tahun 2025Mar 21, 2025 am 08:28 AM

Pembinaan laman web hanyalah langkah pertama: kepentingan SEO dan backlinks Membina laman web hanyalah langkah pertama untuk mengubahnya menjadi aset pemasaran yang berharga. Anda perlu melakukan pengoptimuman SEO untuk meningkatkan keterlihatan laman web anda di enjin carian dan menarik pelanggan yang berpotensi. Backlinks adalah kunci untuk meningkatkan kedudukan laman web anda, dan ia menunjukkan Google dan enjin carian lain kuasa dan kredibiliti laman web anda. Tidak semua pautan balik bermanfaat: mengenal pasti dan mengelakkan pautan yang berbahaya Tidak semua pautan balik bermanfaat. Pautan yang berbahaya boleh membahayakan kedudukan anda. Pemeriksaan backlink percuma yang sangat baik memantau sumber pautan ke laman web anda dan mengingatkan anda tentang pautan yang berbahaya. Di samping itu, anda juga boleh menganalisis strategi pautan pesaing anda dan belajar dari mereka. Alat Pemeriksaan Backlink Percuma: Pegawai Perisikan SEO anda

Satu lagi produk kebangsaan dari Baidu disambungkan ke Deepseek.Satu lagi produk kebangsaan dari Baidu disambungkan ke Deepseek.Mar 12, 2025 pm 01:48 PM

DeepSeek-R1 memberi kuasa kepada Perpustakaan Baidu dan Netdisk: Integrasi Perfaikan dan Tindakan yang sempurna telah diintegrasikan dengan cepat ke dalam banyak platform dalam masa satu bulan sahaja. Dengan susun atur strategik yang berani, Baidu mengintegrasikan Deepseek sebagai rakan model pihak ketiga dan mengintegrasikannya ke dalam ekosistemnya, yang menandakan kemajuan besar dalam strategi ekologi "carian model besar". Platform Pintar Pintar Wenxin dan Wenxin adalah yang pertama menyambung ke fungsi carian Deep dari model besar DeepSeek dan Wenxin, yang menyediakan pengguna dengan pengalaman carian AI percuma. Pada masa yang sama, slogan klasik "Anda Akan Tahu Apabila Anda Pergi ke Baidu", dan versi baru aplikasi Baidu juga mengintegrasikan keupayaan model besar Wenxin dan Deepseek, melancarkan "AI Search" dan "Refinement Rangkaian Wide Rangkaian"

Di belakang akses Android pertama ke DeepSeek: Melihat Kekuatan WanitaDi belakang akses Android pertama ke DeepSeek: Melihat Kekuatan WanitaMar 12, 2025 pm 12:27 PM

Kebangkitan kuasa teknologi wanita Cina dalam bidang AI: kisah di sebalik kerjasama Honor dengan sumbangan wanita DeepSeek ke bidang teknologi menjadi semakin penting. Data dari Kementerian Sains dan Teknologi China menunjukkan bahawa bilangan pekerja sains wanita dan teknologi sangat besar dan menunjukkan kepekaan nilai sosial yang unik dalam pembangunan algoritma AI. Artikel ini akan memberi tumpuan kepada telefon bimbit menghormati dan meneroka kekuatan pasukan wanita di belakangnya menjadi yang pertama untuk menyambung ke model besar DeepSeek, menunjukkan bagaimana mereka dapat mempromosikan kemajuan teknologi dan membentuk semula sistem koordinat nilai pembangunan teknologi. Pada 8 Februari 2024, Honor secara rasmi melancarkan model besar versi penuh darah DeepSeek-R1, menjadi pengeluar pertama di kem Android untuk menyambung ke Deepseek, membangkitkan sambutan bersemangat dari pengguna. Di sebalik kejayaan ini, ahli pasukan wanita membuat keputusan produk, penemuan teknikal dan pengguna

Keuntungan 'menakjubkan' Deepseek: Margin keuntungan teoritis adalah setinggi 545%!Keuntungan 'menakjubkan' Deepseek: Margin keuntungan teoritis adalah setinggi 545%!Mar 12, 2025 pm 12:21 PM

DeepSeek mengeluarkan artikel teknikal mengenai Zhihu, memperkenalkan sistem inferensi DeepSeek-V3/R1 secara terperinci, dan mendedahkan data kewangan utama untuk kali pertama, yang menarik perhatian industri. Artikel ini menunjukkan bahawa margin keuntungan kos harian sistem adalah setinggi 545%, menetapkan keuntungan model AI besar global yang tinggi. Strategi kos rendah DeepSeek memberikan kelebihan dalam persaingan pasaran. Kos latihan modelnya hanya 1% -5% daripada produk yang serupa, dan kos latihan model V3 hanya AS $ 5.576 juta, jauh lebih rendah daripada pesaingnya. Sementara itu, harga API R1 hanya 1/7 hingga 1/2 OpenAIO3-Mini. Data -data ini membuktikan kelayakan komersil laluan teknologi DeepSeek dan juga mewujudkan keuntungan yang cekap model AI.

Midea melancarkan penghawa dingin DeepSeek yang pertama: Interaksi Suara AI boleh mencapai 400,000 arahan!Midea melancarkan penghawa dingin DeepSeek yang pertama: Interaksi Suara AI boleh mencapai 400,000 arahan!Mar 12, 2025 pm 12:18 PM

Midea tidak lama lagi akan melepaskan penghawa dingin pertama yang dilengkapi dengan model besar DeepSeek - Midea Fresh and Clean Air Machine T6. Penghawa dingin ini dilengkapi dengan sistem memandu pintar udara maju, yang boleh menyesuaikan parameter dengan bijak seperti suhu, kelembapan dan kelajuan angin mengikut alam sekitar. Lebih penting lagi, ia mengintegrasikan model besar DeepSeek dan menyokong lebih daripada 400,000 arahan suara AI. Langkah Midea telah menyebabkan perbincangan yang hangat dalam industri, dan sangat prihatin terhadap kepentingan menggabungkan barangan putih dan model besar. Tidak seperti tetapan suhu mudah penghawa dingin tradisional, mesin udara segar dan bersih T6 dapat memahami arahan yang lebih kompleks dan samar -samar dan secara bijak menyesuaikan kelembapan mengikut persekitaran rumah, dengan ketara meningkatkan pengalaman pengguna.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Muat turun versi mac editor Atom

Muat turun versi mac editor Atom

Editor sumber terbuka yang paling popular

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Persekitaran pembangunan bersepadu PHP yang berkuasa

EditPlus versi Cina retak

EditPlus versi Cina retak

Saiz kecil, penyerlahan sintaks, tidak menyokong fungsi gesaan kod