2013年3月14日 星期四

PHP 不同版本並存

環境:win7 + Apache2.2.22 + php5.2.17
以 php5_module(Apache module、Apache Handler、mod_php) 方式執行。
目的:另外新增 php5.4.12 和原本的 php5.2.17 並存
解決方式:將 php5.4.12 另外以 mod_fcgid 方式執行

步驟:
  1. 下載 mod_fcgid.so
    http://www.apache.org/dyn/closer.cgi/httpd/binaries/win32/ 任選一個載點,下載 mod_fcgid-2.3.6-win32-x86.zip
  2. 解壓縮 mod_fcgid-2.3.6-win32-x86.zip,將裡面的 mod_fcgid.so 複製到 Apache的 modules 目錄底下
  3. http://windows.php.net/download/ 下載 php-5.4.12-nts-Win32-VC9-x86.zip,解壓縮到 "D:\php-5.4.12-nts"
  4. 進到 "D:\php-5.4.12-nts" 資料夾,將 php.ini-production 檔名改為 php.ini
  5. 修改 php.ini,拿掉「; extension_dir = "ext"」 的註解,改為「extension_dir = "ext"」
  6. 在網站根目錄建立一資料夾(例如 D:/Apache(x86)/htdocs/php54/),後續將設定此資料夾的PHP網頁,改用 php5.4.12 來執行,而放在其他資料夾的網頁,一樣用原本的 php5.2.17 執行
  7. 修改 http.conf ,新增
  8. #php5.4.12
    LoadModule fcgid_module modules/mod_fcgid.so
    <IfModule mod_fcgid.c>
        #php.ini檔案的目錄
        FcgidInitialEnv PHPRC        "D:/php-5.4.12-nts/"
        FcgidInitialEnv PHP_FCGI_MAX_REQUESTS      1000
        FcgidMaxRequestsPerProcess      1000
        #php-cgi最大進程數
        FcgidMaxProcesses               15
        FcgidIOTimeout                  120
        FcgidIdleTimeout                120
    <Directory "D:/Apache(x86)/htdocs/php54">
        AddHandler fcgid-script .php
        #php-cgi路徑
        FcgidWrapper "D:/php-5.4.12-nts/php-cgi.exe" .php
        Options +ExecCGI
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>
    </IfModule>
  9. 重新啟動apache,此時放在 D:/Apache(x86)/htdocs/php54/ 資料夾的網頁將以 php5.4.12 mod_fcgid 來執行。而不在此目錄底下的網頁,依舊用 php5.2.17 執行。


補充:再多一個 php5.6 並存 (php5.2.17=>Apache module、php5.4.12=>mod_fcgid、php5.6.19=>mod_fcgid)
http.conf 設定改為
#php5.4
LoadModule fcgid_module modules/mod_fcgid.so
<IfModule mod_fcgid.c>
    #php.ini 檔案
    #FcgidInitialEnv PHPRC        "D:/php-5.4.20-nts/" #這行改到 VirtualHost 裡設定
    FcgidInitialEnv PHP_FCGI_MAX_REQUESTS      1000
    FcgidMaxRequestsPerProcess      1000
    FcgidMaxProcesses               1500
    FcgidIOTimeout                  120
    FcgidIdleTimeout                120

#php5.4
<Directory "D:/Apache(x86)/htdocs/php54">
    AddHandler fcgid-script .php
    #php-cgi 路徑
    FcgidWrapper "D:/php-5.4.20-nts/php-cgi.exe" .php
    Options +ExecCGI
    AllowOverride All
    Order allow,deny
    allow from all
</Directory>

#php5.6
<Directory "D:/Apache(x86)/htdocs/php56">
    AddHandler fcgid-script .php
    #php-cgi 路徑
    FcgidWrapper "D:/php-5.6.19-nts/php-cgi.exe" .php
    Options +ExecCGI
    AllowOverride All
    Order allow,deny
    allow from all
</Directory>
</IfModule>

httpd-vhosts.conf  新增一個 VirtualHost,
重點在 VirtualHost 裡面,將 FcgidInitialEnv PHPRC 設定到不同版本的 PHP 的資料夾,
以讀取該資料夾內的 php.ini 設定
#php54
<VirtualHost *:80>
    FcgidInitialEnv PHPRC "D:/php-5.4.20-nts/"
    ServerName php54.example.com
    DocumentRoot "D:/Apache(x86)/htdocs/php54"
    <Directory "D:/Apache(x86)/htdocs/php54">
        DirectoryIndex index.php default.php
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

#php56
<VirtualHost *:80>
    FcgidInitialEnv PHPRC "D:/php-5.6.19-nts/"
    ServerName php56.example.com
    DocumentRoot "D:/Apache(x86)/htdocs/php56"
    <Directory "D:/Apache(x86)/htdocs/php56">
        DirectoryIndex index.php default.php
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>



參考:
Apache, MySQL, PHP server on Windows with multiple, simultaneous PHP versions
PHP memcached的Session的使用与配置 - LAMP ≠ linux+apache+mysql+php - ITeye技术网站

沒有留言:

張貼留言