PHP和Python部署方式与性能对比 您所在的位置:网站首页 Php性能很差吗 PHP和Python部署方式与性能对比

PHP和Python部署方式与性能对比

2024-07-10 23:22| 来源: 网络整理| 查看: 265

PHP和Python是两种最主要的web编程语言,它们都很古老(PHP:1995,python:1991)。PHP为web而诞生,技术成熟稳定,但这位曾经的web之王的市场正在被python,nodejs,ruby等一点点蚕食。Python则比较万能,社区百花齐放,web开发是其一项重要的功能。虽然都是服务端脚本语言,但他们在运行方式上有很大的差别。本文介绍PHP和python web最流行的部署方式并对比它们的性能。

CONTENTS PHP 部署 php-fpm nginx opcache 配置 测试 persistent connection 测试 非持久连接html/mysql1.php 持久连接html/mysql2.php python wsgi 部署 gunicorn 使用nginx代理 性能测试 php与python web的性能对比 reference PHP

PHP脚本需要解释器解释执行,SAPI(Server API)是调用php解释器的统一接口,无论是在CLI执行php脚本还是服务器端运行php脚本,都是通过SAPI启动php解释器。服务端执行php最流行的方式是通过nginx+php-fpm的模式,php-fpm是php自带的用c写的一个fast-cgi的实现。对于php-fpm,它的生命周期是这样的:

while(accept(request)) { // ... php_execute_script(script) // ... } 作为一种fast-cgi,php-fpm包括master进程和子进程,子进程负责处理请求,每个子进程是常驻内存的,也就是php的解释器只需要启动一次,同时也让mysql持久连接成为可能。

php解释器的核心就是zend引擎,启动zend引擎前后需要做大量的初始化和收尾工作,在上面略过了。php_execute_script函数会调用zend_compile_file将php脚本编译成opcode,然后调用zend_execute解释执行,这也是为什么php web支持热升级,即更新php脚本后立即生效。但是,每个请求都需要编译一遍php脚本的效率低,于是有了opcache。

nginx作为HTTP服务器,解析HTTP请求,转换成fcgi协议(通过环境变量传递请求的参数),并通过fcgi-pass转发给php-fpm,php-fpm默认监听端口9000。

部署 php-fpm

通过包管理器(比如yum,apt-get)安装php后,php-fpm就可以直接用了。 在我系统(arch linux)上,php-fpm的配置文件位于/etc/php/php-fpm.conf,该文件中包含一些全局配置,比如error_logs设置错误日志的位置。

php-fpm支持多个进程池,每个进程池由一个master进程管理,不同进程池监听不同的端口,并且可以分别控制具体的行为。

/etc/php/php-fpm.d/www.conf是www进程池的配置,以下是一些比较关键的配置项。

listen = 127.0.0.1:9000 listen.backlog = 511 pm = dynamic pm.max_children = 5 listen.backlog表示完成三次握手后等待accept的最大连接数(针对linux系统),代表能同时连接的用户数。 pm是fpm的关键,它控制子进程数,dynamic顾命思议就是根据当前请求压力动态调整,可以通过pm.max_children设置上限,这个值代表能同时处理的请求数,建议设为cpu核数。除了dynamic,还有static和ondemand。除此之外,还有很多选项可以精确控制子进程的行为。

php-fpm的功能很强大,设计上与nginx类似:

多进程,单线程模式 使用事件驱动接收请求,能根据当前平台自动在epoll,poll,select中选择最佳的机制 高度自定义access log

除此之外还包括其他一些优点:

显示进程池的实时状态(支持json) 输出慢日志 动态控制子进程数

说完了配置,该说怎么运行。直接在命令行执行php-fpm即可启动。如果安装包同时包含了php-fpm的init脚本,则可以通过/etc/init.d/php-fpm start启动,或者使用service包装器(centos):service php-fpm start。

注意:无论是修改php的配置(php.ini)还是php-fpm自身的配置,都需要重启php-fpm。

nginx

最简单的方式同样是通过包管理器安装。

nginx的配置文件位于/etc/nginx/nginx.conf。 在server块里配置:

location / { root html; index index.html index.htm; } location ~ \.php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } ~ \.php$表示后缀为.php的请求都会路由到这个location,root即文档根目录,一般也是php文件所在的根目录,如果是相对路径,则表示相对于nginx的prefix。prefix默认值是nginx的安装目录,也可以在启动nginx的时候使用-p选项设置。 fastcgi_param设置了SCRIPT_FILENAME变量,它的值就是php脚本的绝对路径。比如,root目录位于/home/www/scripts/php/,访问127.0.0.1/a/b.php,则SCRIPT_FILENAME的值为/home/www/scripts/php/a/b.php。 fastcgi_params中通过fastcgi_param指令设置了fcgi协议规定的其他变量,比如REQUEST_METHOD。nginx通过环境变量的方式将这些参数传递给php-fpm。

在文档根目录下创建一个php文件:

$ cat html/index.php


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有