目前分類:PHP - BASIC (6)

瀏覽方式: 標題列表 簡短摘要

Apache 利用 mod_rewrite 做到網址轉換達成SEO優化 我們達成了 SEO 的優化,但當刷新頁面很多次時卻有時會出現空白的頁面,將 php 程式段的偵錯模式打開 error_reporting(E_ALL); 會出現下列的錯誤訊息。

Fatal error: Uncaught --> Smarty: unable to write file /xampp/htdocs/myweb/smarty/templates_c\8c6924ac7efe8f944a5a8a181c85433787f58f0c.file.home_index.html.cache.php <-- thrown in D:\xampp\htdocs\myweb\includes\smarty\libs\sysplugins\smarty_internal_write_file.php on line 74

 

此原因是因為同時要寫入 cache file: home_index.html.cache.php 時發生了 lock 的事件。為避免這種情形發生,可以將 Smarty 的設定值修改如下即可。

 

    error_reporting(E_ALL); //     測試用:E_ALL ; 上線用:E_WARNING

    
    //定義 Smarty的參數
    $smartyTpl = new Smarty();
    
    /*smarty v3 的寫法*/
    $smartyTpl->setTemplateDir(HOST_ROOT . "/smarty/templates/" )
                 ->setCompileDir(HOST_ROOT . "/smarty/templates_c/")
                 ->setConfigDir(HOST_ROOT . "/smarty/configs/")
                 ->setCacheDir(HOST_ROOT . "/smarty/cache/")
                 ->addPluginsDir(HOST_ROOT . "/smarty/plugins/");
   
    $smartyTpl->debugging = false; // true | false;
    //下列參數用預設值即可
    //$smartyTpl->caching = true;
    //$smartyTpl->cache_lifetime = 120;
    //$smartyTpl->force_compile = true;  // 若為 false 則 apache 的 mod_rewrite 做到網址轉換達成SEO優化 不正常
    //$smartyTpl->compile_check = true;
文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()

概念:

Apache Rewirte 主要的功能就是實現URL的跳轉,它的正則運算式是基於Perl 語言。可基於伺服器級的(HTTPd.conf)和目錄級的 (.htaccess)兩種方式。如果要想用到rewrite模組,必須先安裝或載入rewrite模組。

Apache mod_rewrite 規則重寫的標誌一覽

1) R[=code](force redirect) 強制外部重定向:強制在替代字串加上HTTP://thishost[:thisport]/首碼重定向到外部的URL.如果code不指定,將用缺省的302 HTTP狀態碼。

2) F(force URL to be forbidden)禁用URL,返回403HTTP狀態碼。

3) G(force URL to be gone) 強制URL為GONE,返回410HTTP狀態碼。

4) P(force proxy) 強制使用代理轉發。

5) L(last rule) 表明當前規則是最後一條規則,停止分析以後規則的重寫。

6) N(next round) 重新從第一條規則開始運行重寫過程。

7) C(chained with next rule) 與下一條規則關聯:如果規則匹配則正常處理,該標誌無效,如果不匹配,那麼下面所有關聯的規則都跳過。

8) T=MIME-type(force MIME type) 強制MIME類型

9) NS (used only if no internal sub-request) 只用于不是內部子請求

10) NC(no case) 不區分大小寫

11) QSA(query string append) 追加請求字串

12) NE(no URI escaping of output) 不在輸出轉義特殊字元

實作:

首先要讓 Apache 支援 mod_rewrite,可以在 httpd.conf 看有沒有這一行

LoadModule rewrite_module modules/mod_rewrite.so

接下來要準備設定 mod_rewrite,原則上有二種寫法,一種是直接寫在 httpd.conf 裡面,另一種是寫在 .htaccess 裡面,若要寫在 .htaccess 也要特別注意 Apache 是否有支援,以 xampp.v182 來作說明,原則上預設是開啟的,它的 httpd.conf 內容為:

LoadModule rewrite_module modules/mod_rewrite.so

<Directory />
    AllowOverride none
    Require all denied
</Directory>

DocumentRoot "D:/AppServ/xampp.v182/htdocs"
<Directory "D:/AppServ/xampp.v182/htdocs">
    Options Indexes FollowSymLinks Includes ExecCGI
    AllowOverride All
    Require all granted
</Directory>

 

虛擬主機的設定 httpd-vhosts.conf

<VirtualHost *:80>
    ServerAdmin polin.wei@localhost.bootstrap
    DocumentRoot "D:/AppServ/xampp.v182/htdocs/bootstrap"
    ServerName localhost.bootstrap
    ErrorLog "logs/bootstrap-error.log"
    CustomLog "logs/bootstrap-access.log" common
</VirtualHost>

 

在目錄 D:/AppServ/xampp.v182/htdocs/bootstrap 的 .htaccess

Options -Indexes
RewriteEngine on //開啟Rewrite功能
RewriteBase /

RewriteRule  ^about/(.*)/(.*)$ page.php?type=$1&name=$2 [NC,L]

 

這樣子,就可以將原先程式 http://localhost.bootstrap/page.php?type=polin&name=wei 變成 http://localhost.bootstrap/about/polin/wei

 

 

 

文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()

相關套件及安裝順序如下:

1. Apache:httpd-2.2.25-win32-x86-openssl-0.9.8y
2. Microsoft .NET Framework 4 (獨立安裝程式) : dotNetFx40_Full_x86_x64.exe
3. Microsoft Visual C++ 2010 SP1 可轉散發套件 (x86) :vcredist_x86.exe
4. MySQL:MySQL Installer 5.6.16: mysql-installer-community-5.6.16.0.msi
5. PHP VC9 x86 Thread Safe (2014-Mar-06 00:29:49):php-5.4.26-Win32-VC9-x86.zip

 

Setup 01: 安裝 Apache:httpd-2.2.25-win32-x86-openssl-0.9.8y 最簡單,都下一步就可以順利安裝完成,只有預設安裝路徑建議修改為 C:\AppServ\Apache2.2,完成後輸入 http://localhost 應該有下面的畫面

 apache2.2-openssl-installok.png  

接下來安裝 MySQL 之前,需先裝好 Microsoft .NET Framework 4 (獨立安裝程式) : dotNetFx40_Full_x86_x64.exe、以及Microsoft Visual C++ 2010 SP1 可轉散發套件 (x86) :vcredist_x86.exe,又因為 MySQL 被 Oracle 併購了,所以需先申請一個 Oracle 的帳號才能下載,真是麻煩....

Setup 02: 開始安裝 MySQL,選擇 Install MySQL Products

  mysql_welcome.png  

Setup 03: 可以勾選 Skip the check for updates

mysql_online_check.png

 

Setup 04: 預設存放 MySQL 的路徑設在 C:\AppServ\MySQL\ ;資料庫檔案放在:C:\AppServ\MySQL\MySQL Server 5.6\

mysql_type.png

Setup 05: Workbench CE & Connector 會由線上下載後再安裝

mysql_installing.png 

Setup 06: 安裝完後,作初始設定

MySql-configure-1.png  

MySql-configure-2.png MySql-configure-3.png MySql-configure-4.png MySql-configure-overview.png

Setup 07: 作完初始設定後,就可以用 MySQL Workbench 來管理 MySQL

mysql_workbench.png  

 

Setup 08: 安裝 PHP

a) 將 PHP VC9 x86 Thread Safe (2014-Mar-06 00:29:49):php-5.4.26-Win32-VC9-x86.zip 解壓並放在 C:\AppServ\php5,並將目錄下的 php.ini-production 更名為 php.ini ,

