Archive

文章標籤 ‘php’

如何同時在Apache運行多版本的php(在windows上)

2021年1月23日 尚無評論

本次升級最大的動作之一就是把先前一直想要升級PHP的念想給實現了,因為目前這台是PHP5,而且上面還有其它服務在運行不方便直接升級

所以就只好在同一個apahce實作同時間運行多版本的PHP了

一開始看了一些文件,原本是想用最單純的方式 VirtualHost 再搭配使用不同版本的PHP engine ,看似可以,網路上好像也有蠻多人有類似這樣的說法

但實測結果,這是不可行的,至少在windows 環境下是不可行的,因為會遇到 這個警訊「Only first PHPINIDir directive honored per configuration tree – subsequent ones ignored」

因為php.ini 的路徑只能設定一個,就算在VirtualHost 裡設定也不行,只要出現兩次也會報錯,但因為php5 和php7差異太大,如果是同php5.5 or php5.6,那採用同一個 php.ini或許還是可行,但看來這方向就要調整才行。

後來改採 Apache FastCGI ASF module的整合方式,利用執行CGI的方式執行PHP來達到運行多版本,廢話不多說,直接說我的作法:

  1. 到此連結 https://www.apachelounge.com/download/VC15/  下載mod_fcgid ,要注意你的VC版本,不合就自己換。
  2. 解開後mod_fcgid 後放到apahce modules目錄
  3. 修改apahce conf/httpd.conf加上

    • LoadModule fcgid_module modules/mod_fcgid.so
    • 解開 Include conf/extra/httpd-default.conf  
    • 如果 Include conf/extra/httpd-vhosts.conf 沒解開也一定要解開才行
  4. 修改conf/extra/httpd-default.conf 加上以下片斷在最下方

    FcgidInitialEnv PATH "c:/php-5/;C:/WINDOWS/system32;C:/WINDOWS;C:/WINDOWS/System32/Wbem;"
    FcgidInitialEnv SystemRoot "C:/Windows"
    FcgidInitialEnv SystemDrive "C:"
    FcgidInitialEnv TEMP "C:/WINDOWS/Temp"
    FcgidInitialEnv TMP "C:/WINDOWS/Temp"
    FcgidInitialEnv windir "C:/WINDOWS"
    FcgidIOTimeout 64
    FcgidConnectTimeout 16
    FcgidMaxRequestsPerProcess 1000
    FcgidMaxProcesses 50
    FcgidMaxRequestLen 8131072
    # Location of php.ini
    FcgidInitialEnv PHPRC "c:/php-5/"
    FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 1000
    <Files ~ "\.php$">
      AddHandler fcgid-script .php
      FcgidWrapper "c:/php-5/php-cgi.exe" .php
      Options +ExecCGI
    </Files>
    
  5. 修改你的conf/extra/httpd-vhosts.conf 在你準備要用PHP7的domain Virtual Host之中加上以下設定 

    FcgidInitialEnv PHPRC "c:/php-7"
    <Files ~ "\.php$">
    	php_flag engine off
    	AddHandler fcgid-script .php
    	FcgidWrapper "c:/php-7/php-cgi.exe" .php
    </Files>
    
    
  6. 再重啟Apache,就完成啦,實測一下兩個不同的domain 就分別顯示不同的版本

目前大多人的寫法都是把多版本PHP運行都利用mod_fcgid搭配VirtualHost 來實現,但我這裡的作法就是和別人不一樣,原本的PHP作法我都不動,我是直接在想要的VirtualHost  domain  加上mod_fcgid 來實現運行指定的PHP版本 ,我發現這樣用之後Include conf/extra/httpd-default.conf   這個不使用 也不用加也不會有任何影響

另外,原本在測試使用基本方式達到運行多版本的PHP,卡在php.ini 設定上,我有發現有文章提及不設定php.ini DIR Path,改指向使用php 程式路徑中的ini,利用windows PATH參數指定搜尋的路徑,可能是一條可行的路,不過我都試成功了就不再多花時間去TRY了,提供以下連結,讓有興趣的人可以去試試看(不過文章有點舊請要有心理準備)

