Giao diện cổng chung (CGI) là gì?


745

CGI là một giao diện cổng chung. Như tên của nó, nó là một giao diện cổng "chung" cho mọi thứ. Nó thật tầm thường và ngây thơ từ cái tên. Tôi cảm thấy rằng tôi hiểu điều này và tôi cảm thấy điều này mỗi khi tôi gặp từ này. Nhưng thành thật mà nói, tôi đã không. Tôi vẫn còn bối rối.

Tôi là một lập trình viên PHP có kinh nghiệm phát triển web.

yêu cầu người dùng (máy khách) cho trang ---> máy chủ web (-> trình thông dịch PHP nhúng) ----> Tập lệnh phía máy chủ (PHP) ---> Máy chủ MySQL.

Bây giờ hãy nói PHP Script của tôi có thể tìm nạp kết quả từ máy chủ MySQL & máy chủ MATLAB và một số máy chủ khác.

Vì vậy, bây giờ PHP Script là CGI? Bởi vì giao diện của nó cho giữa máy chủ web & Tất cả các máy chủ khác? Tôi không biết. Đôi khi họ gọi CGI, một công nghệ và những lần khác họ gọi CGI là chương trình hoặc một số máy chủ khác.

  • Chính xác thì CGI là gì?

  • Vấn đề lớn là /cgi-bin/*.cgigì? Có chuyện gì thế này? Tôi không biết cgi-binthư mục này trên máy chủ để làm gì. Tôi không biết tại sao họ có phần mở rộng * .cgi.

  • Tại sao Perl luôn luôn cản trở. CGI & Perl (ngôn ngữ). Tôi cũng không biết chuyện gì với hai người này. Hầu như tất cả thời gian tôi liên tục nghe hai kết hợp này "CGI & Perl". Cuốn sách này là một ví dụ tuyệt vời khác về lập trình CGI với Perl . Tại sao không "Lập trình CGI với PHP / JSP / ASP"? Tôi chưa bao giờ thấy những điều như vậy.

  • Lập trình CGI trong C , làm tôi bối rối rất nhiều. " Trong C " ?? Nghiêm túc?? Tôi không biết phải nói gì. Tôi chỉ bối rối. " Trong C " ?? Điều này thay đổi mọi thứ. Chương trình cần phải được biên dịch và thực hiện. Điều này hoàn toàn thay đổi quan điểm của tôi về lập trình web. Khi nào tôi biên dịch? Làm thế nào để chương trình được thực thi (bởi vì nó sẽ là mã máy, vì vậy nó phải thực thi như một quy trình độc lập). Làm thế nào để nó giao tiếp với máy chủ web? IPC? và giao tiếp với tất cả các máy chủ (trong ví dụ MATLAB & MySQL của tôi) bằng lập trình socket? Tôi bị lạc !!

  • Mọi người nói rằng CGI không được dùng nữa và không được sử dụng nữa. Là vậy sao? Bản cập nhật mới nhất là gì?

Một lần, tôi gặp phải tình huống phải cấp quyền truy cập yêu cầu PUT HTTP vào máy chủ web (Apache HTTPD). Đó là một cái lưng dài. Vì vậy, theo tôi nhớ đây là những gì tôi đã làm:

  1. Đã chỉnh sửa tệp cấu hình của Apache HTTPD để báo cho máy chủ web chuyển tất cả các yêu cầu PUT HTTP cho một số put.php(Tôi phải viết tập lệnh PHP này)

  2. Triển khai put.php để xử lý yêu cầu (lưu tệp vào vị trí được đề cập)

Mọi người nói rằng tôi đã viết một CGI Script. Nghiêm túc mà nói, tôi không biết họ đang nói gì.

  • Tôi đã thực sự viết CGI Script?

Tôi hy vọng bạn hiểu sự nhầm lẫn của tôi là gì. (Vì bản thân tôi không biết mình đang bối rối ở đâu). Tôi yêu cầu các bạn giữ câu trả lời của bạn đơn giản nhất có thể. Tôi thực sự không thể hiểu bất kỳ thuật ngữ kỹ thuật ưa thích. Ít nhất là không trong trường hợp này.

BIÊN TẬP:

Tôi tìm thấy hướng dẫn tuyệt vời này "Lập trình CGI đơn giản!" - Hướng dẫn CGI , giải thích các khái niệm theo cách đơn giản nhất có thể. Sau khi đọc bài viết này, bạn có thể muốn đọc Bắt đầu với Lập trình CGI trong C để bổ sung hiểu biết của bạn với các mẫu mã thực tế. Tôi cũng đã thêm các liên kết này vào hướng dẫn này vào bài viết của Wikipedia: http://en.wikipedia.org/wiki/Common_Gateway_Interface


9
Tôi đã từng thấy CGI viết trong Cobol. Không trốn tránh!
Lục M

@Luc M. Quan tâm. Ý bạn là CGI nào (cho rằng có tồn tại một raycaster trong LINQ ...)?
Joe

15
@claws: Mọi người, chủ yếu là trường học cũ, sẽ gọi BẤT K code mã nào, bất kể phương thức thực hiện thực tế, được thực hiện thông qua máy chủ web là CGI. Những gì bạn thực sự đã viết là một tập lệnh PHP, có thể được thực thi hoặc không được thực thi thông qua giao thức CGI. Sự nhầm lẫn của bạn dường như xuất phát từ ý nghĩa xung quanh của CGI, một giao thức để thực thi mã và mã được thực thi thông qua giao thức (mà sau này được khái quát hóa có nghĩa là bất kỳ mã thực thi web nào)
Vinko Vrsalovic

1
Trở lại giữa những năm 90, tôi đã viết một vài kịch bản CGI trong HyperCard
Neal Davis

@Joe Tôi chưa bao giờ nhận được thông báo và hôm nay, đọc lại bài đăng này, tôi thấy câu hỏi của bạn. Các CGI đã được viết trên OpenVMS dưới dạng các tệp thực thi độc lập (không có khung liên quan hoặc các ứng dụng của bên thứ ba ...)
Luc M

Câu trả lời:


427

CGI là một giao diện cho máy chủ web biết cách truyền dữ liệu đến và từ một ứng dụng. Cụ thể hơn, nó mô tả cách thông tin yêu cầu được truyền trong các biến môi trường (như loại yêu cầu, địa chỉ IP từ xa), cách cơ thể yêu cầu được truyền qua đầu vào tiêu chuẩn và cách phản hồi được truyền qua đầu ra tiêu chuẩn. Bạn có thể tham khảo thông số kỹ thuật CGI để biết chi tiết.

Để sử dụng hình ảnh của bạn:

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

Hầu hết nếu không phải tất cả, máy chủ web có thể được cấu hình để thực thi chương trình dưới dạng 'CGI'. Điều này có nghĩa là máy chủ web, khi nhận được yêu cầu, sẽ chuyển tiếp dữ liệu đến một chương trình cụ thể, đặt một số biến môi trường và sắp xếp các tham số thông qua đầu vào tiêu chuẩn và đầu ra tiêu chuẩn để chương trình có thể biết vị trí và những gì cần tìm.

Lợi ích chính là bạn có thể chạy BẤT K code mã thực thi nào từ web, với điều kiện là cả máy chủ web và chương trình đều biết CGI hoạt động như thế nào. Đó là lý do tại sao bạn có thể viết chương trình web bằng C hoặc Bash bằng máy chủ web hỗ trợ CGI thông thường. Điều đó, và rằng hầu hết các môi trường lập trình có thể dễ dàng sử dụng các biến đầu vào tiêu chuẩn, đầu ra tiêu chuẩn và môi trường.

Trong trường hợp của bạn, rất có thể bạn đã sử dụng một phương thức khác, cụ thể cho PHP, phương tiện giao tiếp giữa các tập lệnh của bạn và máy chủ web, điều này, như bạn đã đề cập trong câu hỏi của mình, là một trình thông dịch nhúng được gọi là mod_php.

Vì vậy, trả lời câu hỏi của bạn:

Chính xác thì CGI là gì?

Xem ở trên.

Có chuyện gì với /cgi-bin/*.cgi? Có chuyện gì thế này? Tôi không biết thư mục cgi-bin này trên máy chủ để làm gì. Tôi không biết tại sao họ có phần mở rộng * .cgi.

Đó là nơi truyền thống cho các chương trình cgi, nhiều máy chủ web đi kèm với thư mục này được cấu hình sẵn để thực thi tất cả các nhị phân ở đó dưới dạng các chương trình CGI. Phần mở rộng .cgi biểu thị một tệp thực thi dự kiến ​​sẽ hoạt động thông qua CGI.

Tại sao Perl luôn luôn cản trở. CGI & Perl (ngôn ngữ). Tôi cũng không biết chuyện gì với hai người này. Hầu như tất cả thời gian tôi liên tục nghe hai kết hợp này "CGI & Perl". Cuốn sách này là một ví dụ tuyệt vời khác về lập trình CGI với Perl Tại sao không "Lập trình CGI với PHP / JSP / ASP". Tôi chưa bao giờ thấy những điều như vậy.

Bởi vì Perl là cổ xưa (cũ hơn PHP, JSP và ASP, tất cả đã xuất hiện khi CGI đã cũ, Perl tồn tại khi CGI mới) và trở nên khá nổi tiếng vì là ngôn ngữ rất tốt để phục vụ các trang web động thông qua CGI. Ngày nay, có những lựa chọn thay thế khác để chạy Perl trong máy chủ web, chủ yếu là mod_perl .

Lập trình CGI trong C này làm tôi bối rối rất nhiều. trong C ?? Nghiêm túc?? Tôi không biết phải nói gì. Tôi chỉ nhầm lẫn. "Trong C" ?? Điều này thay đổi mọi thứ. Chương trình cần được biên dịch và thực thi. Điều này hoàn toàn thay đổi quan điểm của tôi về lập trình web. Khi tôi biên dịch? Chương trình được thực thi như thế nào (bởi vì nó sẽ là một Mã máy, do đó nó phải thực thi như một quy trình độc lập). Làm thế nào để nó giao tiếp với máy chủ web? IPC? và giao tiếp với tất cả các máy chủ (trong ví dụ MATLAB & MySQL của tôi) bằng lập trình socket? Tôi bị mất !!

Bạn biên dịch tệp thực thi một lần, máy chủ web thực thi chương trình và chuyển dữ liệu trong yêu cầu đến chương trình và đưa ra phản hồi nhận được. CGI chỉ định rằng một phiên bản chương trình sẽ được khởi chạy cho mỗi yêu cầu. Đây là lý do tại sao CGI không hiệu quả và loại lỗi thời ngày nay.

Họ nói rằng CGI không được chấp nhận. Nó không còn được sử dụng. Có phải vậy không? Cập nhật mới nhất của nó là gì?

CGI vẫn được sử dụng khi hiệu suất không phải là tối quan trọng và cần có một phương thức thực thi mã đơn giản. Nó không hiệu quả vì những lý do đã nêu trước đây và có nhiều phương tiện hiện đại hơn để thực hiện bất kỳ chương trình nào trong môi trường web. Hiện tại nổi tiếng nhất là FastCGI .


24
Cụ thể hơn, nó mô tả cách thông tin yêu cầu được truyền trong các biến môi trường (chẳng hạn như loại yêu cầu, địa chỉ IP từ xa), cách cơ thể reqeust được truyền qua đầu vào tiêu chuẩn và cách phản hồi được truyền qua đầu ra tiêu chuẩn. Bạn có thể tham khảo thông số kỹ thuật CGI ( hoohoo.ncsa.illinois.edu/cgi ) để biết chi tiết.
daf

3
Giả sử Server side Programtrong hình của bạn là tập lệnh PHP của tôi. Vì vậy, tôi chưa bao giờ thực hiện bất kỳ chương trình CGI? Bởi vì tôi chưa bao giờ viết bất cứ điều gì xuất hiện giữa máy chủ web và tập lệnh PHP của tôi. Chỉ trích!! Điều này giết chết tôi.
móng vuốt

4
PHP vẫn dựa rất nhiều vào giao thức CGI, hầu hết nội dung của $ _SERVER là trực tiếp từ thông số CGI. Và "lập trình CGI" luôn có nghĩa là chương trình xử lý yêu cầu, chứ không phải việc thực hiện giao thức. Nếu bạn giải thích những gì bạn làm với PHP cho một nhà tiên phong lập trình web thời đại 1993, anh ta sẽ coi đó là một hình thức lập trình CGI tiên tiến (mặc dù có thể là dở hơi).
Michael Borgwardt

5
@Michael: Nhưng khi chạy qua mod_php hoàn toàn không phải là CGI (ngay cả khi dựa trên nó). Và tôi đồng ý rằng CGI đề cập đến cả giao thức và tập lệnh được thực thi thông qua nó.
Vinko Vrsalovic

2
@Vinko Vrsalovic: nếu CGI là giao diện cho Perl, C hoặc các ngôn ngữ khác để thực thi trong Máy chủ Web hơn giao diện nào được PHP sử dụng để chạy trong Apache ???????? và PHP có thuộc Thông số kỹ thuật CGI không ??
hardik

63

Chính xác thì CGI là gì?

Một phương tiện cho một máy chủ web lấy dữ liệu từ một chương trình (ví dụ, thay vì một tệp).

Có chuyện gì với /cgi-bin/*.cgi?

Không có gì to tát. Nó chỉ là một quy ước.

Tôi không biết thư mục cgi-bin này trên máy chủ để làm gì. Tôi không biết tại sao họ có phần mở rộng * .cgi.

Máy chủ phải biết phải làm gì với tệp (tức là coi nó như một chương trình để thực thi thay vì một cái gì đó chỉ đơn giản là phục vụ). Có phần mở rộng .html bảo nó sử dụng loại nội dung văn bản / html. Có một phần mở rộng .cgi bảo nó chạy nó như một chương trình.

Giữ các tệp thực thi trong một thư mục riêng biệt sẽ bảo vệ bổ sung chống lại việc thực thi các tệp không chính xác và / hoặc phục vụ các chương trình CGI dưới dạng dữ liệu thô trong trường hợp máy chủ bị định cấu hình sai.

Tại sao Perl luôn luôn cản trở.

Nó không. Perl chỉ lớn và phổ biến cùng lúc với CGI.

Tôi đã không sử dụng Perl CGI trong nhiều năm. Tôi đã sử dụng mod_perl trong một thời gian dài và có xu hướng hướng tới PSGI / Plack với FastCGI những ngày này.

Cuốn sách này là một ví dụ tuyệt vời khác về lập trình CGI với Perl Tại sao không "Lập trình CGI với PHP / JSP / ASP".

CGI không hiệu quả lắm. Các phương pháp tốt hơn để nói chuyện với các chương trình từ máy chủ web xuất hiện cùng lúc với PHP. JSP và ASP các phương thức khác nhau để nói chuyện với các chương trình.

Lập trình CGI trong C này làm tôi bối rối rất nhiều. trong C ?? Nghiêm túc??

Nó là một ngôn ngữ lập trình, tại sao không?

Khi nào tôi biên dịch?

  1. Viết mã
  2. Biên dịch
  3. Truy cập URL
  4. Máy chủ web chạy chương trình

Làm thế nào để chương trình được thực thi (bởi vì nó sẽ là mã máy, vì vậy nó phải thực thi như một quy trình độc lập).

Nó không phải thực thi như một quy trình độc lập (bạn có thể viết các mô-đun Apache bằng C), nhưng toàn bộ khái niệm về CGI là nó khởi chạy một quy trình bên ngoài.

Làm thế nào để nó giao tiếp với máy chủ web? IPC?

STDIN / STDOUT và các biến môi trường - như được định nghĩa trong đặc tả CGI.

và giao tiếp với tất cả các máy chủ (trong ví dụ MATLAB & MySQL của tôi) bằng lập trình socket?

Sử dụng bất kỳ phương pháp nào bạn thích và được hỗ trợ.

Họ nói rằng CGI bị khấu hao. Nó không còn được sử dụng. Có phải vậy không?

CGI không hiệu quả, chậm và đơn giản. Nó hiếm khi được sử dụng, khi nó được sử dụng, đó là bởi vì nó đơn giản. Nếu hiệu suất không phải là vấn đề lớn, thì sự đơn giản có giá trị rất nhiều.

Cập nhật mới nhất của nó là gì?

1.1


1. Viết mã 2. Biên dịch 3. Truy cập URL 4. Máy chủ web chạy chương trình. | | Nhưng làm thế nào để máy chủ web biết nơi bạn đặt chương trình thực thi được biên dịch? Làm thế nào để nó biết chương trình thực thi nào (trong số tất cả) để chạy?
Pacerier

@Pacerier - Giống như cách nó biết tệp tĩnh nào sẽ gửi cho khách hàng nếu một tệp tĩnh được yêu cầu.
Quentin

41

CGI là một đặc tả giao diện giữa một máy chủ web (máy chủ HTTP) và một chương trình thực thi của một số loại sẽ xử lý một yêu cầu cụ thể.

Nó mô tả cách các thuộc tính nhất định của yêu cầu đó được truyền đạt tới môi trường của chương trình đó và cách chương trình sẽ truyền đạt phản hồi trở lại máy chủ và cách máy chủ 'hoàn thành' phản hồi để tạo phản hồi hợp lệ cho yêu cầu HTTP gốc.

Trong một thời gian, CGI là Dự thảo Internet của IETF và như vậy đã hết hạn. Nó đã hết hạn không có bản cập nhật nên không có 'tiêu chuẩn' CGI. Bây giờ nó là một RFC thông tin, nhưng như một tài liệu thông thường và không phải là một tiêu chuẩn. rfc3875.txt , rfc3875.html

Các chương trình thực hiện giao diện CGI có thể được viết bằng bất kỳ ngôn ngữ nào có thể chạy được trên máy đích. Họ phải có khả năng truy cập các biến môi trường và thường là đầu vào tiêu chuẩn và họ tạo đầu ra của họ trên đầu ra tiêu chuẩn .

Các ngôn ngữ được biên dịch như C thường được sử dụng như các ngôn ngữ script như perl, thường sử dụng các thư viện để giúp truy cập vào môi trường CGI dễ dàng hơn.

Một trong những nhược điểm lớn của CGI là một chương trình mới được sinh ra cho mỗi yêu cầu nên việc duy trì trạng thái giữa các yêu cầu có thể là một vấn đề hiệu suất lớn. Trạng thái có thể được xử lý trong cookie hoặc được mã hóa trong một URL, nhưng nếu nó lớn, nó phải được lưu trữ ở nơi khác và được khóa từ thông tin url được mã hóa hoặc cookie. Mỗi lệnh gọi CGI sau đó sẽ phải tải lại trạng thái được lưu trữ từ một cửa hàng ở đâu đó.

Vì lý do này và đối với giao diện đơn giản cho các yêu cầu và phiên, môi trường tích hợp tốt hơn giữa các máy chủ web và ứng dụng phổ biến hơn nhiều. Các môi trường như triển khai php hiện đại với apache tích hợp ngôn ngữ đích tốt hơn nhiều với máy chủ web và cung cấp quyền truy cập vào các đối tượng yêu cầu và phiên cần thiết để phục vụ hiệu quả các yêu cầu http. Họ cung cấp một cách dễ dàng và phong phú hơn nhiều để viết 'chương trình' để xử lý các yêu cầu HTTP.

Cho dù bạn đã viết một kịch bản CGI thay vì phụ thuộc vào giải thích. Nó chắc chắn đã làm công việc của một người nhưng thông thường hơn là chạy php như một mô-đun trong đó giao diện giữa tập lệnh và máy chủ không hoàn toàn là giao diện CGI.


1
Làm phiền Tôi bắt đầu viết bài này khi không có câu trả lời nào khác, nhưng được gọi theo cách. Bây giờ là khoảng 8 trong danh sách. Tôi không có ý định xóa nó ngay bây giờ, tôi sẽ quay lại và xóa nó sau.
CB Bailey

6
Này .. Xin đừng xóa nó. Nó nói một số điều theo cách rõ ràng hơn. Tôi thấy nó hữu ích. Có thể một số người khác cũng có thể tìm thấy nó như vậy. :)
móng vuốt

1
OK, tôi sẽ để nó lên một chút. Dù vậy, có lẽ sẽ tốt nếu ai đó tích hợp bất kỳ đoạn 'tốt hơn' nào vào một trong những câu trả lời đầy đủ hơn. Sau đó, chúng tôi có thể có được một câu trả lời dứt khoát hơn.
CB Bailey

18

CGI được chỉ định trong RFC 3875 , mặc dù đó là sự mã hóa "chính thức" sau này của tài liệu NCSA gốc . Về cơ bản, CGI định nghĩa một giao thức để truyền dữ liệu về yêu cầu HTTP từ máy chủ web đến một chương trình để xử lý - bất kỳ chương trình nào, bằng bất kỳ ngôn ngữ nào. Vào thời điểm thông số kỹ thuật được viết (1993), hầu hết các máy chủ web chỉ chứa các trang tĩnh, "ứng dụng web" là một thứ hiếm và mới, do đó, có vẻ như việc tách chúng ra khỏi nội dung tĩnh "thông thường", chẳng hạn như trong cgi-binthư mục ngoài nội dung tĩnh và có chúng kết thúc .cgi.

Vào thời điểm này, ở đây cũng không có "ngôn ngữ lập trình web" chuyên dụng như PHP và C là ngôn ngữ lập trình di động thống trị - vì vậy nhiều người đã viết các tập lệnh CGI của họ bằng C. Nhưng Perl nhanh chóng phù hợp hơn với loại này và CGI gần như đồng nghĩa với Perl trong một thời gian. Sau đó, đến Java Servlets, PHP và một loạt các công cụ khác và chiếm phần lớn thị phần của Perl.


Tại sao PHP là "ngôn ngữ lập trình web chuyên dụng"? PHP là ngôn ngữ có mục đích chung và mọi người cũng đã sử dụng nó cho các ứng dụng UI.
Pacerier

@Pacerier: nó được thiết kế để trở thành ngôn ngữ lập trình để tạo các trang web và đó là những gì 99,9% người dùng sử dụng nó để làm việc. Nó thậm chí trong tên của nó . Yêu cầu bất cứ điều gì khác chỉ là chia tóc vô nghĩa. Nếu bạn đang sử dụng nó cho các ứng dụng UI, máy tính khoa học hoặc lập trình nhúng, tốt, hãy vui mừng, không ai nói rằng bạn không được phép.
Michael Borgwardt

13

Có một cái nhìn về CGI trong Wikipedia. CGI là một giao thức giữa máy chủ web và chương trình bên ngoài hoặc tập lệnh xử lý đầu vào và tạo đầu ra được gửi đến trình duyệt.

CGI đơn giản là một cách để máy chủ web và một chương trình giao tiếp, không hơn, không kém. Tại đây, máy chủ quản lý kết nối mạng và giao thức HTTP và chương trình xử lý đầu vào và tạo đầu ra được gửi đến trình duyệt. Kịch bản CGI về cơ bản có thể là bất kỳ chương trình nào có thể được thực thi bởi máy chủ web và tuân theo giao thức CGI. Do đó, một chương trình CGI có thể được thực hiện, ví dụ, trong C. Tuy nhiên, điều đó cực kỳ hiếm, vì C không phù hợp lắm cho nhiệm vụ.

/cgi-bin/*.cgichỉ đơn giản là một con đường nơi mọi người thường đặt tập lệnh CGI của họ. Máy chủ web thường được cấu hình theo mặc định để tìm nạp các tập lệnh CGI từ đường dẫn đó.

một tập lệnh CGI cũng có thể được triển khai trong PHP, nhưng tất cả các chương trình PHP không phải là tập lệnh CGI. Nếu máy chủ web đã nhúng trình thông dịch PHP (ví dụ mod_php trong Apache), thì giai đoạn CGI bị bỏ qua bởi giao thức trực tiếp hiệu quả hơn giữa máy chủ web và trình thông dịch.

Việc bạn có triển khai tập lệnh CGI hay không phụ thuộc vào cách tập lệnh của bạn được máy chủ web thực thi.


12

CGI về cơ bản chuyển yêu cầu đến bất kỳ trình thông dịch nào được cấu hình với máy chủ web - Đây có thể là Perl, Python, PHP, Ruby, C khá nhiều. Perl là trở lại phổ biến nhất trong ngày đó là lý do tại sao bạn thường thấy nó liên quan đến CGI.

CGI không chết. Trong thực tế, hầu hết các công ty lưu trữ lớn chạy PHP dưới dạng CGI trái ngược với mod_php vì nó cung cấp cấu hình cấp độ người dùng và một số thứ khác trong khi nó chậm hơn mod_php. Ruby và Python cũng thường chạy dưới dạng CGI. Điểm khác biệt chính ở đây là mô-đun máy chủ chạy như một phần của phần mềm máy chủ thực tế - trong đó với CGI hoàn toàn bên ngoài máy chủ Máy chủ chỉ sử dụng mô-đun CGI để xác định cách truyền và nhận dữ liệu cho trình thông dịch bên ngoài.


2
Không tải xuống nhưng hầu hết các cài đặt web python tôi đã thấy ở đâu trên mod_wsgi hoặc mod_python.
BarsheD

Đây là cách hầu hết mọi người sử dụng thuật ngữ CGI, nhưng nó không hoàn toàn có nghĩa là thuật ngữ này.
Revierpost

Bạn nói thông dịch viên nhưng C hiếm khi được giải thích và biên dịch các chương trình như chương trình biên dịch C có thể được sử dụng cho CGI.
user34660

11

CGI là một cơ chế theo đó một chương trình bên ngoài được gọi bởi máy chủ web để xử lý một yêu cầu, với các biến môi trường và đầu vào tiêu chuẩn được sử dụng để cung cấp dữ liệu yêu cầu cho chương trình. Ngôn ngữ chính xác mà chương trình bên ngoài được viết không thành vấn đề, mặc dù việc viết chương trình CGI bằng một số ngôn ngữ so với các ngôn ngữ khác dễ dàng hơn.

Vì các tập lệnh CGI cần quyền thực thi, httpd theo mặc định chỉ cho phép các chương trình CGI trong cgi-binthư mục được chạy cho các mục đích bảo mật (có thể bây giờ bị nhầm lẫn).

Hầu hết các tập lệnh PHP chạy trong quá trình máy chủ web thông qua mod_php. Đây không phải là CGI.

CGI chậm vì chương trình (và thông dịch viên liên quan) phải được khởi động theo yêu cầu. Các lựa chọn thay thế hiện đại là thực thi nhúng, được sử dụng bởi mod_php và các quy trình chạy dài, được FastCGI sử dụng. Một ngôn ngữ nhất định có thể có cách thức riêng để thực hiện các cơ chế đó, vì vậy hãy chắc chắn hỏi xung quanh trước khi sử dụng CGI.


@Ignacio Vazquez-Abrams: nếu Giao diện CGI tạo ra một Quy trình mới, mỗi lần nó nhận được yêu cầu về Tài nguyên CGI so với sự khác biệt thực thi giữa CGI và mod_php ??????? CGI và mod_php có giống nhau không ???? hoặc có thể viết các tập lệnh PHP chạy trong Giao diện CGI không theo mod_php ???
hardik

@Hardik: mod_php chạy như một phần của HTTPd, chịu trách nhiệm cho các quy trình riêng của mình.
Ignacio Vazquez-Abrams

'chương trình bên ngoài' này là gì? nó có phải là trình thông dịch không nếu tôi chạy php với php-fpm?
slier 2/2/2015

@ trước đó: Đây là một chương trình tùy ý không phải là máy chủ web.
Ignacio Vazquez-Abrams

@ IgnacioVazquez-Abrams vì vậy có an toàn không khi cho rằng đó là một interpreternếu tôi đang chạy php với php-fpm?
slier 2/2/2015

7

Bạn có thể muốn biết những gì không phải là CGI và câu trả lời là MODULE cho máy chủ web của bạn (nếu tôi cho rằng bạn đang chạy Apache). VÀ ĐÓ LÀ SỰ KHÁC BIỆT LỚN, bởi vì CGI cần và chương trình bên ngoài, luồng, bất cứ điều gì để khởi tạo máy chủ ứng dụng PERL, PHP, C khi bạn chạy như một MODULE mà chương trình là máy chủ web (apache) mỗi lần.

Bởi vì tất cả điều này có rất nhiều vấn đề về hiệu suất, bảo mật, tính di động đi vào hoạt động. Nhưng thật tốt khi biết những gì không phải là CGI trước tiên, để hiểu nó là gì.


7

Một ví dụ thực tế: một cơ sở dữ liệu phức tạp cần được hiển thị trên một trang web. Vì cơ sở dữ liệu được thiết kế ở đâu đó vào khoảng năm 1986 (!), Rất nhiều dữ liệu được đóng gói theo nhiều cách khác nhau để tiết kiệm dung lượng đĩa.

Khi sự phát triển tiếp tục, các nhà phát triển không còn có thể giải quyết các yêu cầu dữ liệu phức tạp trong SQL, chẳng hạn vì các đại số sắp xếp là không bình thường.

Có ba giải pháp hợp lý:

  1. nhanh và bẩn: gửi dữ liệu chưa được lưu đến PHP, sắp xếp nó ở đó. Rõ ràng là một giải pháp rất tốn kém, bởi vì điều này sẽ được lặp lại mỗi khi trang được gọi
  2. viết một plugin cho công cụ cơ sở dữ liệu - nhưng quản trị viên chưa sẵn sàng cho phép mã nước ngoài chạy trên máy chủ của họ, hoặc
  3. bạn có thể xử lý dữ liệu trong một chương trình (C, Perl, v.v.) và HTML đầu ra. Chương trình tự đi vào / cgi-bin và được gọi trực tiếp bởi máy chủ web (ví dụ Apache), không thông qua PHP.

CGI chạy tập lệnh của bạn trong Giải pháp số 3 và xuất hiệu ứng cho trình duyệt. Bạn có tốc độ của chương trình được biên dịch, tính linh hoạt của ngôn ngữ tốt hơn SQL và không cần phải viết bổ trợ cho máy chủ SQL. (Một lần nữa, đây là một ví dụ cụ thể cho SQL và C)


1
Câu trả lời tốt nhất cho tôi, tôi đã nhận nó.
Daniel Katz

7

Một kịch bản CGI là một chương trình console / shell. Trong Windows, khi bạn sử dụng cửa sổ "Dấu nhắc lệnh", bạn sẽ thực thi các chương trình điều khiển. Khi một máy chủ web thực thi tập lệnh CGI, nó cung cấp đầu vào cho chương trình console / shell bằng các biến môi trường hoặc "đầu vào tiêu chuẩn". Đầu vào tiêu chuẩn giống như nhập dữ liệu vào chương trình console / shell; trong trường hợp tập lệnh CGI, máy chủ web sẽ gõ. Tập lệnh CGI ghi dữ liệu ra "đầu ra tiêu chuẩn" và đầu ra đó được gửi đến máy khách (trình duyệt web) dưới dạng trang HTML. Đầu ra tiêu chuẩn giống như đầu ra mà bạn thấy trong chương trình console / shell ngoại trừ máy chủ web đọc nó và gửi nó đi.

Một kịch bản CGI có thể được thực thi từ một trình duyệt. URI thường bao gồm một chuỗi truy vấn được cung cấp cho tập lệnh CGI. Nếu phương thức là "get" thì chuỗi truy vấn được cung cấp cho Tập lệnh CGI trong một biến môi trường có tên QUERY_STRING. Nếu phương thức là "bài" thì chuỗi truy vấn được cung cấp cho Tập lệnh CGI bằng cách sử dụng đầu vào tiêu chuẩn (Tập lệnh CGI đọc chuỗi truy vấn từ đầu vào tiêu chuẩn).

Việc sử dụng sớm các tập lệnh CGI là xử lý các biểu mẫu. Khi bắt đầu HTML, các biểu mẫu HTML thường có thuộc tính "hành động" và nút được chỉ định là nút "gửi". Khi nhấn nút gửi, URI được chỉ định trong thuộc tính "hành động" sẽ được gửi đến máy chủ với dữ liệu từ biểu mẫu được gửi dưới dạng chuỗi truy vấn. Nếu "hành động" chỉ định tập lệnh CGI thì tập lệnh CGI sẽ được thực thi và sau đó nó tạo ra một trang HTML.

RFC 3875 "Giao diện cổng chung (CGI)" xác định một phần CGI bằng C, như nói rằng các biến môi trường "được truy cập bởi thường trình thư viện C getenv () hoặc môi trường biến".

Nếu bạn đang phát triển tập lệnh CGI bằng C / C ++ và sử dụng Microsoft Visual Studio để làm điều đó thì bạn sẽ phát triển một chương trình điều khiển.


"Kịch bản CGI" là một thuật ngữ rộng và cũng có thể bao gồm các tệp thực thi.
71GA

6

CGI là một chương trình (hoặc API Web) bạn viết và lưu nó trên trang web của Máy chủ Web. CGI là một tập tin.

Tệp này nằm và chờ trên Máy chủ Web. Khi trình duyệt máy khách gửi yêu cầu đến Máy chủ Web để thực thi tệp CGI của bạn, Máy chủ Web sẽ chạy tệp CGI của bạn trên trang web của máy chủ. Các đầu vào cho chương trình CGI này, nếu có, là từ trình duyệt máy khách. Các đầu ra của chương trình CGI này được gửi đến trình duyệt.

Ngôn ngữ nào bạn sử dụng để viết chương trình CGI? Các bài viết khác đã đề cập đến c, java, php, perl, v.v.


4

Ý tưởng đằng sau CGI là một chương trình / tập lệnh (cho dù Perl hay thậm chí C) nhận đầu vào thông qua STDIN(dữ liệu yêu cầu) và xuất dữ liệu qua STDOUT(echo, printfstatement).

Lý do hầu hết các PHP scripts không đủ điều kiện là họ đang chạy theo PHP module Apache.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.