zoukankan      html  css  js  c++  java
  • Tomcat下部署PHP

    php线程安全版和非线程安全版本区别

    1、windows + IIS +  FastCGI :使用非线程安全版本。
    
    解释:
    
    以FastCGI方式安装PHP时,PHP拥有独立的进程,并且FastCGI是单一线程的,不存在多个线程之间可能引发的相互干扰(这种干扰通常都是由于全局变量和静态变量导致的)。由于省去了线程安全的检查,因此使用FastCGI方式比ISAPI方式的效率更高一些。
    
    2、windows + IIS +  ISAPI :使用线程安全版本。
    
    解释:
    
    PHP以ISAPI方式安装时,PHP没有独立的进程,而是作为DLL被IIS加载运行的,即是依附于Web服务器进程的。当Web服务器运行在多线程模式下(IIS正是这种情况),PHP自然也就运行在多线程模式下。只要是在多线程模式下运行,就可能存在线程安全问题,因此应选择PHP的线程安全版本。
    
    3、windows + Apache +  PHP(模块) :使用线程安全版本。
    
    解释:
    
    如果你要在Apache中以模块方式安装PHP,则你应该使用PHP的线程安全的版本。原因是当PHP作为Apache的模块安装时,PHP没有独立的进程,而是作为模块以DLL的形式被加载到Apache中的,是随Apache的启动而启动的,而Windows下的Apache为多线程工作模式,因此PHP自然也就运行在多线程模式下。因此,这种情况下应使用PHP的线程安全版本。
    
    4、windows + Apache +  PHP(ISAPI) :使用线程安全版本。
    
    解释:
    
    由于以ISAPI方式来安装PHP时,PHP也没有独立的进程,也是作为模块被加载到Apache中的,因此,同样也需要使用PHP的线程安全版本。
    
    一般不建议在Apache中以ISAPI方式来安装PHP,原因是到目前为止,Apache通过mod_isapi.so模块来实现的ISAPI功能并不完整,并未完整实现微软对ISAPI所制定的全部规范。
    
    5、windows + Apache +  PHP(FastCGI) :使用非线程安全版本。
    
    解释:
    
    如果你要在Apache中以FastCGI方式使用PHP,则同在IIS中使用FastCGI的PHP的情况一样,你应该使用PHP的非线程安全的版本。原因是在Apache中以FastCGI方式安装PHP时,PHP拥有独立的进程,并且FastCGI是单一线程的,故应使用PHP的非线程安全版本以提高性能。
    View Code

    版本选择

     Common Gateway Interface,简称CGI。在物理上是一段程序,运行在服务器上,提供同客户端HTML页面的接口。这样说大概还不好理解。那么我们看一个实际例子:现在的个人主页上大部分都有一个留言本。留言本的工作是这样的:先由用户在客户端输入一些信息,如评论之类的东西。接着用户按一下“发布或提交”(到目前为止工作都在客户端),浏览器把这些信息传送到服务器的CGI目录下特定的CGI程序中,于是CGI程序在服务器上按照预定的方法进行处理。在本例中就是把用户提交的信息存入指定的文件中。然后CGI程序给客户端发送一个信息,表示请求的任务已经结束。此时用户在浏览器里将看到“留言结束”的字样。整个过程结束。
    PHP3.0.17开始的都是线程安全的版本,这是由于与Linux/Unix系统是采用多进程的工作方式不同的是Windows系统是采用多线程的工作方式。如果在IIS下以CGI方式运行PHP会非常慢,这是由于CGI模式是建立在多进程的基础之上的,而非多线程。
    
    一般我们会把PHP配置成以ISAPI的方式来运行,ISAPI是多线程的方式,这样就快多了。但存在一个问题,很多常用的PHP扩展是以Linux/Unix的多进程思想来开发的,这些扩展在ISAPI的方式运行时就会出错搞垮IIS。因此在IIS下CGI模式才是PHP运行的最安全方式,但CGI模式对于每个HTTP请求都需要重新加载和卸载整个PHP环境,其消耗是巨大的。
    
    为了兼顾IIS下PHP的效率和安全,微软给出了FastCGI的解决方案。FastCGI可以让PHP的进程重复利用而不是每一个新的请求就重开一个进程。同时FastCGI也可以允许几个进程同时执行。这样既解决了CGI进程模式消耗太大的问题,又利用上了CGI进程模式不存在线程安全问题的优势。
    
    因此,如果是使用ISAPI的方式来运行PHP就必须用Thread Safe(线程安全)的版本;而用FastCGI模式运行PHP的话就没有必要用线程安全检查了,用None Thread Safe(NTS,非线程安全)的版本能够更好的提高效率。
    
    PHP官方http://php.net/上关于widows的版本有4个:VC9 x86 Non Thread Safe,VC9 x86 Thread Safe,VC6 x86 Non Thread Safe,VC6 x86 Thread Safe;那么有什么区别呢?
    
    1.支持的服务器不同
    VC9版本是针对IIS服务器的版本,没有对APACHE的支持,而VC6版本对IIS和apache都提供了支持
    
    VC6 是什么?
    VC6 就是 legacy Visual Studio 6 compiler ,就是使用这个编译器编译的。
    VC9 是什么?
    VC9 就是 the Visual Studio 2008 compiler ,就是用微软的 VS 编辑器编译的。
    
    那我们如何选择下载哪个版本的 PHP 呢?
    如果你是在 windows 下使用 Apache+PHP 的,请选择 VC6 版本;
    如果你是在 windows 下使用 IIS+PHP 的,请选择 VC9 版本;
    
    2.运行方式的不同
    PHP有2中运行方式:ISAPI和FastCGI。
    
    ISAPI执行方式是以DLL动态库的形式使用,可以在被用户请求后执行,在处理完一个用户请求后不会马上消失,所以需要进行线程安全检查,这样来提高程序的执行效率,所以如果是以ISAPI来执行PHP,建议选择Thread Safe版本;
    
    而FastCGI执行方式是以单一线程来执行操作,所以不需要进行线程的安全检查,除去线程安全检查的防护反而可以提高执行效率,所以,如果是以FastCGI来执行PHP,建议选择Non Thread Safe版本。
    
    对于apache服务器来说一般选择isapi方式,而对于nginx服务器则选择FastCGI方式。
    View Code

    对于apache服务器来说一般选择isapi方式,而对于nginx服务器则选择FastCGI方式。 

    如果是使用ISAPI的方式来运行PHP就必须用Thread Safe(线程安全)的版本;而用FastCGI模式运行PHP的话就没有必要用线程安全检查了,用None Thread Safe(NTS,非线程安全)的版本能够更好的提高效率。

     

    Linux/Unix系统是采用多进程的工作方式不同的是Windows系统是采用多线程的工作方式。

    安装及配置

     1··· 将安装后的php路径设置到系统环境变量path中。

    2···到D:Applicationphp-5.4.31目录下

    将php.ini-development复制一份同一目录下,命名为php.ini

    <1>设置extension_dir参数:

    extension_dir="D:Applicationphp-5.4.31ext"

    <1>设置cgi.force_redirect参数:

    cgi.force_redirect = 0

    3···

    打开Tomcat的conf下的context.xml文件

    给Context增加属性privileged="true",修改后的Context元素属性如下所示:

    <Context privileged="true">

    4···

    1.相关jar包下载地址
    http://pan.baidu.com/s/1mgFVuFu
    将phpJavaBridge.rar中的JavaBridge.jar、php-servlet.jar和php-script.jar复制到tomcat的lib目录下;
    2.修改tomcat安装目录下conf文件夹里的web.xml文件,在web-app标签里增加以下的代码
    <listener>
    <listener-class>php.java.servlet.ContextLoaderListener</listener-class>
    </listener>
    <servlet>
    <servlet-name>PhpJavaServlet</servlet-name>
    <servlet-class>php.java.servlet.PhpJavaServlet</servlet-class>
    </servlet>
    <servlet>
    <servlet-name>PhpCGIServlet</servlet-name>
    <servlet-class>php.java.servlet.fastcgi.FastCGIServlet</servlet-class>
    <init-param>
    <param-name>prefer_system_php_exec</param-name>
    <param-value>On</param-value>
    </init-param>
    <init-param>
    <param-name>php_include_java</param-name>
    <param-value>Off</param-value>
    </init-param>
    </servlet>
    <servlet-mapping>
    <servlet-name>PhpJavaServlet</servlet-name>
    <url-pattern>*.phpjavabridge</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
    <servlet-name>PhpCGIServlet</servlet-name>
    <url-pattern>*.php</url-pattern>
    </servlet-mapping>
    
    3.部署php项目
    
    直接到php项目复制到tomcat的webapps目录下,然后启动tomcat。
    View Code

    在<web-app>中加入

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. <servlet>  
    2.     <servlet-name>php</servlet-name>  
    3.     <servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class>  
    4.     <init-param>  
    5.       <param-name>clientInputTimeout</param-name>  
    6.       <param-value>200</param-value>  
    7.     </init-param>  
    8.     <init-param>  
    9.       <param-name>debug</param-name>  
    10.       <param-value>0</param-value>  
    11.     </init-param>  
    12.     <init-param>  
    13.       <param-name>executable</param-name>  
    14.       <param-value>D: omcatphpphp-cgi.exe</param-value>  
    15.     </init-param>  
    16.     <init-param>  
    17.         <param-name>passShellEnvironment</param-name>  
    18.     <param-value>true</param-value>  
    19. </init-param>  
    20.     <init-param>  
    21.       <param-name>cgiPathPrefix</param-name>  
    22.       <param-value>WEB-INF/phpbin</param-value>  
    23.     </init-param>  
    24.      <load-on-startup>5</load-on-startup>  
    25. </servlet>  

     

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. <servlet-mapping>  
    2.     <servlet-name>php</servlet-name>  
    3.     <url-pattern>/phpbin/*</url-pattern>  
    4. </servlet-mapping>  

    重启tomcat服务:

    在webappsROOTWEB-INF 下新建一个phpbin的文件夹

    在下面新建一个index.php

    里面的内容为:

    [php] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. <?php phpinfo();?>  


    http://localhost:8080/phpbin/index.php 看到以下内容。说明部署成功:

    参考:http://jingyan.baidu.com/article/380abd0a73aa181d90192cf8.html

              http://www.blogjava.net/freeman1984/archive/2011/06/16/352427.html

     或在<web apps>标签加入

    <servlet>  
        <servlet-name>php</servlet-name>  
        <servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class>  
        <init-param>  
          <param-name>clientInputTimeout</param-name>  
          <param-value>200</param-value>  
        </init-param>  
        <init-param>  
          <param-name>debug</param-name>  
          <param-value>0</param-value>  
        </init-param>  
        <init-param>  
          <param-name>executable</param-name>  
          <param-value>C:Program Files(D)php-5.6.29-Win32-VC11-x64php-cgi.exe</param-value>  
        </init-param>  
        <init-param>  
            <param-name>passShellEnvironment</param-name>  
        <param-value>true</param-value>  
    </init-param>  
        <init-param>  
          <param-name>cgiPathPrefix</param-name>  
          <param-value>WEB-INF/phpbin</param-value>  
        </init-param>  
         <load-on-startup>5</load-on-startup>  
    </servlet>  
    <listener>
    <listener-class>php.java.servlet.ContextLoaderListener</listener-class>
    </listener>
    <servlet>
    <servlet-name>PhpJavaServlet</servlet-name>
    <servlet-class>php.java.servlet.PhpJavaServlet</servlet-class>
    </servlet>
    <servlet>
    <servlet-name>PhpCGIServlet</servlet-name>
    <servlet-class>php.java.servlet.fastcgi.FastCGIServlet</servlet-class>
    <init-param>
    <param-name>prefer_system_php_exec</param-name>
    <param-value>On</param-value>
    </init-param>
    <init-param>
    <param-name>php_include_java</param-name>
    <param-value>Off</param-value>
    </init-param>
    </servlet>
    <servlet-mapping>
    <servlet-name>PhpJavaServlet</servlet-name>
    <url-pattern>*.phpjavabridge</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
    <servlet-name>PhpCGIServlet</servlet-name>
    <url-pattern>*.php</url-pattern>
    </servlet-mapping>
    View Code

     

     

    注意php运行环境装对应版本

    出现如下问题

    Fatal error: Call to undefined function mysql_connect() in D:Apache2.2htdocsdb.php on line 33

     

    1.  
    2. undefined function mysql_connect()解决方法
    3.  

      继续查找“extension_dir”,注意搜索方向改为“向上”,找到如下行:

      ; On windows:

      ; extension_dir = "ext"

      将extension_dir = "ext"前面的分号去掉。

      undefined function mysql_connect()解决方法
       
       
      重启tomcat
       
  • 相关阅读:
    Codeforces Round #344 (Div. 2) C. Report 其他
    Codeforces Round #344 (Div. 2) B. Print Check 水题
    Codeforces Round #344 (Div. 2) A. Interview 水题
    8VC Venture Cup 2016
    CDOJ 1280 772002画马尾 每周一题 div1 矩阵快速幂 中二版
    CDOJ 1280 772002画马尾 每周一题 div1 矩阵快速幂
    CDOJ 1279 班委选举 每周一题 div2 暴力
    每周算法讲堂 快速幂
    8VC Venture Cup 2016
    Educational Codeforces Round 9 F. Magic Matrix 最小生成树
  • 原文地址:https://www.cnblogs.com/ouyangping/p/6264434.html
Copyright © 2011-2022 走看看