Common Gateway Interface (CGI) คืออะไร


745

CGI เป็น Common Gateway Interface ตามชื่อบอกว่ามันเป็นอินเตอร์เฟส "ทั่วไป" ของเกตเวย์สำหรับทุกสิ่ง มันช่างไร้เดียงสาและไร้เดียงสาจากชื่อ ฉันรู้สึกว่าฉันเข้าใจสิ่งนี้และฉันรู้สึกอย่างนี้ทุกครั้งที่ฉันพบคำนี้ แต่ตรงไปตรงมาฉันไม่ได้ ฉันยังสับสนอยู่

ฉันเป็นโปรแกรมเมอร์ PHP ที่มีประสบการณ์การพัฒนาเว็บไซต์

ผู้ใช้ (ไคลเอนต์) ร้องขอสำหรับหน้า ---> webserver (-> ล่าม PHP แบบฝัง) ----> สคริปต์ฝั่งเซิร์ฟเวอร์ (PHP) สคริปต์ ---> เซิร์ฟเวอร์ MySQL

ตอนนี้สมมติว่าสคริปต์ PHP ของฉันสามารถดึงผลลัพธ์จากเซิร์ฟเวอร์ MySQL & เซิร์ฟเวอร์ MATLAB และเซิร์ฟเวอร์อื่น ๆ

