关于如何访问服务器端编程语言的说明


45

据我了解,任何通用编程语言都可以用于网站的服务器端开发。

我是否认为服务器只需要某种接口(例如CGI)以使服务器和编程语言协同工作就对吗?如果是这样,那么为什么某些编程语言(例如php)比其他编程语言更受欢迎?


2
这实际上与执行其他任何编程任务的原因相同。人们发明新的编程语言是因为他们不喜欢现有的编程语言。其他人则继续使用旧的,因为他们不喜欢相同的东西-或至少不足以切换。
Kilian Foth,2015年

因此,我会说某些语言(例如php)在设计时考虑到Web开发是正确的,因此对于常见应用程序来说是一种更简单(因此更受欢迎)的选择吗?
克里斯·

29
PHP是我所说的“浅”语言。基本结构很容易理解,并且有成百上千的小功能在起作用。因此,它吸引了新来者。与C#之类的语言相比,您必须学习诸如继承,面向对象,类型安全性和相对复杂的库之类的东西,才能在其中产生成果。
罗伯特·哈维

4
如果没有这样的界面,那么您仍然可以使用该语言编写服务器。
user253751 2015年

Answers:


75

在Web的早期,CGI确实是拥有动态内容的唯一(实用)方法(您可以创建命名文件管道-这些文件在cgi之前的几天就已经使用,但这根本不实用)。

CGI的工作原理是将一堆信息粘贴在分叉然后执行(可能在stdin中执行)的环境中,然后从stdout中提取出来并将其吐回到请求者。

这一点都不关心实现语言是什么。确实,我回想起以前用C或C ++编写的早期CGI。这有点痛苦。后来,我在90年代初学到了一些perl,而痛苦却大大减轻了。

在一定程度上这是可行的。问题是规模。每个CGI请求都是流程的派生和执行。成千上万的请求意味着成千上万的流程。那真的行不通。

解决方案是通过将分叉移动到Web服务器本身的线程中,或将请求分派到另一个处理该请求的进程而无需派生和执行,来删除分叉和执行。mod_perl是执行此操作的一种此类工具(将perl移至apache的插件)。Php(90年代后期)也通过将语言作为Web服务器本身的插件来实现,而不是通过分叉和超越实现。由于它很像perl(这是早期的主流Web编程语言),因此它非常受欢迎,并且可能胜过perl cgis。在90年代中期的这段时间里,仍然有相当多的势头-在更多的企业级应用程序服务器开始采用更正式的语言后,它们开始流行起来。如果你四处挖

这使我们进入了应用程序服务器,在该服务器中产生了内部线程(或其他方法-并非所有方法都如此)来处理请求,而不是整个新流程-可以帮助扩展。作为外部过程,在FastCGI中可以看到,然后在其他应用程序服务器中盛行。请注意,与此相关的是,应用程序服务器和Web服务器之间的界限有些模糊-许多应用程序服务器可以将其用作Web服务器,尽管并没有像传统Web服务器那样针对静态文件IO进行优化。

通用应用服务器也铺平了道路,其中,而不是解决方案的通用应用程序服务器,您必须对应用程序本身处于运行嵌入式web服务器或者以其他方式为整个部署。在这种情况下,人们不会在应用程序服务器上部署Web应用程序-它只是在运行自身并处理请求。同样,此模型的目标是避免启动应用程序新实例的沉重代价,而是使用重量更轻的线程或类似方法来处理应用程序内部的请求。

事情就是这样-所有解决方案在某种程度上都缺乏某种形式或形式。CGI虽然容易,但是在规模方面存在严重问题。Web服务器中的插件绑定到Web服务器本身(Apache,Nginx,IIS,...),并且失去了该语言的通用功能。微软有自己想推广的技术游行。而且,如果您知道一种语言,是不是宁愿继续用它编程,也不愿在堆栈的不同部分(客户端和Node.js中的javascript)使用不同的语言?

所以,今天到了。有些人在Java堆栈中工作(scala和clojure并不少见)。C#堆栈中的其他代码。JavaScript堆栈中的其他代码。有很多的PHP堆栈在那里。很多python。您仍然可以在其中找到一些perl堆栈(如果查看一些低容量的站点,您仍然会找到CGI)。借助云计算,Google还将Go推广为可行的服务器端网络语言。

