Showing posts with label PHP. Show all posts
Showing posts with label PHP. Show all posts

2015-08-28

mod_rewrite 的寫法(以 Zend Framework 為例)

Rewrite Configuration Guide - Recommended Project Structure for Zend Framework MVC Applications - Zend Framework 提供給 .htaccess 的語法為例:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

簡單來說就是:除了有存在的檔案(-s)或([OR])符號連結(-l)或目錄(-d) 不做更動以外,其它都轉到 index.php 。其中:

  • - (第五行) 指不做變動
  • NC (No Case) 不分大小寫
  • L (Last) 若配對到此規則的話,就不重覆配對接下來的其它規則

若是轉址過來的話, $_SERVER 會多出三個變數:

$_SERVER["REDIRECT_URL"]
$_SERVER["REDIRECT_QUERY_STRING"]
$_SERVER["REDIRECT_STATUS"]

細節請參考:mod_rewrite - Apache HTTP Server Version 2.4

2015-08-27

PHP SimpleXML 和 XMLReader

SimpleXML

  • 語法較簡單,將 XML 檔案簡化成一個物件。
  • 可讀可寫。
  • 需要較多記憶體,開啟較大的 XML 檔案時要注意。

XMLReader

  • 語法較複雜,在節點(node)間移動游標(cursor)很繁雜。
  • 只能讀取。
  • 記憶體需要較少。

結論:先用 SimpleXML 開發,等到有效能問題再用 XMLReader 改寫。

2011-05-16

用 PHP 處理 dBase III (*.dbf)

這個六、日幫朋友處理一個舊系統的 dBase III 資料庫,主要是將地址裡的台北市替換為新北市。

近九萬筆的資料,手動一筆筆的輸入肯定要花上不少時間。用程式取代的方式,實際執行的時間不過1分鐘,反而大部份的時間都花在連接 dBase III 資料庫上。

最近的 PHP 版本已不再內附 dBase 函式庫,而不知為何,試了前幾個 PHP 版本的 dBase 都沒有辨法正常運作,最後還是得自行編譯才解決這個問題。

2011-05-15

在 Windows 上編譯 PHP (2011-05-16)

這次是為了 dBase 為編的。


  1. 執行開始程式集 Microsoft Windows SDK v7.1 下的 Windows SK 7.1 Command Prompt
  2. SetEnv /Release /x86 /win7
  3. 建立一個工作目錄:C:\php-sdk
  4. 下載原始碼後解壓至 C:\php-sdk\php-5.3.6 ,並跳至該目錄。
  5. 建立一個工作目錄:C:\php-sdk
  6. 到 PECL 下載 dBase 放至 C:\php-sdk\php-5.3.6\ext 裡
  7. cscript win32\build\buildconf.js
  8. cscript configure.js --enable-object-out-dir=.. --disable-all --enable-cli --enable-dbase
  9. nmake
  10. nmake install 安裝至 C:\php 需要編 cli 才行

2011-05-07

使FILTER_VALIDATE_REGEXP

使用 FILTER_VALIDATE_REGEXP 時要注意,可能要在頭尾加上 ^ 和 $ 才會傳回預期的結果,例如:

$filter = array(
    'user-id-old' => array(
        'filter' => FILTER_VALIDATE_REGEXP,
        'options' => array('regexp' => '/[a-zA-Z][a-zA-Z0-9_]*/')
    )
);

將其改為

'/^[a-zA-Z][a-zA-Z0-9_]*$/'

2011-05-06

PHP 檔案上傳

在 php.ini 中與檔案上傳有相關的設定:
  • file_uploads
    • 是否允許檔案上傳
  • upload_max_filesize
    • 上傳時單一檔案大小上限
  • upload_tmp_dir
    • 上傳的檔案一定會先傳到這個暫存目錄,所以要注意移動檔案到不同磁碟分割區時效率。
  • post_max_size
    • 用 HTTP 的 POST 方法傳送表單資料量的上限(HTML <form method="POST">),檔案上傳的量也包含在其中
  • max_file_uploads
    • 同時可上傳的檔案數量上限
    • PHP > 5.2.12
  • max_input_time
    • 允許程式分析外來資料($_POST $_GET)的時間上限
  • max_execution_time
    • 允許程式執行的時間上限
    • 會與上一項設定一樣,影嚮大檔案及低頻寬時,參見 Connection handling
檔案類型的表單欄位 (<input type="file">) 傳給 PHP 時,並不會出現在 $_POST 中,只會在 $_FILES 裡。
PHP會自動建立 $_FILES 對應每一個檔案欄位,以 <input name="userfile" type="file"/> 為例,其中將會有下列屬性:
  • $_FILES['userfile']['name']
  • $_FILES['userfile']['type']
  • $_FILES['userfile']['size']
  • $_FILES['userfile']['tmp_name']
  • $_FILES['userfile']['error']
內建的相關常數:
  • UPLOAD_ERR_OK
  • UPLOAD_ERR_INI_SIZE
    • 當要傳的檔案大於 upload_max_filesize 的值時。
  • UPLOAD_ERR_FORM_SIZE
    • 當要傳的檔案大於表單隱藏欄位 MAX_FILE_SIZE 的值時。
  • UPLOAD_ERR_PARTIAL
  • UPLOAD_ERR_NO_FILE
  • UPLOAD_ERR_NO_TMP_DIR
  • UPLOAD_ERR_CANT_WRITE
  • UPLOAD_ERR_EXTENSION
當要傳的檔案全部加起來大於 post_max_size 的值時,就不會傳回 $_FILES 。
PHP 處理檔案上傳順序,應該是有先檢查 HTTP Header 看是否超過 MAX_FILE_SIZE。
Content-Length: 104858220
Content-Disposition: form-data; name="MAX_FILE_SIZE"
PHP Warning:  POST Content-Length of 3148440 bytes exceeds the limit of 2097152 bytes in Unknown on line 0

關於 <form> 和 <input> 的 accept 屬性,在其中填入逗點分隔的 MIME Media Types,可以幫助使用者篩選檔案類型,但沒有強制效果。目前已知 Google Chrome 和 Opera 有支援,IE 和 Firefox 沒有。