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的非线程安全版本以提高性能。
版本选择
- 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方式。
对于apache服务器来说一般选择isapi方式,而对于nginx服务器则选择FastCGI方式。
如果是使用ISAPI的方式来运行PHP就必须用Thread Safe(线程安全)的版本;而用FastCGI模式运行PHP的话就没有必要用线程安全检查了,用None Thread Safe(NTS,非线程安全)的版本能够更好的提高效率。
Linux/Unix系统是采用多进程的工作方式不同的是Windows系统是采用多线程的工作方式。
安装及配置
1··· 将安装后的php路径设置到系统环境变量path中。
2···到D:\Application\php-5.4.31目录下
将php.ini-development复制一份同一目录下,命名为php.ini
<1>设置extension_dir参数:
extension_dir="D:\Application\php-5.4.31\ext"
<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。
或在<web-app>中加入
- <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>D:\tomcat\php\php-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>
- <servlet-mapping>
- <servlet-name>php</servlet-name>
- <url-pattern>/phpbin/*</url-pattern>
- </servlet-mapping>
重启tomcat服务:
在webapps\ROOT\WEB-INF 下新建一个phpbin的文件夹
在下面新建一个index.php
里面的内容为:
- <?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-x64\php-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>
注意php运行环境装对应版本
出现如下问题
Fatal error: Call to undefined function mysql_connect() in D:\Apache2.2\htdocs\db.php on line 33
-
继续查找“extension_dir”,注意搜索方向改为“向上”,找到如下行:
; On windows:
; extension_dir = "ext"
将extension_dir = "ext"前面的分号去掉。
重启tomcat
Tomcat下部署PHP的更多相关文章
- JFinal 项目 在tomcat下部署
原文:http://my.oschina.net/jfinal/blog/353062 首先明确一下 JFinal 项目是标准的 java web 项目,其部署方式与普通 java web 项目没有任 ...
- 在tomcat下部署工程
xx系统第一期工程完成,今天老大要我去部署系统,从来就没有在tomcat下部署过,一直都是在myeclipse下部署.启动.运行即可,所以这次遇到了几个问题,记录下来. tomcat启动 在安装tom ...
- [saiku] 在 Tomcat 下部署 saiku
上一篇介绍了如何配置免登录[免登录进入管理台] 本文主要是一步一步解释如何在Tomcat下部署saiku,为了让你更好更快的使用. 开始之前,假设你已经比较熟悉数据集市数据库,以及如何建立Mondri ...
- 在tomcat下部署两个或多个项目时 log4j和web.xml配置webAppRootKey 的问题(转)
在tomcat下部署两个或多个项目时 web.xml文件中最好定义webAppRootKey参数,如果不定义,将会缺省为"webapp.root",如下: <!-- 应用路径 ...
- log4j和web.xml配置webAppRootKey 的问题(一个tomcat下部署多个应用)
转自:http://blog.csdn.net/arvin_qx/article/details/6829873 在tomcat下部署两个或多个项目时,web.xml文件中最好定义webAppRoot ...
- tomcat下部署了多个项目启动报错java web error:Choose unique values for the 'webAppRootKey' context-param in your web.xml files
应该是tomcat下部署了多个项目且都使用log4j. <!--如果不定义webAppRootKey参数,那么webAppRootKey就是缺省的"webapp.root". ...
- 一个Tomcat下部署多个项目异常:org.springframework.jmx.export.UnableToRegisterMBeanException: Unable to register MBean 的解决方法
内容简介 在测试服务器上Tomcat下部署两个Spring boot项目,总是一个能启动成功,另一个启动不成功.这两个war包单独部署均能正常启动. 查看日志:启动时报出 org.springfram ...
- tomcat下部署两个工程时,只有一个可以访问,另一个出现404错误,该如何解决
tomcat下部署两个工程时,只有一个可以访问,另一个出现404错误,该如何解决 在开发新项目的时候,有时候为了省时,直接把曾经做过的项目工程A拷贝成改名为B工程,然后再在B工程上进行功能的开发, 此 ...
- 在Tomcat下部署web项目
每个web项目可以以两种方式存在,如联合风控项目,Urc.war,另一中是Urc解压后的目录结构.而tomcat目录下的\webapps\下则均是要部署的web项目解压后的文件夹,启动tomcat后, ...
- tomcat 下部署单框架cas时,报出org.apache.jasper.JasperException异常的解决办法
在tomcat中部署好cas server(设置好https,将cas.war拷贝到了webapps下部署完成),启动tomcat后,访问http://localhost:8443/cas/login ...
随机推荐
- ORA-00972_标识符过长
执行SQL查询报:"ORA-00972:标识符过长"错误. 执行SQL: SELECT T.F_FTBS, T.F_TZMC "X组/XXXX/XXXX名称", ...
- c#学习系列之字段(静态,常量,只读)
C#静态变量使用 static 修饰符进行声明,在类被实例化时创建,通过类进行访问不带有 static 修饰符声明的变量称做非静态变量.static变量在对象被实例化时创建,通过对象进行访问一个类的所 ...
- 前端之css(宽高)设置小技巧
一.css宽高自适应: 1.宽度自适应: 元素宽度设为100%(块状元素的默认宽度为100%) 注:应用在通栏效果中 2.高度自适应: height:auto;或者不设置高度 3.最小,最大高度,最小 ...
- JVM垃圾回收机制一
JVM内存分配与回收 JVM 分代 JVM把堆分为年轻代和老年代,年轻代又分为1个Eden区和2个Survivor区,Eden和Survivor的内存的大小比例是8:1:1. 为什么要分代? 很大的原 ...
- 绘制surfaceView 基础类
public class SurfaceViewTempalte extends SurfaceView implements Callback, Runnable { private Surface ...
- 安装Pywin32后无法正常引用pyd文件
1. 首先在官方下载pywin32 2.下载完成后,无法正常引用pyd文件 3.解决方案: python安装目录\Lib\site-packages\pywin32_system32\* 至 C:\W ...
- 一样的Java,不一样的HDInsight大数据开发体验
大数据的热潮一直居高不下,每个人都在谈.你也许不知道,早些年这个领域可是有个非常「惹眼球」的段子: 1首先开始科普 什么是 HDInsight Azure HDInsight 是 Hortonwork ...
- 【数据库-Azure SQL Database】如何创建事务复制将本地数据同步到 SQL Azure
Azure SQL DB 可以被配置成为 SQL Server 事务复制的一个订阅者( subscriber ). 主要应用场景有两种: 将您的数据迁移到 Azure SQL DB, 并且没有宕机时间 ...
- Drools应用实例
Drools 实例介绍 Drools编译与运行: 在Drools当中,规则的编译与运行要通过Drools提供的各种API来实现,这些API总体来讲可以分为三类:规则编译.规则收集和规则的执行. Kmo ...
- .Net Mvc 返回Json,动态生成EasyUI Tree
最近做一个项目,开始接触EasyUI,感觉很强大,很适合我这种对前台不是很感冒的人.在学习Tree的过程中,感觉网上的资料挺乱的,很多只是把EasyUI API 抄了一遍.现在把最近这段时间的学到的, ...