每个都有其优点,缺点,其框架和服务器。随着技术的变化,这些潮起潮落的相对流行。他们做得很好。


这正是我想要的。全面且不受质疑的答案。谢谢!
克里斯·

1
“解决方案是将fork和exec循环移到Web服务器本身。” 不一定:FastCGI,反向代理是众所周知的解决方案,无需使用目标语言或Web服务器实现即可连接到应用程序服务器,这些解决方案使用指定的跨进程通信协议来完成其工作。
jhominal 2015年

1
@jhominal“ FastCGI不会为每个请求创建一个新进程,而是使用持久性进程来处理一系列请求。这些进程归FastCGI服务器所有,而不是Web服务器所有。” (来源)-它的核心,这就是应用程序服务器的工作。处理请求的持久性进程,无需执行fork和exec。

@MichaelT:您使用的是“ Web服务器”和“应用程序服务器”,就好像这些术语是可以互换的-在您的回答中,您使用“ Web服务器”主要是指apache,nginx-也就是说,通用的Web服务器软件(核心)有限的可编程性。
jhominal 2015年

1
我认为仅靠让每个应用程序成为其自己的网络服务器(现在很可能带有一个或多个HTTP代理)的做法(目前非常普遍)还不够。
hobbs 2015年

19

是的,任何通用编程语言都可以用来编写网站的服务器端部分。

但是,与其他主题一样,编程语言的质量通常只是促成其流行的众多因素之一。

例如,我认为PHP在网站上很受欢迎是因为:

  • 从静态网站升级到PHP动态网站非常容易-只需替换HTML文件的文件扩展名,将<?php标签放在开头,并且,如果已安装PHP,则您将拥有一个动态网站!其余工作流程与静态网站完全相同;
  • 由于易于部署,希望提出动态网站的Web主机选择了PHP,使其很快成为部署最广泛的服务器端平台。
  • 它在适当的时候进入了那个市场。

而且,一旦PHP广泛部署,就可以使用PHP编写更严格的Web应用程序,以从这种广泛的部署中受益,变得很有趣。

用一种更通用的方式说:语言采用通常是关于以下问题的答案:

  • 做我想做的事有多容易?
  • 我想做什么的语言得到了广泛的支持?

7

我是否认为服务器只需要某种接口(例如CGI)以使服务器和编程语言协同工作就对吗?

几乎。您需要一个具有某种软件的Web服务器,以使其也能够响应HTTP请求。

考虑如何提供静态页面。服务器检索HTTP请求,根据HTTP服务器的配置从文件系统中查找请求的文档,然后返回静态页面。

CGI通过允许您在文件系统上指定一个可以存储可执行文件或脚本的cgi-bin文件夹,扩展了此概念。当您通过CGI访问程序时,HTTP服务器将运行进程或脚本并将标准输出传递回客户端,而不是简单地处理静态文档。

 If so then why are some programming languages (such as php) more popular than others?

旧的CGI结构无法很好地扩展大量请求。出于各种原因,存在用于Web的不同编程语言和框架,并且每种语言都做得很好。由于历史原因,PHP之所以流行,是因为它是第一种简单易行的廉价解决方案,用于在不依靠CGI的情况下提供动态页面,并且具有广泛的托管支持。ASP在Microsoft圈子中很受欢迎,因为它允许VB开发人员将其技能转移到Web上。ASP.NET(Web窗体)使Windows Forms开发人员(其中很多是VB编码人员)可以轻松切换到Web。


3

当浏览器发出HTTP请求时,它看起来像这样:

GET /search?q=cats HTTP/1.0
Host: www.google.com
Connection: close

…服务器应向其发送如下响应:

HTTP/1.0 200 Success
Content-Type: text/html; charset=UTF-8
Content-Length: 1337

<!DOCTYPE html>
<html>
  <head><title>cats - Google Search</title>
  <body>
    <h1>About 415,000,000 results</h1>
    …
  </body>
</html>

在服务器上运行的,侦听TCP套接字上的请求,读取请求并以适当的响应进行答复的任何代码就足够了。一种愚蠢的方法是使用shell脚本向所有连接到TCP端口80的用户发出固定的响应:

$ nc -l 8000 <<'RESPONSE'
HTTP/1.0 200 Success
Content-Type: text/html; charset=UTF-8
Content-Length: 1337

<!DOCTYPE html>
<html>
  <head><title>cats - Google Search</title>
  <body>
    <h1>About 415,000,000 results</h1>
    …
  </body>
</html>
RESPONSE

当然,该技术似乎几乎不符合HTTP协议

这个简单的Python程序比这种罐头响应更进一步,该程序使用http.serverPython 3中的库。

#!/usr/bin/python3

import http.server

class Handler(http.server.BaseHTTPRequestHandler):
    def do_GET(self):
        payload = '<!DOCTYPE html>... insert cats here ...'.encode('UTF-8')
        self.send_response(200)
        self.send_header('Content-Type', 'text/html; charset=UTF-8')
        self.send_header('Content-Length', len(payload))
        self.end_headers()
        self.wfile.write(payload)

http.server.HTTPServer(('', 80), Handler).serve_forever()

HTTP服务器可以用任何语言编写。这只是一个例子。显然,这个例子非常基础。有效负载是硬编码的-程序完全忽略了请求的内容-URL,查询字符串,Accept-Language标头等。您可以添加代码以基于请求生成有意义的响应,但是随后代码将变得非常有用。复杂。此外,程序员宁愿专注于编写Web应用程序,而不必担心如何处理HTTP请求的细节。

更合适的解决方案是使用Web服务器,例如Apache HTTPDIISnginx。Web服务器只是一个程序,它侦听相关的TCP套接字,接受多个请求(可能同时),并根据请求URL,标头和其他规则决定如何生成响应。理想情况下,许多细节(例如SSL,访问控制和资源限制)是通过配置而不是代码来处理的。在很多时候,Web服务器都会制定一个仅包含文件系统中文件内容的响应。

但是,对于动态内容,可以将Web服务器配置为执行一些代码以生成响应。使用CGI的一种机制是-服务器根据请求设置一些环境变量,执行程序,并将其输出复制到TCP套接字。稍微复杂一点的解决方案是拥有一个模块,该模块为Web服务器增加了对以另一种编程语言(例如Apache的mod_php)调用代码的支持。还有另一种选择是以与Web应用程序相同的语言编写Web服务器,在这种情况下,请求分发只是一个函数调用。node.js和Java servlet引擎(例如Apache Tomcat)就是这种情况。

技术的选择实际上取决于您,并且取决于您喜欢使用的编程语言,可供您使用的托管环境,性能要求,流行观点以及时时流行。例如,由于启动外部程序的需要限制了可伸缩性,最近CGI并没有受到青睐。


1

Web服务器是用任何编程语言编写的程序,该程序通过遵循标准/应用程序级别协议(HTTP等)的套接字来处理“ Web流量”。大多数编程语言都提供创建套接字的功能。

我是否认为服务器只需要某种接口(例如CGI)以使服务器和编程语言协同工作就对吗?

不需要专用的服务器程序和您的应用程序-它们可以相同(忽略任何与性能相关的问题)。


0

您甚至可以在用C(或C ++,另请参见Wt)编码的程序中使用某些HTTP服务器库,例如libonion。还有一些HTTP客户端库(例如libcurl

您可以使用其他HTTP库,如ocsigenocamlnetOCaml的

有几种Web专用语言(在PHP之外),例如OpaHOPKaya等...(HOP和Opa都可以轻松地混合服务器端和浏览器端的计算,但是您必须在Windows中痛苦地手动进行此操作PHP,显式使用AJAX技术并为浏览器手动编码一些Javascript。相比之下,HOP,Opa,Ocsigen可以生成该Javascript。

您还可以使用FASTCGI技术向某些Web服务器添加一些动态服务... FASTCGI比普通的CGI更好,后者为每个传入的HTTP请求启动一个新进程,而FASTCGI应用程序可以在同一进程中处理许多HTTP请求。顺便说一句,可以将PHP配置为FASTCGI应用程序。

C.Queinnec观察到,网络浏览和继续与两者之间有着显着的关系。

PS。我不喜欢PHP,而且我相信它的流行有历史和社会原因(主要不是技术原因)。确实,PHP在AJAX广泛使用之前就已经广泛传播,并且比HOP或Opa(或Ocsigen)更早。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.