Ortak Ağ Geçidi Arabirimi (CGI) nedir?


745

CGI, Ortak Ağ Geçidi Arabirimidir. Adından da anlaşılacağı gibi, her şey için "ortak" bir ağ geçidi arayüzüdür. Adından çok önemsiz ve naif. Bunu anladığımı hissediyorum ve bu kelimeyle her karşılaştığımda bunu hissettim. Ama açıkçası söylemedim. Hala kafam karıştı.

Ben web geliştirme deneyimi olan bir PHP programcısıyım.

sayfa için kullanıcı (istemci) isteği ---> webserver (-> katıştırılmış PHP yorumlayıcısı) ----> Sunucu tarafı (PHP) Komut Dosyası ---> MySQL Sunucusu.

Şimdi PHP Script'imin MySQL sunucusundan & MATLAB sunucusundan ve başka bir sunucudan sonuçları getirebileceğini söyleyin.

Peki, şimdi PHP Script CGI mı? Çünkü web sunucusu ve diğer tüm sunucular arasındaki arayüzü? Bilmiyorum. Bazen CGI, teknoloji diyorlar, diğer zamanlarda CGI program veya başka bir sunucu diyorlar.

  • CGI tam olarak nedir?

  • Ne ile büyük anlaşma /cgi-bin/*.cgi? Bunun nesi var? cgi-binSunucudaki bu dizinin ne için olduğunu bilmiyorum . Neden * .cgi uzantıları olduğunu bilmiyorum.

  • Perl neden hep yoluna giriyor? CGI ve Perl (dil). Ben de bu ikisinin ne olduğunu bilmiyorum. Neredeyse her zaman bu ikisini "CGI & Perl" kombinasyonunda duymaya devam ediyorum. Bu kitap Perl ile CGI Programlama için harika bir örnek . Neden "PHP / JSP / ASP ile CGI Programlama"? Hiç böyle şeyler görmedim.

  • C'de CGI Programlama , beni çok karıştırıyor. " C " içinde ?? Ciddi anlamda?? Ne diyeceğimi bilmiyorum. Sadece kafam karıştı. " C " içinde ?? Bu her şeyi değiştirir. Programın derlenmesi ve yürütülmesi gerekir. Bu tamamen web programlama bakışımı değiştiriyor. Ne zaman derleyeceğim? Program nasıl yürütülür (çünkü bir makine kodu olacağından, bağımsız bir işlem olarak yürütülmesi gerekir). Web sunucusuyla nasıl iletişim kurar? IPC? ve soket programlama kullanarak tüm sunucularla (benim örneğim MATLAB ve MySQL) arayüz? Kayboldum!!

  • İnsanlar CGI'nın kullanımdan kaldırıldığını ve artık kullanılmadığını söylüyor. Öyle mi? En son güncelleme nedir?

Bir kere, HTTP PUT isteğine web sunucusuna (Apache HTTPD) erişim vermek zorunda kaldım. Uzun bir arka. Yani, hatırladığım kadarıyla yaptığım şey bu:

  1. Web sunucusuna tüm HTTP PUT isteklerini bazılarına iletmesini söylemek için Apache HTTPD'nin yapılandırma dosyasını düzenledi put.php(Bu PHP betiğini yazmak zorunda kaldım)

  2. İsteği işlemek için put.php uygulayın (dosyayı belirtilen konuma kaydedin)

İnsanlar bir CGI Senaryosu yazdığımı söyledi. Cidden, ne hakkında konuştuklarına dair bir fikrim yoktu.

  • Gerçekten CGI Script mi ​​yazdım?

Umarım karışıklığımın ne olduğunu anlarsın. (Çünkü kendim nerede kafam karıştı bilmiyorum). Sizden cevabınızı mümkün olduğunca basit tutmanızı rica ediyorum. Hiçbir fantezi teknik terminolojisini gerçekten anlayamıyorum. En azından bu durumda değil.

DÜZENLE:

Ben bu şaşırtıcı öğretici buldum "CGI Programlama Basit!" - Kavramları mümkün olan en basit şekilde açıklayan CGI Eğitimi . Bu makaleyi okuduktan sonra , gerçek kod örnekleri ile anlayışınızı desteklemek için C dilinde CGI Programlamaya Başlarken bölümünü okumak isteyebilirsiniz . Bu eğiticiye bu bağlantıları Wikipedia'nın makalesine de ekledim: http://en.wikipedia.org/wiki/Common_Gateway_Interface


9
Cobol'da zaten CGI yazdığını gördüm. Öldürme yok!
Luc M

@Luc M. İlgileniyorum. Hangi CGI demek istiyorsun (LINQ'da bir raycaster olduğu düşünüldüğünde ...)?
Joe

15
@claws: Çoğunlukla eski okuldaki insanlar, web sunucusu aracılığıyla bir CGI aracılığıyla yürütülen gerçek yürütme yöntemine bakılmaksızın HERHANGİ BİR kodu arayacaklardır. Aslında yazdığınız şey, CGI protokolü üzerinden çalıştırılabilecek veya yürütülmeyecek bir PHP betiğidir. Karışıklıklarınız, kod yürütmek için bir protokol olan CGI'nin kararsız anlamından ve protokol yoluyla yürütülen koddan kaynaklanıyor gibi görünüyor (daha sonra herhangi bir web tarafından yürütülen kod anlamına gelir)
Vinko Vrsalovic

1
90'ların ortalarında HyperCard'da birkaç CGI betiği yazdım
Neal Davis

@Joe Asla bildirim almadım ve bugün, bu yazıyı tekrar okuyarak, sorunuzu gördüm. CGI'lar OpenVMS'de bağımsız yürütülebilir dosyalar olarak yazılmıştır (çerçeve içermez veya üçüncü taraf başvuru sahipleri ...)
Luc M

Yanıtlar:


427

CGI, web sunucusuna bir uygulamaya nasıl veri aktarılacağını bildiren bir arabirimdir. Daha spesifik olarak, istek bilgilerinin ortam değişkenlerinde (istek türü, uzak IP adresi gibi) nasıl iletildiğini, istek gövdesinin standart girdi yoluyla nasıl iletildiğini ve yanıtın standart çıktı yoluyla nasıl iletildiğini açıklar. Ayrıntılar için CGI teknik özelliklerine bakabilirsiniz.

Resminizi kullanmak için:

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

Çoğu olmasa da, web sunucuları bir programı 'CGI' olarak çalıştıracak şekilde yapılandırılabilir. Bu, web sunucusunun, bir istek aldıktan sonra, verileri belirli bir programa iletecek, bazı ortam değişkenlerini ayarlayacak ve parametreleri standart girdi ve standart çıktı yoluyla sıralayacak, böylece program nerede ve ne arayacağını bilebilir.

En büyük yararı, hem web sunucusu hem de programın CGI'nın nasıl çalıştığını bildiği göz önüne alındığında, herhangi bir yürütülebilir kodu web'den çalıştırabilmenizdir. Bu nedenle C veya Bash'te normal CGI özellikli bir web sunucusu ile web programları yazabilirsiniz. Bu ve çoğu programlama ortamı standart girdi, standart çıktı ve ortam değişkenlerini kolayca kullanabilir.

Sizin durumunuzda büyük olasılıkla PHP'ye özgü başka bir komut dosyası kullandınız, komut dosyalarınız ve web sunucusu arasındaki iletişim araçları, bu, sorunuzda belirttiğiniz gibi mod_php adlı gömülü bir yorumlayıcıdır.

Sorularınızı cevaplamak için:

CGI tam olarak nedir?

Yukarıyı görmek.

/Cgi-bin/*.cgi ile olan büyük anlaşma nedir? Buna ne dersin? Sunucudaki bu cgi-bin dizininin ne olduğunu bilmiyorum. Neden * .cgi uzantıları olduğunu bilmiyorum.

Bu cgi programları için geleneksel bir yerdir, birçok web sunucusu bu dizini önceden CGI programları olarak çalıştırmak için yapılandırılmış olarak gelir. .Cgi uzantısı, CGI aracılığıyla çalışması beklenen bir yürütülebilir dosyayı gösterir.

Perl neden hep yoluna giriyor? CGI ve Perl (dil). Ben de bu ikisinin ne olduğunu bilmiyorum. Neredeyse her zaman bu ikisini "CGI & Perl" kombinasyonunda duymaya devam ediyorum. Bu kitap bir diğer harika örnek Perl ile CGI Programlama Neden "PHP / JSP / ASP ile CGI Programlama". Hiç böyle şeyler görmedim.

Perl eski (CGI zaten eski olduğunda ortaya çıkan PHP, JSP ve ASP'den daha eski olduğu için, CGI yeni olduğunda Perl vardı) ve CGI aracılığıyla dinamik web sayfalarına hizmet etmek için çok iyi bir dil olduğu için oldukça ünlü oldu. Günümüzde Perl'i bir web sunucusunda çalıştırmak için başka alternatifler de var, özellikle mod_perl .

C'de CGI Programlama bu beni çok karıştırıyor. C? Ciddi anlamda?? Ne diyeceğimi bilmiyorum. Ben "sadece karıştı." C "?? Bu her şeyi değiştirir. Program derlenmesi ve yürütülmesi gerekir. Bu tamamen web programlama bakışımı değiştirir. Ne zaman derlemek? Program nasıl yürütülür (çünkü bir makine kodu, bu yüzden bağımsız bir işlem olarak yürütmek gerekir) Web sunucusuyla nasıl iletişim kurar? IPC? ve soket programlama kullanarak tüm sunucularla (benim örnek MATLAB & MySQL) arabirim?

Yürütülebilir dosyayı bir kez derlersiniz, web sunucusu programı yürütür ve istekte bulunan verileri programa iletir ve alınan yanıtı verir. CGI, her istek için bir program örneğinin başlatılacağını belirtir. Bu yüzden CGI günümüzde yetersiz ve modası geçmiş.

CGI'nın reddedildiğini söylüyorlar. Artık kullanımda değil. Öyle mi? En son güncellemesi nedir?

CGI, performans çok önemli olmadığında ve kod yürütmek için basit bir yol gerektiğinde hala kullanılmaktadır. Daha önce belirtilen nedenlerden dolayı verimsizdir ve bir web ortamında herhangi bir programı yürütmenin daha modern yolları vardır. Şu anda en ünlü FastCGI .


24
Daha spesifik olarak, istek bilgilerinin ortam değişkenlerinde (istek türü, uzak IP adresi gibi) nasıl aktarıldığını, talep gövdesinin standart girdi yoluyla nasıl iletildiğini ve yanıtın standart çıktı yoluyla nasıl iletildiğini açıklar. Ayrıntılar için CGI spesifikasyonuna ( hoohoo.ncsa.illinois.edu/cgi ) başvurabilirsiniz .
daf

3
Şeklinde varsayıyorum Server side Programbenim PHP betiğim. Yani, hiç CGI programlama yapmadım mı? Çünkü web sunucusu ile PHP betiğim arasında hiçbir şey yazmadım. Lanet olsun!! bu beni öldürüyor.
pençeleri

4
PHP hala CGI protokolüne dayanıyor, $ _SERVER içeriğinin çoğu doğrudan CGI spesifikasyonundan. Ve "CGI programlama" protokolün uygulanmasını değil, her zaman talebi işleyen program anlamına geliyordu. PHP ile 1993 dönemi web programlama öncüsüne ne yaptığınızı açıkladıysanız, bunu gelişmiş (muhtemelen wimpy olsa da) bir CGI programlama biçimi olarak kabul eder.
Michael Borgwardt

5
@Michael: Ancak mod_php ile çalışırken CGI değildir (buna dayalı olsa bile). Ve CGI'nın hem protokolü hem de onun üzerinden yürütülen komut dosyalarını ifade ettiğini kabul ediyorum.
Vinko Vrsalovic

2
@ Vinko Vrsalovic: CGI, Perl, C veya diğer diller için Web Sunucusu'nda çalıştırılacak bir arabirim ise, PHP tarafından Apache'de çalışmak için hangi arabirim kullanılır ???????? ve PHP CGI Özellikler altında geliyor ??
hardik

63

CGI tam olarak nedir?

Web sunucusunun verilerini bir programdan alması için bir araç (örneğin, bir dosya yerine).

/Cgi-bin/*.cgi ile olan büyük anlaşma nedir?

Önemli değil. Bu sadece bir kongre.

Sunucudaki bu cgi-bin dizininin ne olduğunu bilmiyorum. Neden * .cgi uzantıları olduğunu bilmiyorum.

Sunucunun dosya ile ne yapacağını bilmesi gerekir (yani, sadece sunum yapmak için bir şey yerine yürütmek için bir program olarak davran). Bir .html uzantısına sahip olmak, ona bir metin / html içerik türü kullanmasını söyler. Bir .cgi uzantısına sahip olmak, onu bir program olarak çalıştırmasını söyler.

Yürütülebilir dosyaları ayrı bir dizinde tutmak, sunucunun yanlış yapılandırılması durumunda yanlış dosyaların yürütülmesine ve / veya CGI programlarının ham veri olarak sunulmasına karşı ek koruma sağlar.

Perl neden hep yoluna giriyor?

Öyle değil. Perl, CGI ile aynı zamanda büyük ve popülerdi.

Yıllardır Perl CGI kullanmadım. Mod_perl'i uzun zamandır kullanıyordum ve bu günlerde FastCGI ile PSGI / Plack'a yöneliyorum.

Bu kitap bir diğer harika örnek Perl ile CGI Programlama Neden "PHP / JSP / ASP ile CGI Programlama".

CGI çok verimli değil. Web sunucularından programlarla konuşmak için daha iyi yöntemler PHP ile aynı zamanda ortaya çıktı. JSP ve ASP , programlarla konuşmak için farklı yöntemlerdir.

C'de CGI Programlama bu beni çok karıştırıyor. C? Ciddi anlamda??

Bu bir programlama dilidir, neden olmasın?

Ne zaman derleyeceğim?

  1. Kod yazma
  2. derleme
  3. Erişim URL'si
  4. Webserver programı çalıştırıyor

Program nasıl yürütülür (çünkü bir makine kodu olacağından, bağımsız bir işlem olarak yürütülmesi gerekir).

Bağımsız bir süreç olarak yürütmek zorunda değildir (C'de Apache modülleri yazabilirsiniz), ancak CGI'nın tüm konsepti harici bir süreç başlatmasıdır.

Web sunucusuyla nasıl iletişim kurar? IPC?

STDIN / STDOUT ve ortam değişkenleri - CGI belirtiminde tanımlandığı gibi.

ve soket programlama kullanarak tüm sunucularla (benim örneğim MATLAB ve MySQL) arayüz?

İstediğiniz ve desteklenen yöntemleri kullanın.

CGI'nın amortismana tabi olduğunu söylüyorlar. Artık kullanımda değil. Öyle mi?

CGI verimsiz, yavaş ve basittir. Nadiren kullanılır, kullanıldığında basit olmasıdır. Performans çok önemli değilse, sadelik çok değerlidir.

En son güncellemesi nedir?

1.1


1. Kod yazma 2. Derleme 3. Erişim URL'si 4. Web sunucusu programı çalıştırır. || Ancak web sunucusu derlenmiş yürütülebilir programı nereye yerleştirdiğinizi nasıl biliyor ? Hangi yürütülebilir programın (aralarında) çalıştırılacağını nasıl biliyor?
Pacerier

@Pacerier - Statik bir dosya istendiğinde istemciye hangi statik dosyanın gönderileceğini bildiği gibi.
Quentin

41

CGI, bir web sunucusu (HTTP sunucusu) ile belirli bir isteği işleyecek bir tür yürütülebilir program arasındaki arabirim belirtimidir.

Bu isteğin belirli özelliklerinin söz konusu programın ortamına nasıl iletilmesi gerektiğini ve programın yanıtı sunucuya nasıl iletmesi gerektiğini ve sunucunun orijinal HTTP isteğine geçerli bir yanıt oluşturmak için yanıtı nasıl 'tamamlaması' gerektiğini açıklar.

Bir süre CGI bir IETF İnternet Taslağı idi ve bu nedenle bir son kullanma tarihi vardı. Hiçbir güncelleme ile sona erdi, bu yüzden hiçbir CGI 'standart' yoktu. Artık bilgi amaçlı bir RFC'dir, ancak bu tür belgeler yaygın bir uygulamadır ve bir standart değildir. rfc3875.txt , rfc3875.html

CGI arabirimi uygulayan programlar, hedef makinede çalıştırılabilen herhangi bir dilde yazılabilir. Ortam değişkenlerine ve genellikle standart girdiye erişebilmeleri ve çıktılarını standart çıktıda üretebilmeleri gerekir .

C gibi derlenmiş diller yaygın olarak perl gibi kodlama dilleri olarak kullanılır ve genellikle CGI ortamına erişimi kolaylaştırmak için kütüphaneler kullanır.

CGI'nin en büyük dezavantajlarından biri, her talep için yeni bir programın ortaya çıkmasıdır, böylece talepler arasındaki durumu korumak önemli bir performans sorunu olabilir. Durum çerezlerde ele alınabilir veya bir URL'de kodlanabilir, ancak büyük olursa, başka bir yerde saklanmalı ve kodlanmış URL bilgilerinden veya bir çerezden anahtarlanmalıdır. Her CGI çağrısının depolanan durumu bir mağazadan bir yerde yeniden yüklemesi gerekir.

Bu nedenle ve isteklere ve oturumlara çok basit bir arayüz için, web sunucuları ve uygulamaları arasındaki daha iyi entegre ortamlar çok daha popülerdir. Apache ile modern bir php uygulaması gibi ortamlar, hedef dili web sunucusuyla çok daha iyi bütünleştirir ve http isteklerini etkili bir şekilde sunmak için gereken istek ve oturum nesnelerine erişim sağlar. HTTP isteklerini işlemek için 'programlar' yazmak için çok daha kolay ve daha zengin bir yol sunarlar.

Bir CGI betiği yazıp yazmamanız daha çok yoruma bağlıdır. Kesinlikle bir iş yaptı ama komut dosyası ve sunucu arasındaki arabirimin kesinlikle bir CGI arayüzü olmadığı bir modül olarak php çalıştırmak çok daha normaldir.


1
Zahmet. Bunu başka cevap olmadığında yazmaya başladım, ama yol çağrıldı. Şimdi listede yaklaşık 8 numara var. Şimdi silme isteğim yok, geri dönüp daha sonra sileceğim.
CB Bailey

6
Hey .. Lütfen silmeyin. Bazı şeyleri daha açık bir şekilde söylüyor. Yararlı buldum. Bazıları da bulabilir. :)
pençeler

1
Tamam, biraz bırakacağım. Yine de, birisinin 'daha iyi' bir pasajı daha tam cevaplardan birine entegre etmesi iyi olur. O zaman daha kesin bir cevap alabiliriz.
CB Bailey

18

CGI, RFC 3875'te belirtilmiştir , ancak bu, orijinal NCSA belgesinin daha sonraki bir "resmi" kodlamasıdır . Temel olarak, CGI, bir HTTP sunucusuyla ilgili verileri bir web sunucusundan bir programa, herhangi bir programda, herhangi bir dilde aktarmak için bir protokol tanımlar. Spesifikasyon yazıldığı sırada (1993), çoğu web sunucusu sadece statik sayfalar içeriyordu, "web uygulamaları" nadir ve yeni bir şeydi, bu yüzden onları bir "normal" statik içerikten uzak tutmak doğal görünüyordu. cgi-bindizini statik içerikten ayrı tutun ve bitmesini sağlayın .cgi.

Şu anda, burada PHP gibi özel bir "web programlama dili" yoktu ve C baskın taşınabilir programlama diliydi - bu yüzden birçok kişi CGI senaryolarını C'ye yazdı. ve CGI bir süre için Perl ile neredeyse eşanlamlı hale geldi. Sonra Java Servlets, PHP ve diğerleri geldi ve Perl'in pazar payının büyük bir kısmını devraldı.


PHP neden "özel bir web programlama dili" dir? PHP genel amaçlı bir dildir ve insanlar bu dili UI uygulamaları için de kullanmaktadır.
Pacerier

@Pacerier: Web sayfaları oluşturmak için bir programlama dili olacak şekilde tasarlandı ve kullanıcılarının% 99,9'u bunu kullanıyor. Hatta onun içinde var adı . Başka bir şey iddia etmek saçma bir anlamsızlıktır. UI uygulamaları, bilimsel bilgi işlem veya gömülü programlama için kullanıyorsanız, iyi, mutlu olun, kimse izin verilmediğini söylemiyor.
Michael Borgwardt

13

Wikipedia'da CGI'ya bir göz atın . CGI, web sunucusu ile harici bir program veya girdiyi işleyen ve tarayıcıya gönderilen çıktı üreten bir komut dosyası arasındaki bir protokoldür .

CGI, web sunucusu ve bir programın iletişim kurması için basit bir yoldur, başka bir şey değil, daha az bir şey. Burada sunucu ağ bağlantısını ve HTTP protokolünü yönetir ve program girişi işler ve tarayıcıya gönderilen çıktıyı üretir. CGI betiği temel olarak web sunucusu tarafından çalıştırılabilen ve CGI protokolünü izleyen herhangi bir program olabilir. Bu nedenle, örneğin C'de bir CGI programı uygulanabilir. Ancak bu son derece nadirdir, çünkü C bu göreve çok uygun değildir.

/cgi-bin/*.cgiinsanların CGI betiğini yazdığı basit bir yoldur. Web sunucusu genellikle varsayılan olarak bu yoldan CGI komut dosyaları almak üzere yapılandırılır.

CGI betiği PHP'de de uygulanabilir, ancak tüm PHP programları CGI betiği değildir. Web sunucusu PHP yorumlayıcısını (örneğin Apache'de mod_php) gömdüyse, CGI aşaması web sunucusu ile yorumlayıcı arasındaki daha verimli doğrudan protokol tarafından atlanır.

Bir CGI betiği uygulayıp uygulamadığınız, betiğinizin web sunucusu tarafından nasıl yürütüldüğüne bağlıdır.


12

CGI aslında isteği web sunucusu ile yapılandırılmış herhangi bir tercümana iletir - Bu Perl, Python, PHP, Ruby, C hemen hemen her şey olabilir. Perl gün içinde en yaygın olanıydı, bu yüzden sık sık CGI ile ilgili olarak görüyorsunuz.

CGI ölmedi. Aslında çoğu büyük hosting şirketi mod_php yerine PHP'yi CGI olarak çalıştırır, çünkü mod_php'den daha yavaşken kullanıcı düzeyinde yapılandırma ve başka şeyler sunar. Ruby ve Python da tipik olarak CGI olarak çalıştırılır. Burada önemli bir fark, bir sunucu modülünün gerçek sunucu yazılımının bir parçası olarak çalışmasıdır - burada CGI'da olduğu gibi tamamen sunucunun dışındadır Sunucu sadece dış yorumlayıcıya veri aktarmayı ve almayı belirlemek için CGI modülünü kullanır.


2
Değil aşağı oy değil ama çoğu python web yüklemeleri nerede mod_wsgi veya mod_python gördüm.
ChristopheD

Çoğu insan CGI betiği terimini bu şekilde kullanır, ancak terimin anlamı bu değildir.
reinierpost

Tercüman diyorsunuz ama C nadiren yorumlanıyor ve C derlenmiş programlar gibi derlenmiş programlar CGI için kullanılabilir.
user34660

11

CGI, bir istekle başa çıkmak için web sunucusu tarafından harici bir programın çağrıldığı bir mekanizmadır; ortam değişkenleri ve standart girdi, istek verilerini programa beslemek için kullanılır. Harici programın yazıldığı kesin dil önemli değildir, ancak bazı dillerde CGI programlarının diğerlerine göre yazılması daha kolaydır.

CGI betikleri yürütme izinlerine ihtiyaç duyduğundan, httpd varsayılan olarak cgi-bindizindeki CGI programlarının yalnızca güvenlik amaçlı (muhtemelen yanlış yönlendirilmiş) çalıştırılmasına izin verir .

Çoğu PHP betiği web sunucusu işlemiyle çalışır mod_php. Bu CGI değil.

CGI yavaştır çünkü program (ve ilgili tercüman) istek başına başlatılmalıdır. Modern alternatifler mod_php tarafından kullanılan gömülü yürütme ve FastCGI tarafından kullanılan uzun süren işlemlerdir. Belirli bir dilin bu mekanizmaları uygulamak için kendi yolu olabilir, bu nedenle CGI'ya başvurmadan önce sormayı unutmayın.


@Ignacio Vazquez-Abrams: CGI Arayüzü yeni bir Süreç oluşturuyorsa, her seferinde CGI Kaynağı için CGI ve mod_php arasındaki yürütme farkından daha fazla bir istek alır ??????? CGI ve mod_php aynı mı ???? veya mod_php altında olmayan CGI Arayüzü altında çalışan PHP komut dosyaları yazmak mümkün mü ???
hardik

@Hardik: mod_php, kendi işlemlerinden sorumlu olan HTTPd'nin bir parçası olarak çalışır.
Ignacio Vazquez-Abrams

bu 'harici program' nedir? php php-fpm ile çalıştırırsam bir tercüman mı?
slier

@slier: Web sunucusu olmayan rastgele bir program.
Ignacio Vazquez-Abrams

@ IgnacioVazquez-Abrams böylece interpreterphp-fpm ile php çalışan bir if olduğunu varsayalım güvenli midir?
slier

7

Belki CGI olmadığını bilmek isteyebilirsiniz ve cevap web sunucunuz için bir MODÜL (Apache çalıştırıyorsanız varsayalım). VE BÜYÜK FARKLIDIR, çünkü CGI ihtiyaçları ve harici program, iş parçacığı, bir PERL, PHP, C uygulama sunucusunu başlatmak için ne olursa olsun, bir MODÜL olarak çalıştırdığınızda bu program web sunucusu (apache) kendisidir.

Tüm bunlar nedeniyle, devreye giren birçok performans, güvenlik, taşınabilirlik sorunları var. Ama önce CGI'nin ne olmadığını bilmek, ne olduğunu anlamak güzel.


7

Gerçek hayattan bir örnek: bir web sitesinde gösterilmesi gereken karmaşık bir veritabanı. Veritabanı 1986 (!) Civarında bir yerde tasarlandığından, disk alanından tasarruf etmek için birçok veri farklı şekillerde paketlenmiştir.

Geliştirme devam ettikçe, geliştiriciler artık yalnızca SQL'deki karmaşık veri isteklerini çözemedi, örneğin sıralama algoritmaları olağandışıydı.

Üç mantıklı çözüm vardır:

  1. hızlı ve kirli: gönderilmemiş verileri PHP'ye gönderin, orada sıralayın. Açıkçası çok pahalı bir çözüm, çünkü sayfa her çağrıldığında bu tekrarlanacaktır.
  2. veritabanı motoruna bir eklenti yazın - ancak yönetici, sunucularında yabancı kodun çalışmasına izin vermeye hazır değildi veya
  3. bir programdaki verileri (C, Perl, vb.) işleyebilir ve HTML çıktısı alabilirsiniz. Programın kendisi / cgi-bin'e gider ve web sunucusu (örn. Apache) tarafından PHP ile değil doğrudan çağrılır.

CGI, komut dosyanızı Çözüm # 3'te çalıştırır ve efekti tarayıcıya verir. Derlenmiş programın hızına, SQL'den daha iyi bir dilin esnekliğine ve SQL sunucusuna eklenti yazmaya gerek yoktur. (Yine, bu SQL ve C'ye özgü bir örnektir)


1
Benim için en iyi cevap, anladım.
Daniel Katz

7

CGI betiği bir konsol / kabuk programıdır. Windows'ta "Komut İstemi" penceresi kullandığınızda, konsol programlarını çalıştırırsınız. Bir web sunucusu bir CGI betiği yürüttüğünde, ortam değişkenleri veya "standart girdi" kullanarak konsol / kabuk programına girdi sağlar. Standart giriş, bir konsol / kabuk programına veri yazmak gibidir; CGI betiği söz konusu olduğunda, web sunucusu yazmayı yapar. CGI betiği "standart çıktıya" veri yazar ve bu çıktı istemciye (web tarayıcısı) bir HTML sayfası olarak gönderilir. Standart çıktı, web sunucusu tarafından okunup gönderilmesi dışında bir konsol / kabuk programında gördüğünüz çıktı gibidir.

Bir CGI betiği tarayıcıdan yürütülebilir. URI genellikle CGI betiğine sağlanan bir sorgu dizesi içerir. Yöntem "get" ise, sorgu dizesi CGI Script'e QUERY_STRING adlı bir ortam değişkeninde sağlanır. Yöntem "post" ise, sorgu dizesi CGI Komut Dosyasına standart girdi kullanılarak sağlanır (CGI Komut Dosyası, sorgu dizesini standart girdiden okur).

CGI betiklerinin erken kullanımı formları işlemekti. HTML'nin başlangıcında, HTML formlarında genellikle "eylem" özelliği ve "gönder" düğmesi olarak adlandırılan bir düğme bulunur. Gönder düğmesine basıldığında, "action" özelliğinde belirtilen URI, formdaki veriler sorgu dizesi olarak gönderilecek şekilde sunucuya gönderilir. "İşlem" bir CGI betiği belirtirse, CGI betiği yürütülür ve ardından bir HTML sayfası oluşturur.

RFC 3875 "Ortak Ağ Geçidi Arabirimi (CGI)", ortam değişkenlerine "C kütüphanesi rutin getenv () veya değişken çevre tarafından erişildiğini söyleyerek" CGI'yı kısmen tanımlamaktadır.

C / C ++ kullanarak bir CGI betiği geliştiriyorsanız ve bunu yapmak için Microsoft Visual Studio kullanıyorsanız, bir konsol programı geliştirirsiniz.


"CGI betiği" geniş bir terimdir ve yürütülebilir dosyaları da içerebilir.
71GA

6

CGI, yazdığınız ve Web Sunucusu sitesine kaydettiğiniz bir programdır (veya bir Web API'sidir). CGI bir dosyadır.

Bu dosya Web Sunucusunda oturur ve bekler. İstemci tarayıcısı CGI dosyanızı yürütmek için Web Sunucusuna bir istek gönderdiğinde, Web Sunucusu CGI dosyanızı sunucu sitesinde çalıştırır. Bu CGI programının girişleri, varsa, istemci tarayıcısındandır. Bu CGI programının çıktıları tarayıcıya gönderilir.

CGI programı yazmak için hangi dili kullanıyorsunuz? Diğer yayınlar zaten c, java, php, perl vb.


4

CGI'nın arkasındaki fikir, bir programın / betiğin (Perl veya hatta C olsun) giriş STDIN(istek verileri) yoluyla alınması ve STDOUT(echo, printfdeyimler) üzerinden veri çıkışı olmasıdır .

Çoğu PHP betiğinin nitelendirilmemesinin nedeni , PHP Apache modülü altında çalıştırılmasıdır .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.