php 与apache交互_apache 和php 交互 - CSDN
精华内容
参与话题
  • apache与php的通信过程

    千次阅读 2014-10-24 17:34:16
    apache与php的通信方式有3中

    apache与php的通信方式有3中:

    cgi模式      cgi、fast-cgi 

    非cgi模式  module


    cgi模式中:

    cgi模式每次请求到达apache、apache启动cgi 发送代码 解释器计算 返回数据给apache 也就是fork-execute模式

    这种模式速度慢(php解释器不是常驻内存的)、占用空间(请求一次开启一次cgi)。已经被fast-cgi代替


    fast-cgi 模式 :

    fast-cgi 是常驻内存 与apache是两个独立的进程 ,通过端口进行通信。

    *unix 下有 php-fpm 

    windows下有php-cgi    默认处理500次后自动退出 需要进程守护程序自动打开新的php-cgi(win上面是相当蛋疼的)

    nginx就是以这种方式与php通信的

    运行速度快,apache与php独立运行 php挂掉不会影响apache的运行

    但是在交互过程中会出现偏差


    module模式:load module php5apache2_2.dll

    php作为apache的一个模块运行,随apache一起启动,属于一个进程,之间的通信是内部通信。


    nginx与php通信需要与 php的cgi通信

    win下面是php-cgi *unix下面有php-fpm或者其他的

    启动php cgi进程:

    php-cgi -d 端口号

    nginx配置:

     location ~ \.php$ {							# php结尾的文件进行下面配置指定的方式处理
        root           html;
        fastcgi_pass   127.0.0.1:php-cgi端口;				# fastcgi的地址以及端口 便于通信
        fastcgi_index  index.php; 						# 默认文件
        #指定php中$_SERVER数组中SCRIPT_FILENAME的值
        #请求到nginx后 nginx将文件通过php解释器处理 这时候相当于nginx与php的通信
        #传递的参数就不同 
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name; 
        include        fastcgi_params;
    }

    这时候需要对php.ini进行一些修改

    fastcgi.impersonate = 1;

    开启这个选项就ok,选项具体的意思:

    fastcgi.impersonate string
    
    FastCGI under IIS supports the ability to impersonate security tokens of the calling client. 
    IIS下的fastcgi支持 模仿 客户端安全令牌的能力
    This allows IIS to define the security context that the request runs under. 
    允许定义 IIS所发送请求的安全性上下文环境
    mod_fastcgi under Apache does not currently support this feature (03/17/2002) Set to 1 if running under IIS. 
    Default is zero.

    也就是在cgi模式要开启这个选项

    相关的其他参数解释:

    fastcgi.impersonate string 默认关闭
    
    FastCGI under IIS supports the ability to impersonate security tokens of the calling client. 
    IIS下的fastcgi支持 模仿 客户端安全令牌的能力
    This allows IIS to define the security context that the request runs under. 
    允许定义 IIS所发送请求的安全性上下文环境
    mod_fastcgi under Apache does not currently support this feature (03/17/2002) Set to 1 if running under IIS. 
    Default is zero.
    
    cgi模式下模拟数据与web服务器通信
    ----------------------------------------------------------
    cgi.force_redirect boolean 默认开启
    
    cgi.force_redirect is necessary to provide security running PHP as a CGI under most web servers.
    有必要在web服务器下提供安全的将php作为CGI运行 
    Left undefined, PHP turns this on by default. You can turn it off at your own risk.
    
    -----------------------------------------------------------
    cgi.fix_pathinfo boolean 默认开启
    Provides real PATH_INFO/ PATH_TRANSLATED support for CGI. 
    PHP's previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok what PATH_INFO is. For more information on PATH_INFO, see the CGI specs.
    php的处理是将SCRIPT_FILENAME设置为PATH_TRANSLATED 且不去分析path_info的值
    Setting this to 1 will cause PHP CGI to fix its paths to conform to the spec. 
    A setting of zero causes PHP to behave as before. It is turned on by default. 
    You should fix your scripts to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
    
    开启这个使CGI模式对PATH_INFO类型的url的支持



    奋斗

    展开全文
  • 我们都知道,PHP需要在具体的WEB服务器中才能运行,例如Nginx、Apache等,但是PHP是怎样启动,又是怎样在服务器中运行,然后两者又是怎样进行交互的呢?   1. WEB服务器调用PHP接口  以Apache服务器为例,我们看...

      大家都知道,PHP需要在具体的WEB服务器中才能运行,例如Nginx、Apache等,但是PHP是怎样启动,又是怎样在服务器中运行,然后两者又是怎样进行交互的呢?
      
    1.WEB服务器调用PHP接口
      以Apache服务器为例,我们看看该服务器是怎样启动PHP,并调用PHP中的方法。Apache服务器启动并运行PHP时,一般是通过mod_php7模块的形式集成(如果是php5.*版本,就是mod_php5模块,模块后缀名根据php版本而定),mod_php7的结构如下(源码路径为php/sapi/apache2handler/mod_php7.c):

    AP_MODULE_DECLARE_DATA module php7_module = {
        STANDARD20_MODULE_STUFF,/* 宏,包括版本,版本,模块索引,模块名,下个模块指针等信息 */
        create_php_config,      /* create per-directory config structure */
        merge_php_config,       /* merge per-directory config structures */
        NULL,                   /* create per-server config structure */
        NULL,                   /* merge per-server config structures */
        php_dir_cmds,           /* 模块定义的所有指令 */
        php_ap2_register_hook   /* register hooks */
    };

      当Apache需要调用PHP中的方法时,只需要将该请求通过mod_php7模块传达给PHP,PHP层处理完后将数据返回给Apache,整个过程就结束了(补充一下:Apache服务器启动PHP时,其实有两种加载方式,一种为静态加载,一种为动态加载,刚才讨论的mod_php5模块加载方式可以理解为静态加载,也就是需要重新启动Apache服务器,才能将PHP加载进去;动态加载不需要重启服务器,只需要通过发送信号的方式将PHP固定的模块加载到服务器,以达到PHP启动的目的,但是在进行动态加载前,需要将加载模块编译成动态链接库,然后将其配置到服务器的配置文件中)。上面已经给出Apache在PHP中的model结构,下面给出Apache服务器中对应的module结构,如下(该源代码在Apache中,下同):

    struct module_struct {
        int version;
        int minor_version;
        int module_index;
        const char *name;
        void *dynamic_load_handle;
        struct module_struct *next;
        unsigned long magic;
        void (*rewrite_args) (process_rec *process);
        void *(*create_dir_config) (apr_pool_t *p, char *dir);
        void *(*merge_dir_config) (apr_pool_t *p, void *base_conf, void *new_conf);
        void *(*create_server_config) (apr_pool_t *p, server_rec *s);
        void *(*merge_server_config) (apr_pool_t *p, void *base_conf, void *new_conf);
        const command_rec *cmds;
        void (*register_hooks) (apr_pool_t *p);
    }

      可以看得出php7_module和module_struct还是有很大不同,不过如果看到php7_module.STANDARD20_MODULE_STUFF这个宏的定义方式,你可能就会觉得这两个结构体很像,其实这个宏定义了module_struct中的前8个参数,定义如下:

    #define STANDARD20_MODULE_STUFF MODULE_MAGIC_NUMBER_MAJOR, \
        MODULE_MAGIC_NUMBER_MINOR, \
        -1, \
        __FILE__, \
        NULL, \
        NULL, \
        MODULE_MAGIC_COOKIE, \
        NULL /* rewrite args spot */

      然后php7_module.php_dir_cmds定义了模块的所有指令集合,具体定义内容如下(代码路径为php/sapi/apache2handler/apache_config.c):

    const command_rec php_dir_cmds[] =
    {
        AP_INIT_TAKE2("php_value", php_apache_value_handler, NULL, OR_OPTIONS, "PHP Value Modifier"),
        AP_INIT_TAKE2("php_flag", php_apache_flag_handler, NULL, OR_OPTIONS, "PHP Flag Modifier"),
        AP_INIT_TAKE2("php_admin_value", php_apache_admin_value_handler, NULL, ACCESS_CONF|RSRC_CONF, "PHP Value Modifier (Admin)
        "),
        AP_INIT_TAKE2("php_admin_flag", php_apache_admin_flag_handler, NULL, ACCESS_CONF|RSRC_CONF, "PHP Flag Modifier (Admin)"),
        AP_INIT_TAKE1("PHPINIDir", php_apache_phpini_set, NULL, RSRC_CONF, "Directory containing the php.ini file"),
        {NULL}
    };

      也就是说,PHP层只给Apache提供了上述5个指令,每个指令的实现源码也在apache_config.c文件中,最后就剩php7_module.php_ap2_register_hook了,它定义的内容如下(代码路径为php/sapi/apache2handler/mod_php7.c):

    void php_ap2_register_hook(apr_pool_t *p)
    {
        ap_hook_pre_config(php_pre_config, NULL, NULL, APR_HOOK_MIDDLE);
        ap_hook_post_config(php_apache_server_startup, NULL, NULL, APR_HOOK_MIDDLE);
        ap_hook_handler(php_handler, NULL, NULL, APR_HOOK_MIDDLE);
    #ifdef ZEND_SIGNALS
        ap_hook_child_init(zend_signal_init, NULL, NULL, APR_HOOK_MIDDLE);
    #endif
        ap_hook_child_init(php_apache_child_init, NULL, NULL, APR_HOOK_MIDDLE);
    }

       php7_module.php_ap2_register_hook函数包含4个钩子和对应的处理函数,pre_config,pre_config、post_config和child_init是启动钩子,它们是在服务器启动时调用,handler钩子是请求挂钩,它是在服务器请求是调用,通过这些钩子,就可以通过Apache服务器启动PHP。
       将到这里,想必大家已经知道WEB服务器是如何启动PHP,并调用PHP中的方法了哈,下面再给大家讲讲PHP是如何调用WEB服务器接口的。

    2.PHP调用WEB服务器接口
      在讲述这个问题前,我们需要了解一下什么是SAPI。SAPI其实是与服务器抽象层之间遵守的共同约定,可以这么简单理解,当PHP需要调用服务器中的方法,例如清除缓存,但是清除缓存的实现方法是在服务器中实现,PHP层根本就不知道怎么调用服务器中的该方法,怎么办?这时双方需要进行约定,然后服务器提供一套约定后的接口给PHP,我们把这些与服务器抽象层之间遵守的共同约定称为SAPI接口。
      问题来了,对于服务器Apache,我们可以提供一套SAPI,但是如果下次又来个其它的服务器,或者其它的“第三方”,那么我们是不是也要给他们提供一套单独的SAPI呢?我们聪明的PHP开发者肯定想到了这一点,即对所有的“第三方”提供一套通用的SAPI接口,但是你可以会问,如果新的“第三方”需要的接口,你的通用SAPI不支持,那怎么办呢,我的理解是将新的功能添加到PHP的通用SAPI接口中,仅仅是个人见解哈,通用SAPI结构如下(源码路径: php/main/SAPI.h):

    struct _sapi_module_struct {
        char *name;         // 名字
        char *pretty_name;  // 更好理解的名字
        int (*startup)(struct _sapi_module_struct *sapi_module);    // 启动函数
        int (*shutdown)(struct _sapi_module_struct *sapi_module);   // 关闭函数
        int (*activate)(TSRMLS_D);           // 激活
        int (*deactivate)(TSRMLS_D);         // 停用
        void (*flush)(void *server_context); // flush
        char *(*read_cookies)(TSRMLS_D);     //read Cookies
        //...
    };

      该结构体变量较多,就不一一列举,简要说明一下里面的变量:startup函数是当SAPI初始化时会被调用,shutdown函数是用来释放SAPI的数据结构和内存等,read_cookie 是在SAPI激活时被调用,然后将此函数获取的值赋值给SG(request_info).cookie_data。那么对于PHP提供的通用SAPI,Apache服务器又是怎样定制自己的接口呢?具体结构如下(源码路径为php/sapi/apache2handler/sapi_apache2.c):

    static sapi_module_struct apache2_sapi_module = {
        "apache2handler",
        "Apache 2.0 Handler",
    
        php_apache2_startup,            /* startup */
        php_module_shutdown_wrapper,    /* shutdown */
    
        NULL,                           /* activate */
        NULL,                           /* deactivate */
    
        php_apache_sapi_ub_write,       /* unbuffered write */
        php_apache_sapi_flush,          /* flush */
        php_apache_sapi_get_stat,       /* get uid */
        php_apache_sapi_getenv,         /* getenv */
    
        php_error,                      /* error handler */
    
        php_apache_sapi_header_handler, /* header handler */
        php_apache_sapi_send_headers,   /* send headers handler */
        NULL,                           /* send header handler */
    
        php_apache_sapi_read_post,      /* read POST data */
        php_apache_sapi_read_cookies,   /* read Cookies */
    
        php_apache_sapi_register_variables,
        php_apache_sapi_log_message,        /* Log message */
        php_apache_sapi_get_request_time,   /* Request Time */
        NULL,                               /* Child Terminate */
    
        STANDARD_SAPI_MODULE_PROPERTIES
    };

      上述源码目录php/sapi/apache2handler/中,目录php/sapi下面放的都是通过SAPI调用的“第三方”,该目录结构如下图所示,目录php/sapi/apache2handler中都是与PHP交互的接口,sapi_apache2.c是PHP与Apache约定的SAPI接口文件。
      这里写图片描述
     看到这里,大家应该基本清楚PHP层是怎样调用服务器层的接口,为了巩固上面的知识,下面举个栗子,即在Apache服务器环境下读取cookie:

    SG(request_info).cookie_data = sapi_module.read_cookies(TSRMLS_C);

      对于任意一个服务器在加载时,我们都会指定sapi_module,Apache的sapi_module是apache2_sapi_module,它的read_cookies方法的是php_apache_sapi_read_cookies函数,这样就实现PHP层调用Apache的接口,是不是很简单呢:)
      
    3.后记
      这篇博文是我参考《深入理解PHP内核》一书总结的,参考的内容为第二章第二节“SAPI概述”,不过我感觉该书中这部分内容讲的有点绕,我重新编排了,然后提取了里面的重点,并加入个人见解,如果在该文中有哪些讲的不对的地方,希望能帮我指出来,大家共同提高哈,谢谢!

    参考: http://www.php-internals.com/

    展开全文
  • Web服务器环境的搭建

    万次阅读 2016-12-20 08:42:59
     动态网站指:数据库交互的网站,比如:京东、淘宝等  静态网站指:纯静态的html页面,没有数据库交互,不能进行增删改查   软件指:给用户提供服务的一款应用,可以说电脑桌面上

    理解网站和软件的分类

          网站指:一个由若干htmlcssjsimg以及服务器端语言开发完成的软件

      网站的分类:动态网站和静态网站

      动态网站指:与数据库交互的网站,比如:京东、淘宝等

                  静态网站指:纯静态的html页面,没有与数据库交互,不能进行增删改查      

      软件指:给用户提供服务的一款应用,可以说电脑桌面上能看到的一切都是软件

      软件的分类:B/S架构和C/S架构

      B/S架构软件指:浏览器与服务器架构的软件,例如:淘宝、百度、京东等

      C/S架构软件指:客户端与服务器架构的软件,例如:QQ、酷狗等

     

     

     

    了解http协议

    HTTP协议就是超文本传送协议,是一种详细规定了浏览器和万维网服务器之间   互相通信的规则,通过因特网传送超文本的数据传送协议。

    网站如何访问?

    条件:两台电脑,互联(网线物理连接),浏览器存在一台电脑上,服务器软件在另外一台电脑

     

     

    理解服务器、客户端、浏览器

    服务器指:给用户提供上网服务并且能给服务器端语言提供运行平台的一个软件,比如:小明打开电脑进入百度,百度就是服务器

    客户端指:上网的终端,也就是用户,上述例子中,小明就是客户端

    浏览器指:用户用来上网的工具,比如:IE、火狐、谷歌等等

     

     

    搭建服务器环境

    服务器环境

    服务器环境指的是由多种服务共同工作来实现一系列完整的服务。

     

    服务器环境分为两种

    集成环境:一体式安装

    优点:安装简单方便

    缺点:不安全,功能缺失(配置项不全)

     

    独立环境:独立安装三个部分(Apache+php+mysql),需要对三个内容进行配置,变成一个“环境”,能够对外提供动态网站服务。

    独立环境分为两种

    wampwindows + Apache + mysql + phpwindows下的amp,常用于开发。

    lampLinux +Apache + mysql +phpLinux下的amp,常用于服务器。

     

    环境使用的选择

    开发阶段使用集成环境

    生产阶段使用独立环境(上线)

     

    程序员独立开发:集成环境

    服务器端运行:独立环境

     

    安装Apachemysqlphp,并且配置实现三者的关联。

     

    第一步,在E下面新建文件夹,命名为server,server下面新建三个文件夹,分别命名为apache 、 php5 mysql

     

     

    安装Apache

    双击

     

     

     

      

     

     

     

     

     

     

     

     

    打开浏览器,输入localhost,出现以下提示

     

    分析以上文件运行结果,发现来自于E:/server/apache/htdocs/index.html

     

    可以对其进行修改

     

     

    运行如下:

     

    Apache的目录结构

     

    安装PHP

     

    把以上所标示文件复制到E:/server/php5目录下,解压

     

     

    php.ini-development文件复制一份,改名为

     

     

    Apache绑定php

    1. Apache在加载的时候,将PHP模块给加载进来。

    Apache的配置文件httpd.conf下面增加php模块

    语法:LoadModule php5_module PHP路径(php提供给Apache的接口)

    1. Apachephp模块分配任务:将php文件(以.php为文件后缀的文件),交给php模块处理。

       语法:AddType application/x-httpd-php  .php

    1. Apache加载php的配置文件。

    php配置文件:在php模块下

    将开发环境的配置文件进行重命名(建议先复制):php.ini

    Apache的配置文件中加载php.ini

    语法:PHPIniDir  php.ini的路径

    即在apache的配置文件中加上以下三行代码

     

    #加载php模块

    LoadModule php5_module "E:\server\php5\php5apache2_2.dll"

    #分配php任务,将.php文件交给php模块处理

    AddType application/x-httpd-php .php

    #扩展目录路径

    PHPIniDir  "E:\server\php5\php.ini"

     

     

    检测:在E/server/apache/htdocs下面新建一个文件 1.php

     

    注意:所有的文件均放在E:/server/apache/htdocs下面,可以建文件夹,每次修改配置文件必须重启apache

    访问文件必须以localhost开头加上文件名

    如:

           

       

    修改时区

    PHP的配置文件php.ini中设置

    php默认采用的时区是欧洲时区(UTC),与当前系统(网络)时区不一致。

     

     

     

    验证

    php提供了一个函数,用来检测php的环境:phpinfo()

     

     

     

     

     

     

    展开全文
  • docker简单操作&安装Apachephp

    千次阅读 2018-09-28 17:21:10
    docker docker可以让开发者打包他们的应用、服务程序到一个轻量级、可移植的容器中,然后发布。理解成镜像是类,容器是实例对象。docker镜像是用于创建docker容器的模板,容器是独立运行的一个或者一组应用。...
  • Android与PHP服务器交互

    万次阅读 热门讨论 2012-08-27 15:41:49
    服务器端:server.php 1 <?php 2 include('dbconfig.php'); 3 4 5 $address = $_POST['address']; 6 $longitude = $_POST['longitude']; 7 $latitude = $_POST['lati
  • Wampserver Apache服务无法启动解决方案

    万次阅读 2017-08-03 17:18:33
    现在到了前后台连接交互的阶段,于是也打算配置环境,将前后台打通,结果在安装 Wampserver 中出现了很多奇奇怪怪的错误,公司电脑和实验室电脑也分别出现图标为橙色的状态和报错,在网上也查了半天,终于都解决了,...
  • Apache运行机制剖析

    万次阅读 多人点赞 2013-05-16 17:06:37
    Apache运行机制剖析: 1. B/S交互过程 浏览器(Browser)和服务器(Web Server)的交互过程:   1、 浏览器向服务器发出HTTP请求(Request)。 2、 服务器收到浏览器的请求数据,经过分析处理,向...
  • PHP如何JS进行交互

    万次阅读 2009-11-13 16:40:00
     原来PHP的原理是这样的:PHP的所有应用程序都是通过WEB服务器(如IIS或Apache)和PHP引擎程序解释执行完成的,工作过程:(1)当用户在浏览器地址中输入要访问的PHP页面文件名,然后回车就会触发这个PHP请求,并将请求...
  • 关于Apache 的timeout 误解

    万次阅读 2014-05-06 16:19:42
    近期,web服务器上经常apache的线程数会跑到maxclients(500),从而影响了正常服务。正常情况下,apache线程数不会超过100,而却跑到了500,所以肯定是由于某些请求执行脚本的时间太长了。于是设置apache的...
  • 在Windows中安装Apache2和PHP4的权威指南作者:周靖 译 来源:ZDNet Apache 2和PHP是创建交互式网站的流行方案,而且成本很低。在Windows中安装Apache 2是一件轻而易举的事情,但要使PHP 4与Apache 2配合无间地运行...
  • Ubuntu 搭建Web服务器(MySQL+PHP+Apache)详细教程 (全网最全) 看了好多人的博客,有的不全 or 有问题,整理了一下,适合小白 新手先整理几个小问题 1.为啥使用 Linux 搭建服务器? 一个是因为主流的云服务器太贵...
  • 详解ApachePHP和Mysql之间的关系注意: 本文主要写给基础薄弱的同学, 如有不当之处,还请指正。访问源站原创不易,转载请注明欢迎交流: 640765823 学习方法弄清楚ApachePHP和MySQL之间的关系,对于初学者理解...
  • httpd与php的结合方式: 如果网站的访问量很小,同一时间仅仅处理单个请求,那么各种结合方式的特点并不能很好的体现。这里我们仅考虑在高访问量、高并发情况下各种结合方式的优缺点。 CGI: CGI(common ...
  • 浅谈web前端后台数据交互

    万次阅读 多人点赞 2016-06-24 17:23:18
    1.什么是web服务器?服务器: 通俗理解,一台24小时工作的机器 web服务器:一台24小时工作的能处理web请求的服务器看图,用实例说话2.web服务器的操作系统既然服务器是一台机器,那么就会有操作系统 ...
  • 网站搭建:从0到1搭建网站

    万次阅读 多人点赞 2018-06-03 23:34:05
    网站说白了就是把一些东西放到哪里供其他人访问,并提供了一些可以交互的接口的地方。如果要实现这样一个地方首先,需要一个能放东西的地方这就是服务器。其次,我们要找到这个地方,然而有很多这样的地方,所以我们...
  • Apache安全之404页面和默认页面安全

    千次阅读 2018-06-01 10:12:54
    404页面敏感信息的隐藏首先开启httpd服务,然后curl -I 本机IP查看一下响应头信息可以在这里清楚地看到apache的版本号,和操作系统在这里我们要将这些敏感信息隐藏首先打开/etc/httpd/conf/httpd.confServerTokens ...
  • ubuntu下安装Apache+PHP+Mysql

    千次阅读 2017-04-05 16:10:56
    ubuntu下安装Apache+PHP+Mysql 转载自:http://www.comflag.com/2011/05/01/apache-web.htm 电影《社交网络》中,facebook创始人马克.扎克失恋后入侵哈佛大学宿舍楼服务器,窃取数据库资料,并在两个...
  • Apache部署超详细教程

    万次阅读 多人点赞 2019-05-24 17:16:26
    Apache服务器部署背景Apache与Nginx对比Apache的部署安装Apache的基础信息修改Apache默认配置修改默认端口修改默认发布文件修改默认发布目录Apache的虚拟主机如何配置虚拟主机排错思路Apache内部的访问控制基于IP...
  • 前端和后台数据交互总结

    万次阅读 2018-10-14 21:08:52
    web服务器应用程序:apache,tomcat,nodeJs、Nginx、IIS、 后台语言:php,java,.net,nodeJS 数据库:Mysql,SqlServer,Oracle 后台mvc:ssh ssm 前台mvc:js ,jsp 数据交互:ajax,servlet  Java web...
1 2 3 4 5 ... 20
收藏数 38,497
精华内容 15,398
热门标签
关键字:

php 与apache交互