Windows環境讓PHP4與PHP5共存,使用Apache

Categories: PHP Tags: ,

WINDOWS安裝PHP在IIS7上運行

2013年8月3日 尚無評論

先前如有PHP的需求,在Windows平台上,多半會採用Xampp或是Appserv,因為架站所需的工具都包含了

Apache + PHP + Mysql,根本不用想太多,而這次剛好和先前不太一樣,因為上頭已經有資料庫了,所以只需要安裝PHP

所以就想直接安裝PHP就好,以前就知PHP可以安裝在IIS上,沒想到,現在安裝是這麼的容易,參考了這篇網誌 在IIS 7 上運行 PHP

看來已經不用再手動去設定太多;首先要先去下載PHP Manager 1.2 for IIS 7 ,這真是這個好工具,少了很多手動設定工作業,

下載安裝後在你的IIS7下就能看到PHP Manager的選項(如下圖)。

然後因為還沒指定PHP,所以我們可以先去 http://windows.php.net/download/   下載PHP for windows 版本,回來後先解開看要放在哪

然後再到下圖這個Register new PHP version,選擇你解開PHP壓縮檔的位置即可。

 

然後,完成了~真的~完成~了!!  在處理常式對應之中也可以看到PHP的對應了

 

而在PHP Manager之中,也可以動態create phpinfo 來看PHP的相關參數值,真的還蠻方便的

不過,當然還是有小小卡關,因為小弟安裝在windows 2008 Server 64bit + IIS 7.5 + PHP-5.5.1

安裝後,會出現Error 500訊息,錯誤碼是0x0000135 模組 FastCgiModule 的問題,上網查,多半說.Net Framework 版本有問題,也有說權限問題

還好後來找到這篇網誌 [技術]PHP service in WIN7 64位元 ERROR : FastCGI 處理序意外地結束-排除方法 ,上個月才有人遇到,真是好文呀!

原來PHP VC11 是要VS2012版本才行,在 http://windows.php.net/download/#php-5.5 提到 VC9 or VC11 (Visual Studio 2008 and 2012 compiler respectively)

哈~其實自己失敗時,就有在想會不會是函式版本不支援而出錯,所以再到Microsoft 下載適用於 Visual Studio 2012 Update 3 的 Visual C++ 可轉散發套件

http://www.microsoft.com/zh-tw/download/details.aspx?id=30679 安裝後即可,當然也可以手動安裝就請參考該位大大的網誌即可

這樣就可以啦~真的覺得還蠻容易的!!

Categories: PHP, 系統設定 Tags: ,

PHP忽略大小寫的字串處理

2013年6月18日 尚無評論

在PHP5 之後,有提供了字串處理時忽略大小寫的函式,蠻不錯用的而且也很好記憶,在此列出常用的幾個函式介紹:

 

strstr($str ,$keyword)  對應的函式就是stristr 

該函式主要是找出$keyword之後的字串(可以將原本要用substr函式才能處理的事簡化)

值得一提,在PHP 5.3.0 之後 strstr函式,增加一個參數  strstr($str ,$keyword [,$before_boolean=false]),如設定為true,則效果反向可以找出$keyword之前的字串

請參考http://php.net/manual/zh/function.stristr.php

 

strpos($str, $keyword [,$offset=0]) 對應的函式就是stripos

主要是回傳$str之中$keyword首次出現的位置

如果是要找最後一次出現的位置可以改用 strrpos 當然對應的函式是strripos

請參考http://www.php.net/manual/zh/function.stripos.php

 

str_replace($searchKeyword , $replace  ,$str) 對應的函式就是str_ireplace

可以將$str之中,全部的$searchKeyword都會換成$replace 