ดังนั้นตอนนี้ PHP Script คือ CGI เพราะส่วนต่อประสานระหว่างเว็บเซิร์ฟเวอร์และเซิร์ฟเวอร์อื่นทั้งหมดหรือไม่ ฉันไม่รู้ บางครั้งพวกเขาเรียก CGI เทคโนโลยีและเวลาอื่น ๆ ที่พวกเขาเรียกโปรแกรม CGI หรือเซิร์ฟเวอร์อื่น ๆ

  • CGI คืออะไร

  • เรื่องใหญ่/cgi-bin/*.cgiอะไรกับ? เกิดอะไรขึ้นกับสิ่งนี้? ฉันไม่รู้ว่าcgi-binไดเรกทอรีนี้อยู่บนเซิร์ฟเวอร์อะไร ฉันไม่รู้ว่าทำไมพวกเขาถึงมีนามสกุล * .cgi

  • ทำไม Perl ถึงเข้ามาเสมอ CGI & Perl (ภาษา) ฉันก็ไม่รู้เหมือนกันว่าเกิดอะไรขึ้นกับสองสิ่งนี้ เกือบตลอดเวลาที่ฉันได้ยินทั้งสองรวมกัน "CGI & Perl" หนังสือเล่มนี้เป็นอีกหนึ่งตัวอย่างที่ดีCGI การเขียนโปรแกรมด้วย Perl ทำไมไม่ "การเขียนโปรแกรม CGI ด้วย PHP / JSP / ASP" ฉันไม่เคยเห็นสิ่งต่าง ๆ เช่นนี้

  • การเขียนโปรแกรม CGI ใน Cทำให้ฉันสับสนมาก " ใน C " อย่างจริงจัง?? ฉันไม่รู้จะพูดยังไงดี ฉันแค่สับสน " ใน C " สิ่งนี้เปลี่ยนแปลงทุกสิ่ง โปรแกรมจะต้องรวบรวมและดำเนินการ ทั้งหมดนี้เปลี่ยนมุมมองของฉันในการเขียนโปรแกรมเว็บ ฉันจะรวบรวมเมื่อไหร่ โปรแกรมได้รับการดำเนินการอย่างไร (เพราะจะเป็นรหัสเครื่องดังนั้นจึงต้องดำเนินการตามกระบวนการอิสระ) มันสื่อสารกับเว็บเซิร์ฟเวอร์ได้อย่างไร IPC? และการเชื่อมต่อกับเซิร์ฟเวอร์ทั้งหมด (ในตัวอย่างของฉัน MATLAB & MySQL) โดยใช้โปรแกรมซ็อกเก็ต? ฉันหลงทาง!!

  • มีคนบอกว่า CGI เลิกใช้แล้วและไม่ได้ใช้งานอีกต่อไป เป็นอย่างนั้นเหรอ? อัพเดตล่าสุดคืออะไร

ครั้งหนึ่งฉันเจอสถานการณ์ที่ฉันต้องให้สิทธิ์การเข้าถึง HTTP PUT กับเว็บเซิร์ฟเวอร์ (Apache HTTPD) มันกลับมานาน ดังนั้นเท่าที่ฉันจำได้ว่านี่คือสิ่งที่ฉันทำ:

  1. แก้ไขไฟล์การกำหนดค่าของ Apache HTTPD เพื่อบอกให้เว็บเซิร์ฟเวอร์ส่งการร้องขอ HTTP PUT ทั้งหมดไปที่บางส่วน put.php(ฉันต้องเขียนสคริปต์ PHP นี้)

  2. ใช้ put.php เพื่อจัดการคำขอ (บันทึกไฟล์ไปยังตำแหน่งที่กล่าวถึง)

มีคนพูดว่าฉันเขียน CGI Script อย่างจริงจังฉันไม่มีเงื่อนงำสิ่งที่พวกเขากำลังพูดถึง

  • ฉันเขียน CGI Script จริงๆเหรอ?

ฉันหวังว่าคุณจะเข้าใจว่าความสับสนของฉันคืออะไร (เพราะฉันเองไม่รู้ว่าฉันสับสนอยู่ที่ไหน) ฉันขอให้พวกคุณรักษาคำตอบของคุณให้ง่ายที่สุด ฉันไม่เข้าใจคำศัพท์ทางเทคนิคแฟนซีใด ๆ อย่างน้อยก็ไม่ได้ในกรณีนี้

แก้ไข:

ฉันพบบทเรียนที่น่าทึ่งนี้"การเขียนโปรแกรม CGI ง่ายมาก!" - CGI Tutorialซึ่งอธิบายแนวคิดในวิธีที่ง่ายที่สุด หลังจากอ่านบทความนี้คุณอาจต้องการอ่านการเริ่มต้นใช้งานการเขียนโปรแกรม CGI ใน Cเพื่อเสริมความเข้าใจของคุณด้วยตัวอย่างโค้ดจริง ฉันได้เพิ่มลิงก์เหล่านี้ไปยังบทช่วยสอนนี้ในบทความของ Wikipedia: http://en.wikipedia.org/wiki/Common_Gateway_Interface


9
ฉันเห็น CGI เขียนแล้วใน Cobol ไม่มีการซ่อน!
Luc M

@Luc M. สนใจ CGI ใดที่คุณหมายถึง (ระบุว่ามี raycaster ใน LINQ ... )
Joe

15
@claws: ผู้คนส่วนใหญ่เป็นโรงเรียนเก่าจะเรียกรหัสใด ๆ โดยไม่คำนึงถึงวิธีการดำเนินการที่เกิดขึ้นจริงดำเนินการผ่าน CGI ของเว็บเซิร์ฟเวอร์ สิ่งที่คุณเขียนจริง ๆ ก็คือสคริปต์ PHP ซึ่งอาจจะถูกเรียกใช้หรือไม่ผ่านโปรโตคอล CGI ความสับสนของคุณดูเหมือนจะเกิดจากความหมายที่คลุมเครือของ CGI ซึ่งเป็นโปรโตคอลในการเรียกใช้โค้ดและรหัสที่ถูกเรียกใช้ผ่านโปรโตคอล (ซึ่งต่อมาได้รับการทั่วไปให้หมายถึงโค้ดที่ทำงานบนเว็บใด ๆ )
Vinko Vrsalovic

1
ย้อนกลับไปในช่วงกลางยุค 90 ฉันเขียนสคริป CGI สองตัวใน HyperCard
Neal Davis

@ Joe ฉันไม่เคยได้รับการแจ้งเตือนและวันนี้อ่านโพสต์นี้อีกครั้งฉันเห็นคำถามของคุณ CGI ของถูกเขียนบน OpenVMS เป็น executables อิสระ (ไม่มีกรอบที่เกี่ยวข้องหรือบุคคลที่สามสมัคร ... )
Luc M

คำตอบ:


427

CGI เป็นอินเทอร์เฟซที่บอกให้เว็บเซิร์ฟเวอร์ทราบวิธีส่งผ่านข้อมูลไปยังและจากแอปพลิเคชัน โดยเฉพาะอย่างยิ่งอธิบายถึงวิธีที่ข้อมูลการร้องขอถูกส่งผ่านในตัวแปรสภาพแวดล้อม (เช่นประเภทคำขอ, ที่อยู่ IP ระยะไกล), วิธีที่เนื้อความคำขอถูกส่งผ่านทางอินพุตมาตรฐานและวิธีการตอบสนองที่ส่งผ่านทางเอาต์พุตมาตรฐาน คุณสามารถอ้างถึงข้อกำหนด CGIสำหรับรายละเอียด

วิธีใช้ภาพของคุณ:

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

ส่วนใหญ่ถ้าไม่ใช่ทั้งหมด webservers สามารถกำหนดค่าให้เรียกใช้งานโปรแกรมเป็น 'CGI' ซึ่งหมายความว่าเว็บเซิร์ฟเวอร์เมื่อได้รับการร้องขอจะส่งต่อข้อมูลไปยังโปรแกรมเฉพาะการตั้งค่าตัวแปรสภาพแวดล้อมบางอย่างและ marshalling พารามิเตอร์ผ่านอินพุตมาตรฐานและเอาต์พุตมาตรฐานเพื่อให้โปรแกรมสามารถรู้ว่าที่ไหนและสิ่งที่มองหา

ประโยชน์หลักคือคุณสามารถเรียกใช้โค้ดที่รันได้จากเว็บใด ๆ เนื่องจากทั้งเว็บเซิร์ฟเวอร์และโปรแกรมรู้ว่า CGI ทำงานอย่างไร นั่นเป็นเหตุผลที่คุณสามารถเขียนโปรแกรมเว็บใน C หรือ Bash ด้วยเว็บเซิร์ฟเวอร์ที่เปิดใช้งาน CGI ปกติ นั่นและสภาพแวดล้อมการเขียนโปรแกรมส่วนใหญ่สามารถใช้อินพุตมาตรฐานเอาต์พุตมาตรฐานและตัวแปรสภาพแวดล้อมได้อย่างง่ายดาย

ในกรณีของคุณคุณมักจะใช้อีกคนหนึ่งโดยเฉพาะสำหรับ PHP หมายถึงการสื่อสารระหว่างสคริปต์และเว็บเซิร์ฟเวอร์ของคุณสิ่งนี้ตามที่คุณพูดถึงในคำถามของคุณก็คือล่ามฝังตัวที่เรียกว่า mod_php

ดังนั้นตอบคำถามของคุณ:

CGI คืออะไร

ดูด้านบน.

เรื่องใหญ่ของ /cgi-bin/*.cgi คืออะไร? เกิดอะไรขึ้นกับสิ่งนี้? ฉันไม่ทราบว่าไดเรกทอรี cgi-bin นี้คืออะไรสำหรับเซิร์ฟเวอร์ ฉันไม่รู้ว่าทำไมพวกเขาถึงมีนามสกุล * .cgi

นั่นเป็นสถานที่ดั้งเดิมสำหรับโปรแกรม cgi เว็บเซอร์หลายแห่งมาพร้อมกับไดเรกทอรีนี้ก่อนกำหนดค่าให้รันไบนารีทั้งหมดที่มีในโปรแกรม CGI นามสกุล. cgi แสดงถึงไฟล์เรียกทำงานที่คาดว่าจะทำงานผ่าน CGI

ทำไม Perl ถึงเข้ามาเสมอ CGI & Perl (ภาษา) ฉันไม่รู้ด้วยซ้ำกับสองสิ่งนี้ เกือบตลอดเวลาที่ฉันได้ยินทั้งสองรวมกัน "CGI & Perl" หนังสือเล่มนี้เป็นอีกตัวอย่างที่ยอดเยี่ยมในการเขียนโปรแกรม CGI ด้วย Perl ทำไมไม่ใช้ "การเขียนโปรแกรม CGI ด้วย PHP / JSP / ASP" ฉันไม่เคยเห็นสิ่งต่าง ๆ เช่นนี้

เนื่องจาก Perl นั้นโบราณ (เก่ากว่า PHP, JSP และ ASP ซึ่งทุกอย่างเกิดขึ้นเมื่อ CGI นั้นเก่าแล้ว Perl ก็มีอยู่เมื่อ CGI ใหม่) และเป็นที่รู้จักกันดีว่าเป็นภาษาที่ดีมากในการให้บริการหน้าเว็บแบบไดนามิกผ่าน CGI ปัจจุบันมีทางเลือกอื่น ๆ ที่จะเรียกใช้ Perl ในเว็บเซิร์ฟเวอร์ส่วนใหญ่mod_perl

การเขียนโปรแกรม CGI ใน C ทำให้ฉันสับสนมาก ใน C ?? อย่างจริงจัง?? ฉันไม่รู้จะพูดยังไงดี ฉัน "ฉันเพิ่งสับสน." ใน C "นี้จะเปลี่ยนแปลงทุกอย่างโปรแกรมจะต้องรวบรวมและดำเนินการนี้ทั้งหมดเปลี่ยนมุมมองของการเขียนโปรแกรมเว็บฉันจะรวบรวมเมื่อไหร่โปรแกรมจะถูกดำเนินการได้อย่างไร (เพราะมันจะเป็น รหัสเครื่องจึงต้องดำเนินการเป็นกระบวนการอิสระ) มันสื่อสารกับเว็บเซิร์ฟเวอร์ได้อย่างไร IPC และเชื่อมต่อกับเซิร์ฟเวอร์ทั้งหมด (ในตัวอย่างของฉัน MATLAB และ MySQL) โดยใช้การเขียนโปรแกรมซ็อกเก็ตฉันหายไป !!

คุณคอมไพล์ไฟล์ที่เรียกทำงานได้ครั้งเดียวเว็บเซิร์ฟเวอร์จะเรียกใช้งานโปรแกรมและส่งผ่านข้อมูลในคำขอไปยังโปรแกรมและแสดงผลการตอบกลับที่ได้รับ CGI ระบุว่าจะมีการเปิดตัวอินสแตนซ์โปรแกรมหนึ่งรายการต่อการร้องขอแต่ละครั้ง นี่คือเหตุผลที่ CGI ไม่มีประสิทธิภาพและล้าสมัยในปัจจุบัน

พวกเขาบอกว่า CGI ถูกคัดค้าน ไม่มีการใช้งานอีกต่อไป มันเป็นอย่างนั้นเหรอ? อัพเดตล่าสุดคืออะไร

ยังคงใช้ CGI เมื่อประสิทธิภาพไม่ได้เป็นสิ่งสำคัญและต้องการวิธีการเรียกใช้งานโค้ดอย่างง่าย มันไม่มีประสิทธิภาพสำหรับเหตุผลที่ระบุไว้ก่อนหน้านี้และมีวิธีการที่ทันสมัยกว่าของการดำเนินการโปรแกรมใด ๆ ในสภาพแวดล้อมของเว็บ ขณะที่มีชื่อเสียงมากที่สุดคือFastCGI


24
โดยเฉพาะอย่างยิ่งมันอธิบายถึงวิธีการที่ข้อมูลการร้องขอถูกส่งผ่านในตัวแปรสภาพแวดล้อม (เช่นประเภทคำขอ, ที่อยู่ IP ระยะไกล), วิธีการที่ร่างกาย reqeust จะถูกส่งผ่านทางอินพุตมาตรฐานและวิธีการตอบสนองจะถูกส่งผ่านออกมาตรฐาน คุณสามารถอ้างถึงข้อกำหนด CGI ( hoohoo.ncsa.illinois.edu/cgi ) เพื่อดูรายละเอียด
DAF

3
สมมติว่าServer side Programในรูปของคุณเป็นสคริปต์ PHP ของฉัน ดังนั้นฉันไม่เคยเขียนโปรแกรม CGI เลยใช่ไหม เพราะฉันไม่เคยเขียนอะไรที่อยู่ระหว่างเว็บเซิร์ฟเวอร์กับสคริปต์ PHP ของฉัน ประณาม!! นี่ฆ่าฉัน
กรงเล็บ

4
PHP ยังคงยึดตามโปรโตคอล CGI เป็นอย่างมากเนื้อหาส่วนใหญ่ของ $ _SERVER นั้นตรงกับข้อมูลจำเพาะของ CGI และ "การเขียนโปรแกรม CGI" มักจะหมายถึงโปรแกรมที่ดำเนินการตามคำขอไม่ใช่การใช้งานโปรโตคอลเอง หากคุณอธิบายสิ่งที่คุณทำกับ PHP ให้กับผู้บุกเบิกการเขียนโปรแกรมเว็บในยุค 1993 เขาจะถือว่ามันเป็นรูปแบบการเขียนโปรแกรม CGI ขั้นสูง
Michael Borgwardt

5
@Michael: แต่เมื่อใช้งานผ่าน mod_php ไม่ใช่ CGI เลย (แม้ว่าจะเป็นไปตามนั้นก็ตาม) และฉันยอมรับว่า CGI หมายถึงทั้งโปรโตคอลและสคริปต์ที่ดำเนินการผ่านมัน
Vinko Vrsalovic

2
@Vinko Vrsalovic: ถ้า CGI เป็นอินเทอร์เฟซสำหรับ Perl, C หรือภาษาอื่น ๆ ที่จะทำงานในเว็บเซิร์ฟเวอร์กว่า PHP ใช้อินเตอร์เฟสใดในการทำงานใน Apache ??????????????????????????????????????????????????????????????????????????? และ PHP นั้นมาตามข้อกำหนด CGI หรือไม่?
hardik

63

CGI คืออะไร

A หมายถึงเว็บเซิร์ฟเวอร์เพื่อรับข้อมูลจากโปรแกรม (ตัวอย่างเช่นไฟล์)

เรื่องใหญ่ของ /cgi-bin/*.cgi คืออะไร?

ไม่ใช่เรื่องใหญ่. มันเป็นเพียงแค่การประชุม

ฉันไม่ทราบว่าไดเรกทอรี cgi-bin นี้คืออะไรสำหรับเซิร์ฟเวอร์ ฉันไม่รู้ว่าทำไมพวกเขาถึงมีนามสกุล * .cgi

เซิร์ฟเวอร์ต้องรู้ว่าจะทำอย่างไรกับไฟล์ (เช่นถือว่าเป็นโปรแกรมที่จะดำเนินการแทนสิ่งที่จะให้บริการได้อย่างง่ายดาย) มีนามสกุล. html บอกให้ใช้ประเภทข้อความ / html มีนามสกุล. cgi บอกให้เรียกใช้เป็นโปรแกรม

การเก็บไฟล์เอ็กซีคิ้วท์ในไดเรกทอรีที่แยกต่างหากจะช่วยเพิ่มการป้องกันไฟล์เอ็กซีคิวต์ที่ไม่ถูกต้องและ / หรือให้บริการโปรแกรม CGI เป็นข้อมูลดิบในกรณีที่เซิร์ฟเวอร์ได้รับการกำหนดค่าผิดพลาด

ทำไม Perl ถึงเข้ามาเสมอ

มันไม่ได้ Perl นั้นใหญ่และเป็นที่นิยมในเวลาเดียวกันกับ CGI

ฉันไม่ได้ใช้ Perl CGI มาหลายปีแล้ว ฉันใช้ mod_perl มานานและมีแนวโน้มที่จะใช้ PSGI / Plack กับ FastCGI ทุกวันนี้

หนังสือเล่มนี้เป็นอีกตัวอย่างที่ยอดเยี่ยมในการเขียนโปรแกรม CGI ด้วย Perl ทำไมไม่ลองใช้ "CGI Programming with PHP / JSP / ASP"

CGI ไม่ค่อยมีประสิทธิภาพ วิธีการที่ดีกว่าสำหรับการพูดคุยกับโปรแกรมจากเว็บเซิร์ฟเวอร์มาในเวลาเดียวกันกับ PHP JSP และ ASP เป็นวิธีการที่แตกต่างกันสำหรับการพูดคุยกับโปรแกรม

การเขียนโปรแกรม CGI ใน C ทำให้ฉันสับสนมาก ใน C ?? อย่างจริงจัง??

มันเป็นภาษาการเขียนโปรแกรมทำไมไม่?

ฉันจะรวบรวมเมื่อไหร่

  1. เขียนรหัส
  2. รวบรวม
  3. เข้าถึง URL
  4. เว็บเซิร์ฟเวอร์ใช้งานโปรแกรม

โปรแกรมได้รับการดำเนินการอย่างไร (เพราะจะเป็นรหัสเครื่องดังนั้นจึงต้องดำเนินการตามกระบวนการอิสระ)

ไม่จำเป็นต้องดำเนินการเป็นกระบวนการอิสระ (คุณสามารถเขียนโมดูล Apache ใน C) แต่แนวคิดทั้งหมดของ CGI คือมันเปิดตัวกระบวนการภายนอก

มันสื่อสารกับเว็บเซิร์ฟเวอร์ได้อย่างไร IPC?

STDIN / STDOUT และตัวแปรสภาพแวดล้อม - ตามที่กำหนดไว้ในข้อกำหนด CGI

และการเชื่อมต่อกับเซิร์ฟเวอร์ทั้งหมด (ในตัวอย่างของฉัน MATLAB & MySQL) โดยใช้โปรแกรมซ็อกเก็ต?

ใช้วิธีการใดก็ได้ที่คุณชอบและได้รับการสนับสนุน

พวกเขาบอกว่า CGI คิดค่าเสื่อมราคา ไม่มีการใช้งานอีกต่อไป มันเป็นอย่างนั้นเหรอ?

CGI ไม่มีประสิทธิภาพช้าและง่าย มันไม่ค่อยได้ใช้เมื่อมันถูกใช้มันเป็นเพราะมันง่าย หากประสิทธิภาพไม่ใช่เรื่องใหญ่ความเรียบง่ายก็คุ้มค่ามาก

อัพเดตล่าสุดคืออะไร

1.1


1. เขียนรหัส 2. คอมไพล์ 3. เข้าถึง URL 4. เว็บเซิร์ฟเวอร์รันโปรแกรม || แต่วิธีการที่ไม่เว็บเซิร์ฟเวอร์รู้ที่คุณวางโปรแกรมปฏิบัติการรวบรวม? มันจะรู้ได้อย่างไรว่าโปรแกรมที่เรียกใช้งานได้
Pacerier

@Pacerier - วิธีเดียวกันกับที่รู้ว่าไฟล์สแตติกใดที่จะส่งไปยังไคลเอนต์หากมีการร้องขอไฟล์สแตติก
เควนติน

41

CGI เป็นข้อกำหนดของอินเทอร์เฟซระหว่างเว็บเซิร์ฟเวอร์ (เซิร์ฟเวอร์ HTTP) และโปรแกรมที่ปฏิบัติการได้บางประเภทที่จะจัดการกับคำขอเฉพาะ

มันอธิบายถึงวิธีการที่คุณสมบัติบางอย่างของการร้องขอนั้นควรสื่อสารกับสภาพแวดล้อมของโปรแกรมนั้นและวิธีที่โปรแกรมควรสื่อสารการตอบกลับกลับไปยังเซิร์ฟเวอร์และวิธีที่เซิร์ฟเวอร์ควร 'ตอบสนอง' ให้เสร็จสมบูรณ์เพื่อสร้างการตอบกลับที่ถูกต้อง

ในขณะที่ CGI นั้นเป็น IETF Internet Draft และเป็นเช่นนั้นมีวันหมดอายุ มันหมดอายุโดยไม่มีการอัปเดตดังนั้นจึงไม่มี 'มาตรฐาน' CGI ตอนนี้เป็น RFC ที่ให้ข้อมูล แต่เป็นเอกสารทั่วไปที่ใช้กันทั่วไปและไม่ใช่มาตรฐาน rfc3875.txt , rfc3875.html

โปรแกรมที่ใช้งานอินเทอร์เฟซ CGI สามารถเขียนได้ในภาษาใด ๆ ที่ทำงานได้บนเครื่องเป้าหมาย พวกเขาจะต้องสามารถเข้าถึงตัวแปรสภาพแวดล้อมและมักจะเข้ามาตรฐานและพวกเขาสร้างผลผลิตของพวกเขาเกี่ยวกับการออกมาตรฐาน

ภาษาที่คอมไพล์เช่น C มักใช้เป็นภาษาสคริปต์เช่น perl มักใช้ไลบรารีเพื่อทำให้การเข้าถึงสภาพแวดล้อม CGI ง่ายขึ้น

หนึ่งในข้อเสียที่สำคัญของ CGI คือโปรแกรมใหม่เกิดขึ้นสำหรับแต่ละคำขอดังนั้นการรักษาสถานะระหว่างการร้องขออาจเป็นปัญหาประสิทธิภาพที่สำคัญ รัฐอาจได้รับการจัดการในคุกกี้หรือเข้ารหัสใน URL แต่ถ้ามันมีขนาดใหญ่จะต้องถูกจัดเก็บไว้ที่อื่นและคีย์จากข้อมูล URL ที่เข้ารหัสหรือคุกกี้ การเรียกใช้ CGI แต่ละครั้งจะต้องโหลดสถานะที่เก็บไว้จากร้านค้าแห่งหนึ่ง

ด้วยเหตุผลนี้และสำหรับอินเทอร์เฟซที่เรียบง่ายอย่างยิ่งสำหรับคำขอและเซสชันสภาพแวดล้อมแบบรวมที่ดีกว่าระหว่างเว็บเซิร์ฟเวอร์และแอปพลิเคชันจึงได้รับความนิยมมากขึ้น สภาพแวดล้อมเช่นการใช้งาน php ที่ทันสมัยกับ apache รวมภาษาเป้าหมายได้ดีขึ้นมากกับเว็บเซิร์ฟเวอร์และให้การเข้าถึงวัตถุคำขอและเซสชันที่จำเป็นในการให้บริการคำขอ HTTP อย่างมีประสิทธิภาพ พวกเขาเสนอวิธีที่ง่ายขึ้นและสมบูรณ์ยิ่งขึ้นในการเขียน 'โปรแกรม' เพื่อจัดการกับคำขอ HTTP

ไม่ว่าคุณจะเขียนสคริปต์ CGI ค่อนข้างจะขึ้นอยู่กับการตีความ แน่นอนว่ามันทำงานได้อย่างหนึ่ง แต่ก็เป็นเรื่องปกติที่จะเรียกใช้ php เป็นโมดูลซึ่งส่วนต่อประสานระหว่างสคริปต์และเซิร์ฟเวอร์นั้นไม่ใช่ส่วนต่อประสาน CGI


1
ตื๊อ ฉันเริ่มเขียนสิ่งนี้เมื่อไม่มีคำตอบอื่น ๆ แต่ถูกเรียกมา ตอนนี้มันอยู่ที่ # 8 ในรายการ ฉันไม่ได้ต้องการที่จะลบตอนนี้ฉันจะกลับมาและลบในภายหลัง
CB Bailey

6
เฮ้ .. โปรดอย่าลบมัน มันบอกว่าบางสิ่งในทางที่ชัดเจนยิ่งขึ้น ฉันพบว่ามันมีประโยชน์ อาจจะเป็นคนอื่นบ้างก็อาจจะเจอเช่นกัน :)
กรงเล็บ

1
ตกลงฉันจะทิ้งไว้สักพัก มันอาจจะดีถ้ามีคนรวมข้อความที่ 'ดีกว่า' ไว้ในคำตอบที่เต็มไปด้วยหนึ่งในนั้น จากนั้นเราอาจได้รับคำตอบที่ชัดเจนยิ่งขึ้น
CB Bailey

18

ซีจีระบุไว้ในRFC 3875แต่ที่เป็นภายหลัง "อย่างเป็นทางการ" ประมวลจากเดิมเอกสาร NCSA โดยทั่วไป CGI จะกำหนดโปรโตคอลเพื่อส่งผ่านข้อมูลเกี่ยวกับคำขอ HTTP จากเว็บเซิร์ฟเวอร์ไปยังโปรแกรมเพื่อดำเนินการ - โปรแกรมใด ๆ ในภาษาใด ๆ ในขณะที่ข้อมูลจำเพาะถูกเขียน (1993) เว็บเซิร์ฟเวอร์ส่วนใหญ่มีเฉพาะหน้าเว็บแบบคงที่ "เว็บแอป" เป็นสิ่งที่หายากและใหม่ดังนั้นจึงเป็นเรื่องธรรมดาที่จะแยกพวกเขาออกจากเนื้อหาคงที่ "ปกติ" เช่นในcgi-binไดเรกทอรีนอกเหนือจากเนื้อหาแบบคงที่และให้พวกเขาสิ้นสุดใน.cgiไดเรกทอรีนอกเหนือจากเนื้อหาแบบคงที่และมีพวกเขาจบลงใน

ในเวลานี้ที่นี่ยังไม่มี "ภาษาการเขียนโปรแกรมบนเว็บ" เช่น PHP และ C เป็นภาษาการเขียนโปรแกรมแบบพกพาที่มีผู้คนจำนวนมากเขียนสคริปต์ CGI ใน C แต่ Perl กลับกลายเป็นแบบที่ดีกว่าสำหรับประเภทนี้ สิ่งต่าง ๆ และ CGI ก็เกือบจะเหมือนกันกับ Perl ชั่วขณะหนึ่ง จากนั้นก็มี Java Servlets, PHP และกลุ่มอื่น ๆ เข้ามาครอบครองส่วนแบ่งการตลาดขนาดใหญ่ของ Perl


ทำไม PHP จึงเป็น "ภาษาเขียนโปรแกรมสำหรับเว็บโดยเฉพาะ"? PHP เป็นภาษาที่ใช้กันทั่วไปและผู้คนก็ใช้มันเพื่อแอพ UI ด้วย
Pacerier

@Pacerier: มันถูกออกแบบมาให้เป็นภาษาการเขียนโปรแกรมเพื่อสร้างเว็บเพจและนั่นคือสิ่งที่ 99.9% ของผู้ใช้ใช้ ก็จะยิ่งในของชื่อ การอ้างสิ่งอื่นเป็นเพียงการแบ่งผมไม่มีจุดหมาย หากคุณใช้มันสำหรับแอพ UI, การคำนวณทางวิทยาศาสตร์หรือการเขียนโปรแกรมฝังตัว, ดี, มีความสุขไม่มีใครพูดว่าคุณไม่ได้รับอนุญาต
Michael Borgwardt

13

ดูCGIใน Wikipedia CGI เป็นโปรโตคอลระหว่างเว็บเซิร์ฟเวอร์และโปรแกรมภายนอกหรือสคริปต์ที่จัดการอินพุตและสร้างเอาต์พุตที่ส่งไปยังเบราว์เซอร์

CGI เป็นเพียงวิธีสำหรับเว็บเซิร์ฟเวอร์และโปรแกรมในการสื่อสารไม่มีอะไรมากไม่มีอะไรน้อย ที่นี่เซิร์ฟเวอร์จัดการการเชื่อมต่อเครือข่ายและโปรโตคอล HTTP และโปรแกรมจัดการอินพุตและสร้างเอาต์พุตที่ส่งไปยังเบราว์เซอร์ สคริปต์ CGI นั้นเป็นโปรแกรมที่สามารถเรียกใช้โดยเว็บเซิร์ฟเวอร์และเป็นไปตามโปรโตคอล CGI ดังนั้นโปรแกรม CGI สามารถดำเนินการได้ตัวอย่างเช่นใน C อย่างไรก็ตามนั่นเป็นสิ่งที่หายากมากเนื่องจาก C ไม่เหมาะสำหรับงานนี้มากนัก

/cgi-bin/*.cgiเป็นเพียงเส้นทางที่ผู้คนมักจะใส่สคริปต์ CGI ของพวกเขา โดยทั่วไปเว็บเซิร์ฟเวอร์จะกำหนดค่าตามค่าเริ่มต้นเพื่อดึงข้อมูลสคริปต์ CGI จากพา ธ นั้น

สคริปต์ CGI สามารถใช้งานได้ใน PHP แต่โปรแกรม PHP ทั้งหมดไม่ใช่สคริปต์ CGI หากเว็บเซิร์ฟเวอร์มีตัวแปล PHP ฝังตัว (เช่น mod_php ใน Apache) ดังนั้นช่วง CGI จะถูกข้ามโดยโปรโตคอลโดยตรงที่มีประสิทธิภาพมากขึ้นระหว่างเว็บเซิร์ฟเวอร์และล่าม

ไม่ว่าคุณจะได้ติดตั้งสคริปต์ CGI หรือไม่นั้นขึ้นอยู่กับวิธีที่สคริปต์ของคุณดำเนินการโดยเว็บเซิร์ฟเวอร์


12

CGI เป็นหลักผ่านการปิดการร้องขอไปยังใด ๆล่ามที่ถูกกำหนดค่ากับเว็บเซิร์ฟเวอร์ - ซึ่งอาจเป็น Perl, Python, PHP, ทับทิม, C อะไรที่สวยมาก Perl เป็นสิ่งที่พบได้บ่อยที่สุดในวันนั้นซึ่งเป็นสาเหตุที่ทำให้คุณมักจะเห็นมันอ้างอิงกับ CGI

CGI ยังไม่ตาย ในความเป็นจริง บริษัท โฮสติ้งขนาดใหญ่ส่วนใหญ่ใช้ PHP เป็น CGI ซึ่งต่างจาก mod_php เพราะมันมีการกำหนดค่าระดับผู้ใช้และสิ่งอื่น ๆ ในขณะที่มันช้ากว่า mod_php โดยทั่วไป Ruby และ Python ก็จะเรียกใช้เป็น CGI ข้อแตกต่างที่สำคัญที่นี่คือโมดูลเซิร์ฟเวอร์ทำงานเป็นส่วนหนึ่งของซอฟต์แวร์เซิร์ฟเวอร์จริง - ซึ่งเหมือนกับ CGI โดยสิ้นเชิงนอกเซิร์ฟเวอร์เซิร์ฟเวอร์ใช้โมดูล CGI เพื่อกำหนดวิธีส่งและรับข้อมูลไปยังล่ามภายนอก


2
ไม่ใช่ downvoting แต่เว็บไพ ธ อนส่วนใหญ่ติดตั้งฉันเคยเห็นที่ไหนใน mod_wsgi หรือ mod_python
ChristopheD

นี่เป็นวิธีที่คนส่วนใหญ่ใช้สคริปต์ CGI ในระยะยาว แต่ก็ไม่ได้มีความหมายอะไร
reinierpost

คุณบอกว่าล่าม แต่ C แปลไม่ค่อยได้และคอมไพล์โปรแกรมเช่นคอมไพล์โปรแกรม C สามารถใช้กับ CGI ได้
user34660

11

CGI เป็นกลไกที่เว็บเซิร์ฟเวอร์เรียกใช้โดยโปรแกรมภายนอกเพื่อจัดการกับคำขอโดยมีตัวแปรสภาพแวดล้อมและอินพุตมาตรฐานที่ใช้เพื่อป้อนข้อมูลคำขอไปยังโปรแกรม ภาษาที่แน่นอนที่โปรแกรมภายนอกเขียนขึ้นไม่สำคัญว่าจะง่ายกว่าในการเขียนโปรแกรม CGI ในบางภาษาเมื่อเทียบกับภาษาอื่น ๆ

เนื่องจากสคริปต์ CGI ต้องการสิทธิ์ดำเนินการ httpd ตามค่าเริ่มต้นอนุญาตให้โปรแกรม CGI ในcgi-binไดเรกทอรีสามารถทำงานได้เพื่อวัตถุประสงค์ด้านความปลอดภัยเท่านั้น

ส่วนใหญ่ PHP mod_phpสคริปต์ทำงานในกระบวนการเว็บเซิร์ฟเวอร์ผ่าน นี่ไม่ใช่ CGI

CGI ช้าเนื่องจากต้องเริ่มต้นโปรแกรม (และล่ามที่เกี่ยวข้อง) ตามคำขอ ทางเลือกใหม่คือการประมวลผลแบบฝังตัวที่ใช้โดย mod_php และกระบวนการที่ใช้เวลานานซึ่งใช้โดย FastCGI ภาษาที่กำหนดอาจมีวิธีการในการนำกลไกเหล่านั้นมาใช้ด้วยดังนั้นโปรดสอบถามก่อนใช้ CGI


@Ignacio Vazquez-Abrams: หากส่วนต่อประสาน CGI สร้างกระบวนการใหม่ทุกครั้งที่ได้รับการร้องขอทรัพยากร CGI มากกว่าความแตกต่างในการดำเนินการระหว่าง CGI และ mod_php ???????? CGI และ mod_php เหมือนกันหรือไม่ ??? หรือมันเป็นไปได้ที่จะเขียนสคริปต์ PHP ที่ทำงานภายใต้ CGI Interface ไม่ได้อยู่ภายใต้ mod_php ???
hardik

@Hardik: mod_php ทำงานเป็นส่วนหนึ่งของ HTTPd ซึ่งรับผิดชอบกระบวนการของตัวเอง
Ignacio Vazquez-Abrams

'โปรแกรมภายนอก' นี่คืออะไร? มันเป็นล่ามหรือเปล่าถ้าฉันใช้ php กับ php-fpm
slier

@slier: มันเป็นโปรแกรมโดยพลการที่ไม่ใช่เว็บเซิร์ฟเวอร์
Ignacio Vazquez-Abrams

@ IgnacioVazquez-Abrams มันปลอดภัยไหมที่จะคิดว่ามันเป็นinterpreterถ้าฉันใช้ php กับ php-fpm?
slier

7

คุณอาจต้องการทราบว่าไม่ใช่ CGI และคำตอบคือ MODULE สำหรับเว็บเซิร์ฟเวอร์ของคุณ (ถ้าฉันสมมติว่าคุณเป็น Apache runnig) และนั่นคือความแตกต่างที่ยิ่งใหญ่เพราะ CGI ต้องการและโปรแกรมภายนอก, เธรด, สิ่งใดก็ตามที่จะยกตัวอย่าง PERL, PHP, C เซิร์ฟเวอร์แอปที่เมื่อคุณเรียกใช้เป็นโมดูลที่โปรแกรมคือเว็บเซิร์ฟเวอร์ (apache) ต่อครั้ง

เนื่องจากทั้งหมดนี้มีประสิทธิภาพความปลอดภัยปัญหาการพกพาที่เข้ามาเล่นมากมาย แต่มันเป็นการดีที่จะรู้ว่า CGI ไม่ใช่สิ่งแรกเพื่อที่จะเข้าใจว่ามันคืออะไร


7

ตัวอย่างในชีวิตจริง: ฐานข้อมูลที่ซับซ้อนที่จำเป็นต้องแสดงบนเว็บไซต์ เนื่องจากฐานข้อมูลถูกออกแบบที่ไหนสักแห่งในรอบปี 1986 (!) ข้อมูลจำนวนมากจึงถูกบรรจุในรูปแบบต่างๆเพื่อประหยัดพื้นที่ดิสก์

ขณะที่การพัฒนาดำเนินต่อไปผู้พัฒนาไม่สามารถแก้ปัญหาการร้องขอข้อมูลที่ซับซ้อนใน SQL เพียงอย่างเดียวได้อีกต่อไปตัวอย่างเช่นเนื่องจากการคัดแยกชิ้นงานผิดปกติ

มีวิธีแก้ปัญหาที่สมเหตุสมผลสามวิธี:

  1. รวดเร็วและสกปรก: ส่งข้อมูลที่ไม่พึงประสงค์ไปยัง PHP เรียงลำดับที่นั่น เห็นได้ชัดว่าเป็นทางออกที่แพงมากเพราะจะทำซ้ำทุกครั้งที่มีการเรียกหน้าเว็บ
  2. เขียนปลั๊กอินไปยังเอ็นจิ้นฐานข้อมูล - แต่ผู้ดูแลระบบยังไม่พร้อมที่จะอนุญาตให้โค้ดต่างประเทศทำงานบนเซิร์ฟเวอร์หรือ
  3. คุณสามารถประมวลผลข้อมูลในโปรแกรม (C, Perl, ฯลฯ ) และ HTML เอาท์พุท ตัวโปรแกรมจะเข้าสู่ / cgi-bin และถูกเรียกโดยเว็บเซิร์ฟเวอร์ (เช่น Apache) โดยตรงไม่ใช่ผ่าน PHP

CGI เรียกใช้สคริปต์ของคุณในโซลูชัน # 3 และส่งผลต่อเบราว์เซอร์ คุณมีความเร็วของโปรแกรมที่คอมไพล์แล้วความยืดหยุ่นของภาษาดีกว่า SQL และไม่จำเป็นต้องเขียนปลั๊กอินไปยังเซิร์ฟเวอร์ SQL (อีกครั้งนี่เป็นตัวอย่างเฉพาะของ SQL และ C)


1
คำตอบที่ดีที่สุดสำหรับฉันฉันเข้าใจแล้ว
Daniel Katz

7

สคริปต์ CGI เป็นโปรแกรมคอนโซล / เชลล์ ใน Windows เมื่อคุณใช้หน้าต่าง "พรอมต์คำสั่ง" คุณจะรันโปรแกรมคอนโซล เมื่อเว็บเซิร์ฟเวอร์เรียกใช้งานสคริปต์ CGI จะมีอินพุตให้กับโปรแกรมคอนโซล / เชลล์โดยใช้ตัวแปรสภาพแวดล้อมหรือ "อินพุตมาตรฐาน" อินพุตมาตรฐานเหมือนกับการพิมพ์ข้อมูลลงในโปรแกรมคอนโซล / เชลล์ ในกรณีของสคริปต์ CGI เว็บเซิร์ฟเวอร์จะทำการพิมพ์ สคริปต์ CGI เขียนข้อมูลไปยัง "เอาต์พุตมาตรฐาน" และเอาต์พุตนั้นถูกส่งไปยังไคลเอ็นต์ (เว็บเบราว์เซอร์) เป็นหน้า HTML เอาต์พุตมาตรฐานเหมือนกับเอาต์พุตที่คุณเห็นในโปรแกรมคอนโซล / เชลล์ยกเว้นเว็บเซิร์ฟเวอร์อ่านและส่งออก

สคริปต์ CGI สามารถเรียกใช้งานได้จากเบราว์เซอร์ โดยทั่วไปแล้ว URI จะรวมสตริงข้อความค้นหาที่ให้ไว้กับสคริปต์ CGI หากวิธีการคือ "รับ" สตริงการสืบค้นจะถูกจัดเตรียมให้กับ CGI Script ในตัวแปรสภาพแวดล้อมที่เรียกว่า QUERY_STRING หากวิธีการคือ "โพสต์" ดังนั้นสตริงแบบสอบถามจะถูกจัดให้กับ CGI Script โดยใช้อินพุตมาตรฐาน (CGI Script อ่านสตริงแบบสอบถามจากอินพุตมาตรฐาน)

การใช้สคริปต์ CGI ในช่วงต้นคือการประมวลผลแบบฟอร์ม ในตอนต้นของ HTML รูปแบบ HTML โดยทั่วไปจะมีแอตทริบิวต์ "การกระทำ" และปุ่มที่กำหนดให้เป็นปุ่ม "ส่ง" เมื่อกดปุ่มส่ง URI ที่ระบุในแอตทริบิวต์ "action" จะถูกส่งไปยังเซิร์ฟเวอร์โดยมีข้อมูลจากฟอร์มที่ส่งเป็นสตริงข้อความค้นหา หาก "การกระทำ" ระบุสคริปต์ CGI สคริปต์ CGI จะถูกดำเนินการและสร้างหน้า HTML ขึ้นมา

RFC 3875 "Common Gateway Interface (CGI)" กำหนด CGI บางส่วนโดยใช้ C ดังที่กล่าวไว้ว่าตัวแปรสภาพแวดล้อม "เข้าถึงได้โดย C library รูทีน getenv () หรือตัวแปรสภาพแวดล้อม"

หากคุณกำลังพัฒนาสคริปต์ CGI โดยใช้ C / C ++ และใช้ Microsoft Visual Studio เพื่อทำเช่นนั้นคุณจะต้องพัฒนาโปรแกรมคอนโซล


"CGI script" เป็นคำที่กว้างและสามารถรวมไฟล์ที่เรียกทำงานได้
71GA

6

CGI เป็นโปรแกรม (หรือเว็บ API) ที่คุณเขียนและบันทึกไว้ในเว็บไซต์เซิร์ฟเวอร์ CGI เป็นไฟล์

ไฟล์นี้อยู่และรอบนเว็บเซิร์ฟเวอร์ เมื่อเบราว์เซอร์ไคลเอ็นต์ส่งคำขอไปยังเว็บเซิร์ฟเวอร์เพื่อเรียกใช้ไฟล์ CGI ของคุณเว็บเซิร์ฟเวอร์จะเรียกใช้ไฟล์ CGI ของคุณบนเว็บไซต์เซิร์ฟเวอร์ อินพุตสำหรับโปรแกรม CGI นี้ถ้ามีมาจากเบราว์เซอร์ไคลเอ็นต์ ผลลัพธ์ของโปรแกรม CGI นี้จะถูกส่งไปยังเบราว์เซอร์

คุณใช้ภาษาใดในการเขียนโปรแกรม CGI โพสต์อื่น ๆ ได้กล่าวถึง c, java, php, perl และอื่น ๆ


4

แนวคิดเบื้องหลัง CGI คือโปรแกรม / สคริปต์ (ไม่ว่าจะเป็น Perl หรือแม้แต่ C) รับอินพุตผ่านSTDIN(ข้อมูลขอ) และส่งออกข้อมูลผ่านSTDOUT(echo, printfข้อความสั่ง)

เหตุผลที่สคริปPHPส่วนใหญ่ไม่ผ่านเกณฑ์คือพวกเขาทำงานภายใต้โมดูลPHP Apache

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.