b) 修改 php.ini 的內容如下:(參考:http://www.php.net/manual/de/install.windows.manual.php)

; Directory in which the loadable extensions (modules) reside.
extension_dir = "C:/AppServ/php5/ext"

; Windows Extensions
; 啟動幾個常用的 DLL

extension=php_curl.dll
extension=php_gd2.dll
extension=php_ldap.dll
extension=php_mbstring.dll
extension=php_exif.dll      ; Must be after mbstring as it depends on it
extension=php_mysql.dll
extension=php_mysqli.dll

session.save_path = "C:/AppServ/php_session_temp"

 

 Setup 09: 修改 C:\AppServ\Apache2.2\conf\httpd.conf (參考:http://www.php.net/manual/de/install.windows.apache2.php)

在LoadModule系列最後加上一行: (改成實際PHP安裝路徑)
PHPIniDir "C:/AppServ/php5/"
LoadModule php5_module "C:/AppServ/php5/php5apache2_2.dll"

在<IfModule mime_module>區塊中加上一行:
AddHandler application/x-httpd-php .php

在<IfModule dir_module>區塊中修改DirectoryIndex此行:
DirectoryIndex index.php index.html index.htm

 

Setup 10: 測試 PHP

在Apache設定的DocumentRoot中新增一個php檔案(預設路徑: C:\AppServ\Apache2.2\htdocs)
例如: phpinfo.php, 內容為: (可用phpinfo()函式)

在瀏覽器中測試 (需重新啟動Apache或重開機)
http://127.0.0.1/phpinfo.php

 apache_php_test_ok.png  

 

 

 

參考:

http://blog.roodo.com/esabear/archives/15069653.html

http://shaurong.blogspot.tw/2013/10/apache-php-mysql-on-win7.html

 

MIS 發表在 痞客邦 留言(3) 人氣()

step1:首先安裝 Oracle 免費的資料庫版本作為測試:Oracle Database 11g Express Edition,安裝最後將system的密碼修改為oracle作為測試用。

step2:下載 AppServ 2.5.10 安裝後

  • 1. 修改php.ini檔,將;extension=php_oci8.dll 中的 ; 除去
  • 2. 修改php.ini檔,設定 session.save_path = "c:/temp"
  • 3. 並重啟apache:
    C:\AppServ\Apache2.2\bin>httpd -k restart

step3:建立 PHP 連結 Oracle 資料庫的測試程式:oracle_conn_test.php

<?php

$db = "(DESCRIPTION=(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)))(CONNECT_DATA=(SID=XE)))";

if ($c = OCILogon ( "system", "oracle", $db )) {
        
        echo "Successfully connected to Oracle.\n";
        
        OCILogoff ( $c );

} else {
        
        $err = OCIError ();
        
        echo "Connection failed." . $err [text];

}

?>

 

MIS 發表在 痞客邦 留言(0) 人氣()

在撰寫 PHP 程式時,error_reporting($Constant) 是指定PHP程式執行過程中,發生錯誤時,錯誤資訊產出在網頁的時機,只需要設定錯誤的等級,回報的錯誤將會有所不同。

參數說明:

Value

Constant

Description

Note

1 E_ERROR 執行時期致命的錯誤  
2 E_WARNING 執行時期錯誤警告  
4 E_PARSE 編譯時的程式剖析錯誤  
8 E_NOTICE 執行時期的提醒  
16 E_CORE_ERROR PHP 引擎啟動執行時產生的致命錯誤  
32 E_CORE_WARNING PHP 引擎啟動執行時產生的警告 since PHP 4
64 E_COMPILE_ERROR 致命的編譯時錯誤 since PHP 4
128 E_COMPILE_WARNING 致命的編譯時警告 since PHP 4
256 E_USER_ERROR 使用者定義的錯誤 since PHP 4
512 E_USER_WARNING 使用者定義的警告 since PHP 4
1024 E_USER_NOTICE 使用者定義的提醒 since PHP 4
2048 E_STRICT 編碼標準化警告(建議如何修改以向前兼容) since PHP 5.4
4096 E_RECOVERABLE_ERROR 接近致命的運行時錯誤,若未被捕獲則視同E_ERROR since PHP 5.2.0
8192 E_DEPRECATED Run-time notices. Enable this to receive warnings about code that will not work in future versions. since PHP 5.3.0
16384 E_USER_DEPRECATED User-generated warning message. This is like an E_DEPRECATED, except it is generated in PHP code by using the PHP function trigger_error(). since PHP 5.3.0
30719 E_ALL 所有的錯誤、警告 32767 in PHP 6, 30719 in PHP 5.3.x, 6143 in PHP 5.2.x, 2047 previously

 



範例:

1/0 會產生一個 WARNING 的錯誤等級,先將程式錯誤等級設為 E_ERROR ,則不會有錯誤訊息出現,因為已經被忽略了。

error_reporting(E_ERROR);
printf("%d\n", 1/0);

error_reporting(E_WARNING);
printf("%d\n", 1/0);


 

輸出結果:

0
Warning: Division by zero in C:\AppServ\www\test.php on line 6
0 



參考文件:
http://tw2.php.net/manual/en/errorfunc.constants.php#errorfunc.constants.errorlevels.e-error

文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()

Windows Server AD 是一個 LADP 伺服器,可讓您將資訊儲存在目錄服務中,在資料庫中進行查詢,並可以使用他來作為身份的認證授權。

使用PHP撰寫程式難免會遇到需要作身份認證的問題,除了自行撰寫這部份程式的選擇外,PHP 的函式庫中亦提供了標準的 LDAP 函式,如果公司組織中已經有架設 Windows 2K/2003 網域的環境 ,將身份認證的工作交由 Windows AD 亦是一個不錯的選擇。

在寫此程式前,請先到 php.ini 檔,打開 php_ldap.dll 的功能(預設是關閉的),否則執行時會出現未定義函數的錯誤訊息。(打開後記得要重啟apache服務,功能才會生效)

PHP可以一筆一筆撈出AD資料(ldap_first_entry / ldap_next_entry),然後將每一筆資料的欄位屬性解析出來(ldap_get_values)。

實作如下:

案例環境說明:
1.公司組織內有一個Windows 網域,名稱為: domain.com。
2.domain.com 的網域有兩部網域主控站(DC)分別為:dc.domain.com、dc2.domain.com。
3.PHP版本:5.2.1 由下載 AppServ 2.5.10 安裝

PHP程式碼範例:

<?php
$domain = 'domain.com'; //設定網域名稱
$dn="dc=domain,dc=com";

$user = 'administrator'; //設定欲認證的帳號名稱
$password = 'password'; //設定欲認證的帳號密碼

// 使用 ldap bind 
$ldaprdn = $user . '@' . $domain; 
// ldap rdn or dn 
$ldappass = $password; // 設定密碼

// 連接至網域控制站
$ldapconn = ldap_connect($domain) or die("無法連接至 $domain");

// 如果要特別指定某一部網域主控站(DC)來作認證則上面改寫為
//$ldapconn = ldap_connect('dc.domain.com) or die("無法連接至 dc.domain.com"); 
// 或 
// $ldapconn = ldap_connect('dc2.domain.com)or die("無法連接至 dc2.domain.com"); 

//以下兩行務必加上,否則 Windows AD 無法在不指定 OU 下,作搜尋的動作
ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldapconn, LDAP_OPT_REFERRALS, 0);

if ($ldapconn) 
{ 
        // binding to ldap server
        echo("連結$domain <br>".$ldaprdn.",".$ldappass."<br>");
        $ldapbind = ldap_bind($ldapconn, $user, $password);     
        //$ldapbind = ldap_bind($ldapconn, $ldaprdn, $ldappass);     
        //$ldapbind = ldap_bind($ldapconn);     
        // verify binding     
        if ($ldapbind) 
        {         
                $filter = "(sAMAccountName=$user)";        
                $result = @ldap_search($ldapconn, $dn, $filter);        
                if($result==false) 
                        echo "認證失敗(找不到 $user)";        
                else 
                {            
                        echo "認證成功...";             
                        //取出帳號的所有資訊             
                        $entries = ldap_get_entries($ldapconn, $result);
                        $data = ldap_get_entries( $ldapconn, $result );
                        
                        echo $data ["count"] . " entries returned\n";
                        
                        for($i = 0; $i <= $data ["count"]; $i ++) {
                                for($j = 0; $j <= $data [$i] ["count"]; $j ++) {
                                        echo "[$i:$j]=".$data [$i] [$j] . ": " . $data [$i] [$data [$i] [$j]] [0] . "\n<br>";
                                }
                        }                            
                }    
        } 
        else 
        {         
                echo "認證失敗...";     
        } 
}
//關閉LDAP連結
ldap_close($ldapconn);
?> 
文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()