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:\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。
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:\tomcat\php\php-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服務:

在webapps\ROOT\WEB-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-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>
View Code

 

 

 

注意php運行環境裝對應版本

 

 

出現如下問題

Fatal error: Call to undefined function mysql_connect() in D:\Apache2.2\htdocs\db.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
     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM