Apa itu Common Gateway Interface (CGI)?

745

CGI adalah Common Gateway Interface. Seperti namanya, itu adalah antarmuka gateway "umum" untuk semuanya. Sangat sepele dan naif dari namanya. Saya merasa bahwa saya memahami ini dan saya merasakan ini setiap kali saya menemukan kata ini. Tapi sejujurnya, saya tidak. Saya masih bingung.

Saya seorang programmer PHP dengan pengalaman pengembangan web.

permintaan pengguna (klien) untuk halaman ---> server web (-> penerjemah PHP tertanam) ----> Skrip sisi server (PHP) ---> Server MySQL.

Sekarang katakan PHP Script saya dapat mengambil hasil dari server MySQL & server MATLAB & beberapa server lain.

Jadi, sekarang PHP Script adalah CGI? Karena antarmuka untuk server web antara & Semua server lain? Saya tidak tahu Kadang-kadang mereka memanggil CGI, teknologi & lain kali mereka menyebut CGI program atau server lain.

  • Apa itu CGI?

  • Apa masalahnya /cgi-bin/*.cgi? Ada apa dengan ini? Saya tidak tahu untuk apa cgi-bindirektori ini di server. Saya tidak tahu mengapa mereka memiliki ekstensi * .cgi.

  • Mengapa Perl selalu menghalanginya. CGI & Perl (bahasa). Saya juga tidak tahu ada apa dengan keduanya. Hampir sepanjang waktu saya terus mendengar keduanya dalam kombinasi "CGI & Perl". Buku ini adalah contoh bagus Pemrograman CGI dengan Perl lainnya . Mengapa tidak "Pemrograman CGI dengan PHP / JSP / ASP"? Saya tidak pernah melihat hal-hal seperti itu.

  • Pemrograman CGI di C , banyak membingungkan saya. " dalam C " ?? Serius ?? Saya tidak tahu harus berkata apa. Saya hanya bingung. " dalam C " ?? Ini mengubah segalanya. Program perlu dikompilasi dan dieksekusi. Ini sepenuhnya mengubah pandangan saya tentang pemrograman web. Kapan saya mengkompilasi? Bagaimana program dijalankan (karena itu akan menjadi kode mesin, sehingga harus dijalankan sebagai proses independen). Bagaimana cara berkomunikasi dengan server web? IPC? dan berinteraksi dengan semua server (dalam contoh saya MATLAB & MySQL) menggunakan pemrograman soket? Saya tersesat!!

  • Orang mengatakan bahwa CGI sudah usang dan tidak digunakan lagi. Apakah begitu? Apa itu pembaruan terbaru?

Suatu kali, saya mengalami situasi di mana saya harus memberikan akses permintaan HTTP PUT ke server web (Apache HTTPD). Ini punggung yang panjang. Jadi, sejauh yang saya ingat inilah yang saya lakukan:

  1. Mengedit file konfigurasi Apache HTTPD untuk memberi tahu webserver agar meneruskan semua permintaan PUT HTTP ke beberapa put.php(saya harus menulis skrip PHP ini)

  2. Terapkan put.php untuk menangani permintaan (simpan file ke lokasi yang disebutkan)

Orang-orang mengatakan bahwa saya menulis Skrip CGI. Serius, saya tidak tahu apa yang mereka bicarakan.

  • Apakah saya benar-benar menulis Script CGI?

Saya harap Anda mengerti apa kebingungan saya. (Karena saya sendiri tidak tahu di mana saya bingung). Saya meminta kalian untuk menjaga jawaban Anda sesederhana mungkin. Saya benar-benar tidak dapat memahami terminologi teknis yang bagus. Setidaknya tidak dalam hal ini.

EDIT:

Saya menemukan tutorial yang luar biasa ini "Pemrograman CGI Sederhana!" - CGI Tutorial , yang menjelaskan konsep-konsep dengan cara sesederhana mungkin. Setelah membaca artikel ini, Anda mungkin ingin membaca Memulai dengan Pemrograman CGI dalam C untuk menambah pemahaman Anda dengan contoh kode aktual. Saya juga menambahkan tautan ini ke tutorial ini ke artikel Wikipedia: http://en.wikipedia.org/wiki/Common_Gateway_Interface

cakar
sumber
9
Saya sudah melihat tulisan CGI di Cobol. Tidak ada raja!
Luc M
@Luc M. Tertarik. CGI manakah yang Anda maksud (mengingat bahwa ada raycaster di LINQ ...)?
Joe
15
@ claws: Orang-orang, terutama old-school, akan memanggil kode APA SAJA, terlepas dari metode eksekusi yang sebenarnya, dieksekusi melalui server web CGI. Apa yang sebenarnya Anda tulis adalah skrip PHP, yang mungkin atau mungkin tidak dijalankan melalui protokol CGI. Kebingungan Anda tampaknya berasal dari makna ambivalen dari CGI, sebuah protokol untuk mengeksekusi kode dan kode yang dieksekusi melalui protokol (yang kemudian digeneralisasikan berarti kode yang dieksekusi oleh web)
Vinko Vrsalovic
1
Kembali di pertengahan 90-an saya menulis beberapa skrip CGI di HyperCard
Neal Davis
@ Jo, saya tidak pernah menerima notifikasi dan hari ini, membaca lagi posting ini, saya melihat pertanyaan Anda. CGI ditulis pada OpenVMS sebagai executable yang dapat dieksekusi (tidak ada kerangka kerja yang terlibat atau aplikasi pihak ketiga ...)
Luc M

Jawaban:

427

CGI adalah antarmuka yang memberi tahu server web bagaimana cara menyampaikan data ke dan dari suatu aplikasi. Lebih khusus lagi, ini menggambarkan bagaimana informasi permintaan diteruskan dalam variabel lingkungan (seperti jenis permintaan, alamat IP jarak jauh), bagaimana badan permintaan diteruskan melalui input standar, dan bagaimana respons disampaikan melalui output standar. Anda dapat merujuk ke spesifikasi CGI untuk detailnya.

Untuk menggunakan gambar Anda:

user (client) request for page ---> webserver ---[CGI]----> Server side Program ---> MySQL Server.

Sebagian besar jika tidak semua, webservers dapat dikonfigurasi untuk menjalankan suatu program sebagai 'CGI'. Ini berarti bahwa server web, setelah menerima permintaan, akan meneruskan data ke program tertentu, mengatur beberapa variabel lingkungan dan menyusun parameter melalui input standar dan output standar sehingga program dapat mengetahui di mana dan apa yang harus dicari.

Manfaat utama adalah bahwa Anda dapat menjalankan kode APAPUN yang dapat dieksekusi dari web, mengingat bahwa server web dan program mengetahui cara kerja CGI. Itu sebabnya Anda bisa menulis program web dalam C atau Bash dengan server web yang diaktifkan CGI biasa. Itu, dan sebagian besar lingkungan pemrograman dapat dengan mudah menggunakan input standar, output standar dan variabel lingkungan.

Dalam kasus Anda, Anda kemungkinan besar menggunakan yang lain, khusus untuk PHP, alat komunikasi antara skrip Anda dan server web, ini, seperti yang Anda sebutkan dalam pertanyaan Anda, adalah penerjemah tertanam yang disebut mod_php.

Jadi, jawablah pertanyaan Anda:

Apa itu CGI?

Lihat di atas.

Apa masalahnya dengan /cgi-bin/*.cgi? Ada apa dengan ini? Saya tidak tahu untuk apa direktori cgi-bin ini berada di server. Saya tidak tahu mengapa mereka memiliki ekstensi * .cgi.

Itu adalah tempat tradisional untuk program cgi, banyak webservers datang dengan direktori ini yang sudah dikonfigurasi untuk menjalankan semua binari di sana sebagai program CGI. Ekstensi .cgi menunjukkan suatu executable yang diharapkan dapat bekerja melalui CGI.

Mengapa Perl selalu menghalanginya. CGI & Perl (bahasa). Saya juga tidak tahu ada apa dengan keduanya. Hampir sepanjang waktu saya terus mendengar keduanya dalam kombinasi "CGI & Perl". Buku ini adalah contoh bagus Pemrograman CGI dengan Perl Mengapa tidak "Pemrograman CGI dengan PHP / JSP / ASP". Saya tidak pernah melihat hal-hal seperti itu.

Karena Perl kuno (lebih tua dari PHP, JSP, dan ASP yang semuanya muncul ketika CGI sudah tua, Perl ada ketika CGI masih baru) dan menjadi cukup terkenal karena menjadi bahasa yang sangat baik untuk melayani laman web dinamis melalui CGI. Saat ini ada alternatif lain untuk menjalankan Perl di server web, terutama mod_perl .

Pemrograman CGI dalam C ini banyak membingungkan saya. dalam C ?? Serius ?? Saya tidak tahu harus berkata apa. Saya "hanya bingung." Di C "?? Ini mengubah segalanya. Program perlu dikompilasi dan dieksekusi. Ini sepenuhnya mengubah pandangan saya tentang pemrograman web. Kapan saya mengkompilasi? Bagaimana program dieksekusi (karena itu akan menjadi kode mesin, jadi harus dijalankan sebagai proses independen) .Bagaimana ia berkomunikasi dengan server web? IPC? dan berinteraksi dengan semua server (dalam contoh saya MATLAB & MySQL) menggunakan pemrograman soket? Saya tersesat !!

Anda mengkompilasi executable sekali, server web mengeksekusi program dan meneruskan data dalam permintaan ke program dan mengeluarkan respons yang diterima. CGI menetapkan bahwa satu instance program akan diluncurkan per setiap permintaan. Inilah sebabnya mengapa CGI tidak efisien dan agak ketinggalan zaman saat ini.

Mereka mengatakan bahwa CGI sudah usang. Tidak lagi digunakan. Benarkah begitu? Apa pembaruan terbarunya?

CGI masih digunakan ketika kinerja bukan yang terpenting dan sarana sederhana untuk mengeksekusi kode diperlukan. Itu tidak efisien karena alasan yang dinyatakan sebelumnya dan ada cara yang lebih modern untuk menjalankan program apa pun di lingkungan web. Saat ini yang paling terkenal adalah FastCGI .

Vinko Vrsalovic
sumber
24
Lebih khusus lagi, ini menjelaskan bagaimana informasi permintaan diteruskan dalam variabel lingkungan (seperti jenis permintaan, alamat IP jarak jauh), bagaimana badan reqeust diteruskan melalui input standar, dan bagaimana respons diteruskan melalui output standar. Anda dapat merujuk ke spesifikasi CGI ( hoohoo.ncsa.illinois.edu/cgi ) untuk detailnya.
daf
3
Dengan asumsi Server side Programdalam gambar Anda adalah skrip PHP saya. Jadi, saya tidak pernah melakukan pemrograman CGI? Karena saya tidak pernah menulis apa pun yang ada di antara server web & skrip PHP saya. Sial!! ini membunuhku.
cakar
4
PHP masih banyak didasarkan pada protokol CGI, sebagian besar konten $ _SERVER langsung dari spesifikasi CGI. Dan "pemrograman CGI" selalu berarti program memproses permintaan, bukan implementasi protokol itu sendiri. Jika Anda menjelaskan apa yang Anda lakukan dengan PHP ke pionir pemrograman web era 1993, ia akan menganggapnya sebagai bentuk lanjutan dari pemrograman CGI.
Michael Borgwardt
5
@Michael: Tetapi ketika menjalankan melalui mod_php bukan CGI sama sekali (bahkan jika didasarkan pada itu). Dan saya setuju bahwa CGI mengacu pada protokol dan skrip yang dieksekusi melalui itu.
Vinko Vrsalovic
2
@ Vinko Vrsalovic: jika CGI adalah antarmuka untuk Perl, C atau bahasa lain untuk dieksekusi di Web Server daripada antarmuka mana yang digunakan oleh PHP untuk dijalankan di Apache ????????? dan apakah PHP termasuk dalam Spesifikasi CGI ??
hardik
63

Apa itu CGI?

Sarana bagi server web untuk mendapatkan datanya dari suatu program (bukannya, misalnya, file).

Apa masalahnya dengan /cgi-bin/*.cgi?

Bukan masalah besar. Itu hanya sebuah konvensi.

Saya tidak tahu untuk apa direktori cgi-bin ini berada di server. Saya tidak tahu mengapa mereka memiliki ekstensi * .cgi.

Server harus tahu apa yang harus dilakukan dengan file (yaitu memperlakukannya sebagai program untuk mengeksekusi, bukan sesuatu untuk hanya melayani). Memiliki ekstensi .html memberitahukannya untuk menggunakan tipe konten teks / html. Memiliki ekstensi .cgi memberitahukannya untuk menjalankannya sebagai program.

Menyimpan executable di direktori terpisah memberikan perlindungan tambahan terhadap eksekusi file yang salah dan / atau menayangkan program CGI sebagai data mentah jika server mengalami kesalahan konfigurasi.

Mengapa Perl selalu menghalanginya.

Tidak. Perl hanya besar dan populer pada saat yang sama dengan CGI.

Saya belum pernah menggunakan Perl CGI selama bertahun-tahun. Saya menggunakan mod_perl untuk waktu yang lama, dan cenderung ke PSGI / Plack dengan FastCGI hari ini.

Buku ini adalah contoh bagus Pemrograman CGI dengan Perl Mengapa tidak "Pemrograman CGI dengan PHP / JSP / ASP".

CGI tidak terlalu efisien. Metode yang lebih baik untuk berbicara dengan program dari webserver datang pada waktu yang sama dengan PHP. JSP dan ASP adalah metode yang berbeda untuk berbicara dengan program.

Pemrograman CGI dalam C ini banyak membingungkan saya. dalam C ?? Serius ??

Itu adalah bahasa pemrograman, mengapa tidak?

Kapan saya mengkompilasi?

  1. Tulis kode
  2. Menyusun
  3. URL akses
  4. Server web menjalankan program

Bagaimana program dijalankan (karena itu akan menjadi kode mesin, sehingga harus dijalankan sebagai proses independen).

Itu tidak harus dijalankan sebagai proses independen (Anda dapat menulis modul Apache dalam C), tetapi seluruh konsep CGI adalah bahwa ia meluncurkan proses eksternal.

Bagaimana cara berkomunikasi dengan server web? IPC?

STDIN / STDOUT dan variabel lingkungan - sebagaimana didefinisikan dalam spesifikasi CGI.

dan berinteraksi dengan semua server (dalam contoh saya MATLAB & MySQL) menggunakan pemrograman soket?

Menggunakan metode apa pun yang Anda suka dan didukung.

Mereka mengatakan bahwa CGI disusutkan. Tidak lagi digunakan. Benarkah begitu?

CGI tidak efisien, lambat dan sederhana. Ini jarang digunakan, ketika digunakan, itu karena sederhana. Jika kinerja bukan masalah besar, maka kesederhanaan sangat berharga.

Apa pembaruan terbarunya?

1.1

Quentin
sumber
1. Tulis kode 2. Kompilasi 3. Akses URL 4. Webserver menjalankan program. || Tetapi bagaimana server web tahu di mana Anda menempatkan program yang dapat dieksekusi yang dikompilasi? Bagaimana cara mengetahui program yang dapat dijalankan (di antara mereka semua) untuk dijalankan?
Pacerier
@Pacerier - Cara yang sama ia tahu file statis mana yang akan dikirim ke klien jika diminta file statis.
Quentin
41

CGI adalah spesifikasi antarmuka antara server web (server HTTP) dan program yang dapat dieksekusi dari beberapa jenis yang menangani permintaan tertentu.

Ini menjelaskan bagaimana sifat-sifat tertentu dari permintaan itu harus dikomunikasikan ke lingkungan program itu dan bagaimana program harus mengkomunikasikan respons kembali ke server dan bagaimana server harus 'menyelesaikan' respons untuk membentuk jawaban yang valid untuk permintaan HTTP asli.

Untuk sementara CGI adalah Draft Internet IETF dan karenanya memiliki tanggal kedaluwarsa. Itu kedaluwarsa tanpa pembaruan sehingga tidak ada 'standar' CGI. Ini sekarang RFC informasi, tetapi sebagai dokumen praktik umum dan bukan standar itu sendiri. rfc3875.txt , rfc3875.html

Program yang mengimplementasikan antarmuka CGI dapat ditulis dalam bahasa apa pun yang dapat dijalankan di mesin target. Mereka harus dapat mengakses variabel lingkungan dan biasanya input standar dan mereka menghasilkan output mereka pada output standar .

Bahasa yang dikompilasi seperti C umumnya digunakan sebagaimana bahasa scripting seperti perl, sering menggunakan perpustakaan untuk membuat mengakses lingkungan CGI lebih mudah.

Salah satu kelemahan besar CGI adalah bahwa program baru dihasilkan untuk setiap permintaan sehingga menjaga status di antara permintaan bisa menjadi masalah kinerja utama. Negara mungkin ditangani dalam cookie atau dikodekan dalam URL, tetapi jika sampai besar itu harus disimpan di tempat lain dan dikunci dari informasi url yang dikodekan atau cookie. Setiap permohonan CGI kemudian harus memuat ulang kondisi tersimpan dari toko di suatu tempat.

Untuk alasan ini, dan untuk antarmuka yang sangat sederhana untuk permintaan dan sesi, lingkungan terintegrasi yang lebih baik antara server web dan aplikasi jauh lebih populer. Lingkungan seperti implementasi php modern dengan apache mengintegrasikan bahasa target jauh lebih baik dengan server web dan menyediakan akses ke objek permintaan dan sesi yang diperlukan untuk melayani permintaan http secara efisien. Mereka menawarkan cara yang jauh lebih mudah dan lebih kaya untuk menulis 'program' untuk menangani permintaan HTTP.

Apakah Anda menulis skrip CGI tergantung pada interpretasi. Tentu saja melakukan pekerjaan satu tetapi jauh lebih biasa untuk menjalankan php sebagai modul di mana antarmuka antara skrip dan server tidak sepenuhnya merupakan antarmuka CGI.

CB Bailey
sumber
1
Mengganggu. Saya mulai menulis ini ketika tidak ada jawaban lain, tetapi dipanggil. Sekarang tentang # 8 dalam daftar. Saya tidak punya keinginan untuk menghapusnya sekarang, saya akan kembali dan menghapusnya nanti.
CB Bailey
6
Hai .. Tolong jangan hapus itu. Itu mengatakan beberapa hal dengan cara yang lebih jelas. Saya merasa terbantu. Mungkin sebagian yang lain mungkin juga menemukannya. :)
cakar
1
OK, saya akan meninggalkannya sebentar. Akan lebih baik jika seseorang mengintegrasikan bagian yang 'lebih baik' ke dalam salah satu jawaban yang lebih lengkap. Maka kita mungkin sudah mendapatkan jawaban yang lebih pasti.
CB Bailey
18

CGI ditentukan dalam RFC 3875 , meskipun itu adalah kodifikasi "resmi" nanti dari dokumen NCSA asli . Pada dasarnya, CGI mendefinisikan protokol untuk meneruskan data tentang permintaan HTTP dari server web ke program untuk diproses - program apa pun, dalam bahasa apa pun. Pada saat spesifikasi ditulis (1993), sebagian besar server web hanya berisi halaman statis, "aplikasi web" adalah hal yang langka dan baru, sehingga tampak alami untuk memisahkannya dari konten statis "normal", seperti dalam cgi-bindirektori terpisah dari konten statis, dan membuatnya berakhir .cgi.

Pada saat ini, di sini juga tidak ada "bahasa pemrograman web" khusus seperti PHP, dan C adalah bahasa pemrograman portabel yang mendominasi - begitu banyak orang menulis skrip CGI mereka dalam C. Tetapi Perl dengan cepat berubah menjadi lebih cocok untuk jenis ini. hal, dan CGI menjadi hampir identik dengan Perl untuk sementara waktu. Lalu datanglah Java Servlets, PHP dan banyak lainnya dan mengambil alih sebagian besar pangsa pasar Perl.

Michael Borgwardt
sumber
Mengapa PHP adalah "bahasa pemrograman web khusus"? PHP adalah bahasa tujuan umum dan orang - orang telah menggunakannya untuk aplikasi UI juga.
Pacerier
@Pacerier: itu dirancang untuk menjadi bahasa pemrograman untuk menghasilkan halaman web, dan itulah yang digunakan 99,9% penggunanya. Bahkan dalam namanya . Mengklaim hal lain sama sekali tidak berguna. Jika Anda menggunakannya untuk aplikasi UI, komputasi ilmiah atau pemrograman tertanam, baik, senang, tidak ada yang mengatakan Anda tidak diizinkan.
Michael Borgwardt
13

Lihatlah CGI di Wikipedia. CGI adalah protokol antara server web dan program eksternal atau skrip yang menangani input dan menghasilkan output yang dikirim ke browser.

CGI hanyalah cara bagi server web dan program untuk berkomunikasi, tidak lebih, tidak kurang. Di sini server mengelola koneksi jaringan dan protokol HTTP dan program menangani input dan menghasilkan output yang dikirim ke browser. Skrip CGI pada dasarnya adalah program apa pun yang dapat dijalankan oleh server web dan mengikuti protokol CGI. Dengan demikian program CGI dapat diimplementasikan, misalnya, dalam C. Namun itu sangat jarang, karena C tidak terlalu cocok untuk tugas tersebut.

/cgi-bin/*.cgihanyalah sebuah jalur di mana orang biasanya meletakkan skrip CGI mereka. Server web biasanya dikonfigurasi secara default untuk mengambil skrip CGI dari jalur itu.

skrip CGI dapat diimplementasikan juga dalam PHP, tetapi semua program PHP bukan skrip CGI. Jika server web telah menyematkan juru bahasa PHP (mis. Mod_php di Apache), maka fase CGI dilewati oleh protokol langsung yang lebih efisien antara server web dan juru bahasa.

Apakah Anda telah mengimplementasikan skrip CGI atau tidak tergantung pada bagaimana skrip Anda dijalankan oleh server web.

Juha Syrjälä
sumber
12

CGI pada dasarnya meneruskan permintaan tersebut ke penerjemah mana pun yang dikonfigurasikan dengan server web - Ini bisa Perl, Python, PHP, Ruby, C, apa saja. Perl adalah yang paling umum di hari itu sebabnya Anda sering melihatnya mengacu pada CGI.

CGI tidak mati. Bahkan sebagian besar perusahaan hosting besar menjalankan PHP sebagai CGI yang bertentangan dengan mod_php karena ia menawarkan konfigurasi tingkat pengguna dan beberapa hal lain sementara itu lebih lambat daripada mod_php. Ruby dan Python juga biasanya dijalankan sebagai CGI. Perbedaan utama di sini adalah modul server berjalan sebagai bagian dari perangkat lunak server sebenarnya - di mana sama halnya dengan CGI yang sepenuhnya berada di luar server, server hanya menggunakan modul CGI untuk menentukan cara mengirim dan menerima data ke juru bahasa luar.

prodigitalson
sumber
2
Bukan downvoting tetapi sebagian besar instal web python pernah saya lihat di mod_wsgi atau mod_python.
ChristopheD
Ini adalah bagaimana kebanyakan orang menggunakan skrip istilah CGI, tetapi tidak cukup apa arti istilah itu.
reinierpost
Anda mengatakan penerjemah tetapi C jarang ditafsirkan dan program yang dikompilasi seperti program yang dikompilasi C dapat digunakan untuk CGI.
user34660
11

CGI adalah mekanisme di mana program eksternal dipanggil oleh server web untuk menangani permintaan, dengan variabel lingkungan dan input standar yang digunakan untuk memberi makan data permintaan ke program. Bahasa pasti yang ditulis oleh program eksternal tidak masalah, meskipun lebih mudah untuk menulis program CGI dalam beberapa bahasa dibandingkan yang lain.

Karena skrip CGI perlu menjalankan izin, httpd secara default hanya memungkinkan program CGI di cgi-bindirektori dijalankan untuk tujuan keamanan (mungkin sekarang salah arah).

Kebanyakan skrip PHP dijalankan melalui proses server web mod_php. Ini bukan CGI.

CGI lambat karena program (dan interpreter terkait) harus dijalankan sesuai permintaan. Alternatif modern adalah eksekusi tertanam, digunakan oleh mod_php, dan proses yang berjalan lama, digunakan oleh FastCGI. Bahasa yang diberikan mungkin memiliki cara sendiri untuk menerapkan mekanisme tersebut, jadi pastikan untuk bertanya-tanya sebelum beralih ke CGI.

Ignacio Vazquez-Abrams
sumber
@Ignacio Vazquez-Abrams: jika CGI Interface membuat Proses baru, setiap kali ia menerima permintaan untuk Sumber Daya CGI daripada apa perbedaan eksekusi antara CGI dan mod_php ???????? apakah CGI dan mod_php sama ???? atau apakah mungkin untuk menulis skrip PHP yang berjalan di bawah CGI Interface bukan di bawah mod_php ???
hardik
@ Hardik: mod_php berjalan sebagai bagian dari HTTPd, yang bertanggung jawab atas prosesnya sendiri.
Ignacio Vazquez-Abrams
apa 'program eksternal' ini? apakah ini penerjemah jika saya menjalankan php dengan php-fpm?
slier
@slier: Ini adalah program arbitrer yang bukan server web.
Ignacio Vazquez-Abrams
@ IgnacioVazquez-Abrams jadi apakah aman untuk menganggap bahwa itu adalah interpreterif jika menjalankan php dengan php-fpm?
slier
7

Anda mungkin ingin tahu apa yang bukan CGI, dan jawabannya adalah MODUL untuk server web Anda (jika saya kira Anda runnig Apache). DAN ITULAH PERBEDAAN BESAR, karena CGI perlu dan program eksternal, utas, apa pun untuk instantiate server aplikasi PERL, PHP, C di mana ketika Anda menjalankan sebagai MODUL program itu adalah server web (apache) per-se.

Karena semua ini ada banyak masalah kinerja, keamanan, portabilitas yang ikut berperan. Tapi ada baiknya mengetahui apa yang bukan CGI dulu, untuk memahami apa itu CGI.

denica
sumber
7

Contoh kehidupan nyata: database rumit yang perlu ditampilkan di situs web. Karena basis data dirancang sekitar tahun 1986 (!), Banyak data dikemas dengan berbagai cara untuk menghemat ruang disk.

Seiring perkembangannya, pengembang tidak lagi bisa menyelesaikan permintaan data yang rumit dalam SQL saja, misalnya karena algorythms pengurutan tidak biasa.

Ada tiga solusi yang masuk akal:

  1. cepat dan kotor: kirim data yang tidak disimpan ke PHP, urutkan di sana. Tentunya solusi yang sangat mahal, karena ini akan diulang setiap kali halaman dipanggil
  2. tulis sebuah plugin ke mesin basis data - tetapi admin tidak siap untuk mengizinkan kode asing berjalan di server mereka, atau
  3. Anda dapat memproses data dalam suatu program (C, Perl, dll.), dan menghasilkan HTML. Program itu sendiri masuk ke / cgi-bin, dan dipanggil oleh server web (mis. Apache) secara langsung, bukan melalui PHP.

CGI menjalankan skrip Anda di Solusi # 3 dan menampilkan efek ke browser. Anda memiliki kecepatan program yang dikompilasi, fleksibilitas bahasa yang lebih baik daripada SQL, dan tidak perlu menulis plugin ke server SQL. (Sekali lagi, ini adalah contoh khusus untuk SQL dan C)

Michał Leon
sumber
1
Jawaban terbaik untuk saya, saya mengerti.
Daniel Katz
7

Skrip CGI adalah program konsol / shell. Di Windows, saat Anda menggunakan jendela "Prompt Perintah", Anda menjalankan program konsol. Ketika server web mengeksekusi skrip CGI, ia memberikan input ke program konsol / shell menggunakan variabel lingkungan atau "input standar". Input standar seperti mengetik data ke program konsol / shell; dalam hal skrip CGI, server web melakukan pengetikan. Skrip CGI menulis data ke "output standar" dan output itu dikirim ke klien (browser web) sebagai halaman HTML. Output standar seperti output yang Anda lihat di program konsol / shell kecuali server web membacanya dan mengirimkannya.

Skrip CGI dapat dieksekusi dari browser. URI biasanya menyertakan string kueri yang disediakan untuk skrip CGI. Jika metode ini adalah "get" maka string kueri disediakan ke CGI Script dalam variabel lingkungan yang disebut QUERY_STRING. Jika metode ini adalah "posting" maka string kueri disediakan ke CGI Script menggunakan input standar (CGI Script membaca string kueri dari input standar).

Penggunaan awal skrip CGI adalah untuk memproses formulir. Di awal HTML, formulir HTML biasanya memiliki atribut "aksi" dan tombol yang ditunjuk sebagai tombol "kirim". Ketika tombol kirim ditekan, URI yang ditentukan dalam atribut "aksi" akan dikirim ke server dengan data dari formulir yang dikirim sebagai string kueri. Jika "aksi" menentukan skrip CGI maka skrip CGI akan dieksekusi dan kemudian menghasilkan halaman HTML.

RFC 3875 "The Common Gateway Interface (CGI)" mendefinisikan sebagian CGI menggunakan C, seperti yang dikatakan bahwa variabel lingkungan "diakses oleh pustaka rutin getenv () atau variabel environment".

Jika Anda mengembangkan skrip CGI menggunakan C / C ++ dan menggunakan Microsoft Visual Studio untuk melakukannya, Anda akan mengembangkan program konsol.

pengguna34660
sumber
"Script CGI" adalah istilah yang luas dan juga dapat menyertakan file yang dapat dieksekusi.
71GA
6

CGI adalah program (atau API Web) yang Anda tulis, dan simpan di situs Server Web. CGI adalah file.

File ini duduk dan menunggu di Server Web. Ketika browser klien mengirimkan permintaan ke Server Web untuk mengeksekusi file CGI Anda, Server Web menjalankan file CGI Anda di situs server. Input untuk program CGI ini, jika ada, berasal dari browser klien. Output dari program CGI ini dikirim ke browser.

Bahasa apa yang Anda gunakan untuk menulis program CGI? Posting lain sudah menyebutkan c, java, php, perl, dll.

Loc Pham
sumber
4

Gagasan di balik CGI adalah bahwa suatu program / skrip (baik Perl atau bahkan C) menerima input melalui STDIN(data permintaan) dan mengeluarkan data melalui STDOUT(gema, printfpernyataan).

Alasan kebanyakan skrip PHP tidak memenuhi syarat adalah karena skrip tersebut dijalankan di bawah modul PHP Apache.

Nathan Osman
sumber