据我了解,任何通用编程语言都可以用于网站的服务器端开发。
我是否认为服务器只需要某种接口(例如CGI)以使服务器和编程语言协同工作就对吗?如果是这样,那么为什么某些编程语言(例如php)比其他编程语言更受欢迎?
据我了解,任何通用编程语言都可以用于网站的服务器端开发。
我是否认为服务器只需要某种接口(例如CGI)以使服务器和编程语言协同工作就对吗?如果是这样,那么为什么某些编程语言(例如php)比其他编程语言更受欢迎?
Answers:
在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推广为可行的服务器端网络语言。
每个都有其优点,缺点,其框架和服务器。随着技术的变化,这些潮起潮落的相对流行。他们做得很好。
是的,任何通用编程语言都可以用来编写网站的服务器端部分。
但是,与其他主题一样,编程语言的质量通常只是促成其流行的众多因素之一。
例如,我认为PHP在网站上很受欢迎是因为:
<?php
标签放在开头,并且,如果已安装PHP,则您将拥有一个动态网站!其余工作流程与静态网站完全相同;而且,一旦PHP广泛部署,就可以使用PHP编写更严格的Web应用程序,以从这种广泛的部署中受益,变得很有趣。
用一种更通用的方式说:语言采用通常是关于以下问题的答案:
我是否认为服务器只需要某种接口(例如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。
当浏览器发出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.server
Python 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 HTTPD,IIS或nginx。Web服务器只是一个程序,它侦听相关的TCP套接字,接受多个请求(可能同时),并根据请求URL,标头和其他规则决定如何生成响应。理想情况下,许多细节(例如SSL,访问控制和资源限制)是通过配置而不是代码来处理的。在很多时候,Web服务器都会制定一个仅包含文件系统中文件内容的响应。
但是,对于动态内容,可以将Web服务器配置为执行一些代码以生成响应。使用CGI的一种机制是-服务器根据请求设置一些环境变量,执行程序,并将其输出复制到TCP套接字。稍微复杂一点的解决方案是拥有一个模块,该模块为Web服务器增加了对以另一种编程语言(例如Apache的mod_php)调用代码的支持。还有另一种选择是以与Web应用程序相同的语言编写Web服务器,在这种情况下,请求分发只是一个函数调用。node.js和Java servlet引擎(例如Apache Tomcat)就是这种情况。
技术的选择实际上取决于您,并且取决于您喜欢使用的编程语言,可供您使用的托管环境,性能要求,流行观点以及时时流行。例如,由于启动外部程序的需要限制了可伸缩性,最近CGI并没有受到青睐。
您甚至可以在用C(或C ++,另请参见Wt)编码的程序中使用某些HTTP服务器库,例如libonion。还有一些HTTP客户端库(例如libcurl)
您可以使用其他HTTP库,如ocsigen&ocamlnet为OCaml的。
有几种Web专用语言(在PHP之外),例如Opa,HOP,Kaya等...(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)更早。