php - 引导Web应用程序-PHP,Ruby,Python,Node.js

标签 php python ruby node.js

假设1:通过apache或nginx运行PHP时,每个传入请求都会导致脚本自举其所有包含文件,因此基本上没有共享内存,并且每次请求都会“重新创建世界”。

假设2:启动服务器时,将引导Node.js应用程序。 “世界仅创建一次”。

Python和Ruby应用程序是否以与PHP或Node.js类似的方式进行引导?

如果可能的话,不胜感激有关术语的一些指导:这基本上是多线程或并发支持的问题吗?

最佳答案

这完全取决于应用程序的运行方式。

Python中的大多数Web应用程序都是作为接收请求的服务器运行的,而不是作为按需调用的“死”脚本。 “在请求到达之前创建了世界”。

请注意,正如您所说的,我并不是说“只有一次”。

我之所以这样说,是因为有多种服务python Web应用程序的方法。

大多数python(web)应用程序都是'WSGI'应用程序。 WSGI是一个规范,它基本上要求应用程序(或框架)具有单个入口点功能:

def app(environment, start_response):

其中environment是所有内容,例如被询问的地址,cookie,请求类型,查询参数等。start_response是一个回调函数,app函数需要使用响应HTTP代码和 header 进行调用。
    start_response('200 OK', [('Content-type', 'text/html')])

例如。调用此方法后,该函数要么需要return将响应的正文发送回客户端,要么需要yield将其作为生成器发回(用于超大文件)。

所有这些通常由WSGI框架处理,该框架透明地完成所有工作,并为编写应用程序逻辑提供了更易于编写的接口(interface)。

在PHP中,所有路由和路由通常由运行单个脚本文件的apache(或nginx/php-fpm)处理。正如您正确建议的那样,每次都需要重新创建整个世界。使用WSGI,世界已经创建,并且WSGI每次收到新请求时都简单地调用应用程序函数。大多数基于python的Web框架都有某种路由器,即flask样式:
@app.route('/elephants')
def elephants_view():
    return 'view the elephants!'

或Django样式路由表:
urls = [
    (r'^/kangaroos$', 'views.kangaroos'),
    ]

# in views.py:
def kangaroos():
    return 'kangaroos, baby!'

或其他方式。有许多不同的WSGI框架各有优缺点。一些流行的基于WSGI的框架包括FlaskDjangoFalcon

有多种服务WSGI应用程序的方法。 Flask&Django带有基本的开发服务器,这些服务器是单线程的,非常适合开发,但不适合生产。

由于它们是单线程的,因此“世界仅创建一次”。因此,全局变量会在请求之间持续,等等。

还有许多其他WSGI服务器,它们可以为WSGI之上的任何框架提供服务。 Waitress是一个很棒的纯python脚本。 uWSGIgUnicorn以及其他许多服务器一样,是另一个生产级服务器。

这些服务器不保证在请求之间共享全局状态,并且将“创建世界”次数未指定(可配置)。其中一些使用固定数量的工作线程,主传入接收者会将这些请求传递给其他工作线程,其他一些线程可能会根据需要启动新的工作线程或进程。

Flask和大多数其他Python WSGI框架确实具有'Application Globals'的概念,这是您可以存储必须在整个服务器生命周期内保持的数据的方式。这些特殊值在“世界”之间共享。 (通过在森林中使用魔术环和水池)。

(旁注:为了好玩,我使用非常酷的gevent异步库started writing a WSGI server,它与Node.js的工作方式相同,因为它只是一个进程,它尽可能多地异步执行(尽管没有Node .js回调样式...)。它非常短,只有一个文件,因此很容易看出它们的工作原理。

Ruby在这种方式上与Python非常相似,不同之处在于协议(protocol)称为“Rack”而不是WSGI,并且通用服务器为“Puma”,“Unicorn”和“Rainbows!”。常见的基于Ruby Rack的框架是“Ruby on Rails”,“Sinatra”和“Merb”。

这种模型的优点之一是,您可以创建“中间件”,该中间件位于应用程序响应程序和WSGI(或Rack)服务器之间,并在途中“处理”请求(例如,缩小javascript,缓存,记录,身份验证等)。

关于WSGI及其工作原理的另一个很好的介绍是在Full stack Python中。

除了使用WSGI(或Rack)之外,还有其他编写Web服务器的方法。例如,Python中的TornadoTwisted框架允许编写完全不同的(web)应用异步样式。他们还使用“在请求进入之前创建世界”样式的服务器。

关于php - 引导Web应用程序-PHP,Ruby,Python,Node.js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24645631/

相关文章:

python - 如何在Python中使用正则表达式更改文件名?

ruby-on-rails - 使用 rspec 测试具有子域约束的​​路由

ruby-on-rails - 使用 Rails 的新 recaptcha 的工作示例?

php - 从数据库字符串输入中删除信息

php - PDO 准备语句参数中的单引号转义

python - 匿名同情表达

python - 根据另一个具有不完整值的较短列表对列表进行排序

Ruby:将日期数组转换为包含每天出现次数的数组

php - 如何选择从mysql以php形式获取的值来更新数据

javascript - 删除项目后无法将其重新添加到购物篮(数组)