請參考http://php.net/manual/zh/function.str-ireplace.php

 

strcmp($str1  ,$str2) 對應的函式,要注意就不是常用的加上i 而是strcasecmp

可以針對$str1,及$str2 進行字串大小比對,$str1>$str2會回傳正數, 小於會回傳負數,相等會回傳0

請參考http://www.php.net/manual/zh/function.strcmp.php

然而這函式還有其它類似作用的函式 ,都一樣有提供忽略大小寫,如下:

strncmp(可指定比較時使用的最大長度) 對應的是strncasecmp,請參考http://www.php.net/manual/zh/function.strncmp.php

strnatcmp (自然順序的比較)對應的是strnatcasecmp,請參考http://www.php.net/manual/zh/function.strnatcmp.php

 

如果是要在preg_ match 或是preg_ match_all 之中忽略大小寫進行比對呢?

只要在$pattern之中加上i即可,例如 原本preg_match("/HI (.*?) from/",$str,$martchs)  只要改成這樣即可

preg_match("/HI (.*?) from/i",$str,$martchs)

詳細使用請參考 http://www.php.net/manual/zh/function.preg-match.php

Categories: PHP, 程式開發 Tags:

程式中如何檢查PHP版本及函式是否有提供

2013年6月7日 尚無評論

最近在處理PHP,有用到一些PHP函式都有限定PHP某版本之後才支援或是某版本之後有些參數就作廢了

以前其實很好區分,多半只要注意PHP 3 4 5 這種大版本就好,但像PHP 5.3.0 之前及之後就有蠻多差別

所以如要判斷時,只要在程式中用phpversion()即可得到目前使用的PHP版本號
 

<?

 if(phpversion()>='5.3.0') echo "HI";

?>

詳請參考http://tw1.php.net/manual/en/function.phpversion.php

就是這麼簡單,那如果要判斷這函式是否有提供呢? 我們可以用function_exists即可判斷:

<?
if (function_exists('imap_open')) {
    echo "IMAP functions are available.<br />\n";
} else {
    echo "IMAP functions are not available.<br />\n";
}
?>

詳請參考http://php.net/manual/en/function.function-exists.php

 

如果我們要找某個PHP系統參數值呢? 我們可以用get_ini來查出來

詳請參考http://php.net/manual/en/function.ini-get.php

Categories: PHP, 程式開發 Tags:

PHP如何取得目前網址及參考連結

2012年12月18日 尚無評論

剛好有需要用到,這種找GOOGLE比自己看函式庫來的快

這篇寫的蠻好的,直接使用即可上手

php中要取得目前網址要用字串組合的方式
$_SERVER[‘HTTP_HOST’] //網址
$_SERVER[‘REQUEST_URI’] //包含參數(包含目錄)
$_SERVER[‘PHP_SELF’] //只有檔案名稱(包含目錄)
$_SERVER[QUERY_STRING] //只取後面參數

 

以 http://www.gocar.idv.tw/phpbb3/viewforum.php?f=1  網址為例
$_SERVER['HTTP_HOST']  : www.gocar.idv.tw
$_SERVER['REQUEST_URI'] :/phpbb3/viewforum.php?f=1
$_SERVER['PHP_SELF'] : /phpbb3/viewforum.php
$_SERVER[QUERY_STRING] : f=1
所以

$ThisURL = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
echo $ThisURL ;
會得到 
http://www.gocar.idv.tw/phpbb3/viewforum.php?f=1

$ThisFile = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];
echo $ThisFile ;
會得到
http://www.gocar.idv.tw/phpbb3/viewforum.php

還有順帶一提,如果需要知道參考連結可以利用以下語法即可取得到

$referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';

 

參考來源:

  • http://www.gocar.idv.tw/phpbb3/viewtopic.php?f=9&t=21
  • http://www.electrictoolbox.com/php-http-referer-variable
Categories: PHP, 程式開發 Tags:
分頁: 1 2 3 4 下一頁