2011-12-15 18:51

[PHP] Documentor (phpdoc) 備忘

Linux 安裝指令
sudo pear install -o PhpDocumentor


Windows 安裝指令
C:\wamp\bin\php\php5.2.4\pear.bat install -o PhpDocumentor


使用方式
phpdoc --parseprivate \
    --output HTML:frames:earthli \
    --ignore Smarty/ \
    --directory /var/www/lib,/var/www/data_mod,/var/www/etc \
    --target /var/www/docs


phpdoc 參數說明
-f--filename要解析的檔案名稱,可使用 ‘,’分隔多個檔案 “file1,file2”,可以包含完整路徑和使用 * ? 萬用符號。
-d--directory要解析的目錄路徑,可使用 ‘,’分隔多個目錄路徑 “directory1,directory2”。
-t--target指定要輸出的目錄。
-i--ignore要忽略的檔案名稱,可使用 ‘,’分隔多個檔案 “file1,file2”,可以使用 * ? 萬用符號。
-is--ignoresymlinks忽略系統連結的檔案或目錄,預設是關閉的。
-it--ignore-tags忽略解析的標籤。 @package, @subpackage, @access, @ignore 可能是無法忽視。
-q--quiet不顯示解析/轉換的訊息,在 cron 排程時可以選擇開啟,預設是關閉的。
-ti--title產生出的文件的標題,預設為 ‘Generated Documentation’。
-h--help顯示幫助訊息。
-pp--parseprivate將私有(private)成員函式或私有變數也都加入程式文件裡。不然產生出的文件裡只會有公開(public)和保護(protected)的成員函式和變數。
-o--output設置輸出文件的格式
  • HTML:frames:* - 包含iframe的HTML格式
  • HTML:frames:default – Javadoc風格的文檔模板,很少有格式
  • HTML:frames:earthli – 漂亮的模板(作者:Marco von Ballmoos)
  • HTML:frames:l0l33t – 流行模板
  • HTML:frames:phpdoc.de – 類似於phpdoc.de的PHPDoc輸出
  • HTML:frames:phphtmllib – 非常棒的用戶貢獻模板
  • HTML:frames:phpedit – 基於PHPEdit Help Generator的文檔
  • HTML:Smarty:* - 不使用iframe的HTML格式
  • HTML:Smarty:default – 使用css控制的黑體模板
  • HTML:Smarty:HandS – 基於PHP的格式,但是經過優化,帶有logo圖片
  • HTML:Smarty:PHP – 風格接近PHP官網
  • CHM:default:* - 輸出CHM幫助文檔
  • CHM:default:default – windows幫助文檔,基於HTML:frames:l0l33t
  • PDF:default:* - PDF格式
  • PDF:default:default – 標準純文本PDF格式
  • XML:DocBook:* - 以DocBook格式輸出的XML
  • XML:DocBook/peardoc2:default – 可以被編譯成peardoc的文檔
-j--javadocdesc相容 JavaDoc 的格式,預設是關閉的


中文亂碼的問題
新版的 phpdoc 輸出的格式已經是 UTF-8 了,所以只要在目錄下增加一個 .htaccess 文件,然後內容為:
AddCharset UTF-8 .html


參考文件:
多采多姿的程式筆記: phpDocumentor筆記 - 0 立即體驗
phpDocumentor Tutorial
phpDocumentor学习记录
2011-12-14 21:02

[轉載] Linux Rsync 參數說明

轉載自: Rsync 中文參數說明

內容開始
rsync 資料同步敘述:
rsync和rcp的模式很相似,不過rsync有需多參數可以使用來加速檔案傳送.
rsync遠端更新協定(remote-update protocol)可以透過網路來傳輸兩端檔案不同的地方.語法:
rsync [OPTION]... SRC [SRC]... DEST
rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST
rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST
rsync [OPTION]... [USER@]HOST:SRC [DEST]
rsync [OPTION]... [USER@]HOST::SRC [DEST]
rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]


rsyncd 的設定檔:
/usr/local/etc/rsyncd.conf

說明:
[ohaha]: rsync區段的設定名稱
path: 備份資料存放的路徑
auth users: 連結rsync服務的帳號
uid,gid: 採用何種身分進行檔案存取
secerts file: 帳號密碼檔位置
read only: 是否唯讀


參數:
-h,--help顯示rsync求助資訊.
--version顯示rsync版本.
-v,--verbose複雜的輸出訊息.
-q,--quiet安靜模式,幾乎沒有訊息產生.常用在以cron執行rsync.
-I,--ignore-times通常rsync為了加快速度會忽略同樣檔案大小且同樣存取時間點的檔案. 可以透過此參數關閉此快速檢查.
--size-onlyrsync只檢查檔案大小是否改變,不管時間存取點是否改變. 通常用在mirror,且對方時間不太正確時.
-c,--checksum在傳送之前透過128bit的md4檢查碼來檢查所有要傳送的檔案.(會拖慢速度.)
-a,--archivearchive mode 權限保存模式,相當於 -rlptgoD 參數. 很快速的保存幾乎所有的權限設定,除了硬式連結(透過-H設定).
-r,--recursive複製所有下層的資料(遞迴)
-R,--relative使用相對路徑.
如: rsync foo/bar/foo.c remote:/tmp/ 在遠端產生/tmp/foo.c檔案
rsync -R foo/bar/foo.c remote:/tmp/ 在遠端產生/tmp/foo/bar/foo.c 檔案
-R,--relative不使用相對路徑.
-b,--backup目的地端先前已經存在的檔案在傳輸或刪除前會被備份.
--backup-dir=DIR設定備份的資料夾.
--suffix=SUFFIX指定備份的檔案名稱字尾形式(預設為~).
-K,--keep-dirlinks接收方將連結到資料夾的檔案視為資料夾處理
-l,--links複製所有的連結
-H,--hard-links保留硬式連結
-p,--perms保留檔案權限
-o,--owner保留檔案擁有者(root only)
-g,--group保留檔案群組
-D,--devices保留device資訊(root only)
-t,--times保留時間點
-n,--dry-run不實際執行傳送,只顯示將會有的傳輸動作
-S,--sparse嘗試去處理稀疏的檔案,讓這些檔案在目的端佔去較少的磁碟空間.
-W,--whole-file複製所有的檔案,不額外作檢查.
--no-whole-file關閉 --whole-file 參數
-x,--one-file-system不要跨越檔案系統分界(只在一個檔案系統處理)
-B,--block-size=SIZE強制透過rsync程式去比對修復block-sizeforce
-e--rsh=COMMAND定義所使用的remote shell
--rsync-path=PATH定義rsync在遠端機器存放資料的路徑
--existing只比對更新目的端已經存在的檔案
--ignore-existing忽略目的端已經存在的檔案(也就是不更新)
--delete刪除傳送端已經不存在,而目的端存在的檔案
--delete-excluded除了把傳送端已經不存在,而目的端存在的檔案刪除之外, 也刪除 --exclude 參數所包含的檔案.
--delete-afterrsync預設會在檔案傳送前進行相關刪除動作確保接收端有足夠的檔案空間, 但可以透過 --delete-after 讓刪除動作在檔案傳送後再行刪除.
--ignore-errors忽略任何錯誤既使是I/O error 也進行 --delete 刪除動作.
--max-delete=NUM定義rsync不要刪除超過 NUM 個檔案.
--partialrsync若遇到傳輸過程中斷時,會把那些已經傳輸的檔案刪除.
在某種狀況下保留那些部分傳送的檔案是令人高興的.
你可以透過 --partial 參數達到這個目的.
--partial-dir=DIR在 --partial 參數啟動時,你還可以定義rsync把那些部分傳送的檔案
寫入定義的資料夾,而非直接寫入目的端.需要注意的是, 此資料夾不應該被其他使用者可以寫入.(如:/tmp)
--force當目的端資料夾被傳送端非資料夾名稱覆蓋時,強制rsync刪除資料夾, 即使該資料夾不是空的.
--numeric-ids不將傳送端檔案的uid及gid值,與目的端的使用者/群組進行配對. 若傳送端並沒有uid及gid的對應名稱(如:原帳號群組被刪除的遺留檔案), 或目的端沒有相對應的帳號/群組,保留數字型態的uid/gid
--timeout=TIMEOUT設定 I/O 逾時的時間(秒). 超過這個秒數而沒有資料傳送,rsync將會結束. 預設為0,也就是沒有定義逾時時間.
-T,--temp-dir=DIR定義rsync在接收端產生暫時性的複製檔案時使用資料夾暫存. 預設是直接在接收端資料夾直接產生暫存檔案.
--compare-dest=DIR定義rsync在目的端建立資料夾來比對傳送過來的檔案.
--link-dest=DIR與 --compare-dest 相同,但同時會針對無法改變的檔案建立硬式連結.
-z,--compress壓縮模式,當資料在傳送到目的端進行檔案壓縮.
-P-P參數和 --partial --progress 相同.只是為了把參數簡單化.
-C,--cvs-exclude排除那些通常不希望傳送的檔案.定義的方式與CVS傳送相同:
RCS SCCS CVS CVS.adm RCSLOG cvslog.* tags TAGS .make.state
.nse_depinfo *~ *$ *.old *.bak *.BAK *.orig *.rej
*.a *.olb *.o *.obj *.so *.exe *.Z *.elc *.ln core .svn/
符合以上條件的都會被忽略而不傳送.
--exclude=PATTER符合PATTERN(規則表示式)樣式的檔案不進行傳送
--exclude-from=FILE和--exclude參數相同,不過是把不進行傳送的檔案事先寫入某一檔案. 執行時,透過此參數讓rsync讀取. (; #開頭的行列或空白行會被rsync忽略)
--include=PATTERN定義rsync不要排除符合pattern樣式的檔案.
--include-from=FILE和--include參數相同,只不過把要包含的檔案寫到某一檔案.
--files-from=FILE把要傳送的檔案名稱都精確的寫入某一檔案,讓rsync讀取. 如: rsync -a --files-from=/tmp/foo /usr remote:/backup
-0--from0定義檔案所要讀取的檔案是null字元結尾.
--version顯示版本訊息.
--daemon定義rsync以daemon型態執行.
--no-detach當以daemon型態執行時,不要進行分裂且變成背景程序.
--address=ADDRESS定義所要連結(bind)的ip位址或是host名稱(daemon限定)
--config=FILE定義所要讀取的設定檔rsyncd.conf位置(daemon限定) 預設值為 /usr/local/etc/rsyncd.conf
--port=PORT定義rsyncd(daemon)要執行的port(預設為tcp 873)
--blocking-io使用blocking I/O連結遠端的shell,如rsh , remsh
--no-blocking-io使用non-blocking連結遠端的shell,如ssh (預設值)
--stats顯示檔案傳送時的資訊狀態
--progress顯示傳送的進度.(給檔案傳送時,怕無聊的人用的..)
--log-format=FORMAT定義log的格式(在rsyncd.conf設定)
--password-file=FILE從檔案讀取與遠端rsync伺服器連結的密碼
--bwlimit=KBPS定義傳輸頻寬的大小(KBytes/秒)
--write-batch=FILE把紀錄資料寫入一個檔案(給其他相同環境且相同需求的機器使用)
--read-batch=FILE透過讀取紀錄檔案來進行傳輸.(檔案由 --write-batch 參數產生)
--checksum-seed=NUM定義檔案 checksum-seed 的大小(byte)
-4--ipv4使用IPv4協定
-6--ipv6使用IPv6協定
2011-12-14 16:22

[PHP] 取得用戶真實 IP

轉載自:精進你的程式碼 - 從取得用戶端 IP 的函式談起

<?php
function get_client_ip(){
    foreach (array(
        'HTTP_CLIENT_IP',
        'HTTP_X_FORWARDED_FOR',
        'HTTP_X_FORWARDED',
        'HTTP_X_CLUSTER_CLIENT_IP',
        'HTTP_FORWARDED_FOR',
        'HTTP_FORWARDED',
        'REMOTE_ADDR'
    ) as $key) {
        if(!array_key_exists($key, $_SERVER)){ continue; }
        
        foreach (explode(',', $_SERVER[$key]) as $ip) {
            $ip = trim($ip);
            if ((bool) filter_var($ip, 
                FILTER_VALIDATE_IP,
                FILTER_FLAG_IPV4 |
                FILTER_FLAG_NO_PRIV_RANGE |
                FILTER_FLAG_NO_RES_RANGE
            )){ return $ip; }
        }
    }
    return null;
}
2011-12-14 15:26

[Ubuntu] 掛載 Windows 分享目錄

  • 安裝 smbfs 套件
    sudo apt-get install smbfs
  • 建立掛載目錄
    sudo mkdir /mnt/windows_share
  • 開放最大權限
    sudo chmod 777
  • 測試掛載
    sudo mount -t cifs //192.168.0.10/my_share /mnt/windows_share -o username=jax,password=1234,noacl,noperm,codepage=cp950,iocharset=big5,file_mode=0666,dir_mode=0777
    
  • 察看是否成功
    df -h
    Filesystem Size Used Avail Use% Mounted on
    //192.168.0.10/my_share 7.9G 208K 7.9G 1% /mnt/windows_share
  • 卸載
    sudo umount /mnt/windows_share
  • 修改開機掛載設定檔
    sudo vim /etc/fstab
    /mnt/windows_share was on //192.168.0.10/my_share
    //192.168.0.10/my_share /mnt/windows_share cifs username=jax,password=1234,noacl,noperm,codepage=cp950,iocharset=big5,file_mode=0666,dir_mode=0777 0 0
    
  • 套用開機設定檔
    mount -a
  • 再次察看是否成功
    df -h
    Filesystem Size Used Avail Use% Mounted on
    //192.168.0.10/my_share 7.9G 208K 7.9G 1% /mnt/windows_share

參考資料:
在 ubuntu 中 mount windows 分享的目錄
載掛(Mount)遠端資料夾的應用
ubuntu的几个技巧: 自动连接Windows共享文件夹, 定时文件同步备份
2011-11-23 00:38

[MySQL] EXPLAIN 分析報告的意義

轉載自:PHP + MySQL 程式設計研習

  • table
    表示所引用的表格名稱。
  • type
    表示查詢時的「聯結類型」(join type),以下依序是「最佳」至「最差」的各種類型:
    • system
      表格中僅有一列。這是 const 類型的一個特例。
    • const
      表格中符合條件的只有一列。因為僅有一列,其值在後續的查詢中可被視為常數。
    • eq_ref
      表示在與其它表格的資料列結合時,此表格只有一列會被讀取。當 join 使用到資料表中的所有索引,並索引是 UNIQUE 或 PRIMARY KEY 時才會被用到。
    • ref
      表示在與其它表格的資料列結合時,此表格中所有符合的資料列都會被讀出來。這是當 join 只使用到部份鍵值(註),或此鍵非 UNIQUE 或 PRIMARY KEY 時才會用到(依照 join 的條件仍然無法選定單一目標列)。若因此符合的資料列數不多的話,它也算是一種不錯的「聯結類型」。
      註:我們指定「A+B」欄位為 index key,但查詢時只用到「A」欄位。
    • range
      表示將在一定範圍內執行搜尋的動作。
    • index
      與 ALL 相同,但只有 index table 會被瀏覽。這通常比 ALL 快,因為 index table 通常比原始資料表來得小。
    • All
      表示這項查詢將對整個原始資料表瀏覽一遍,是最不好的類型。
  • possible_keys
    表示 MySQL 能夠藉由哪些 index 來搜尋目標。
  • key
    表示 MySQL 實際藉由哪個 index 來搜尋目標。
  • key_len
    表示 MySQL 實際使用的 key 長度。若 index key 是由兩個欄位以上複合而成的話,您可以在此看見 MySQL 使用了 index 的多少部份。
  • ref
    表示哪個欄位(或常數)將被用來與 key 一起比對。
  • rows
    表示 MySQL 粗略估計在查詢的過程中,必須瀏覽的資料列數。
  • Extra
    顯示 MySQL 在解決這項查詢工作時的一些附加訊息。例如:「where used」表示 where 子句將會限制某些資料列的輸出。
2011-11-23 00:14

[MySQL] TEMPORARY 臨時表

最近為了解決一個效率太差的問題而找上這個東西,由於有一個資料表的筆數實在太多了,再加上好幾百個 query 都同時在同一個區段做查詢,剛好可以使用臨時表來處理這個問題,原本查詢需要的時間大概超過一分鐘,現在最多只要 10 秒,刷新後約 2 秒。

MySQL 的臨時表只會存在在 Session 期間,當 Session 結束後就會自動刪除,不同的 Session 的表名稱並不會衝突,所以就算用一樣的名稱也不會出現錯誤,臨時表只能用在 MEMORY,MyISAM,MERGE,或者InnoDB 引擎上。

-- 透過 SELECT 建立臨時表
CREATE TEMPORARY TABLE my_temp_table ENGINE=MEMORY
SELECT * FROM my_table WHERE col_1 > 1000

-- 為臨時表建立索引
ALTER TABLE my_temp_table
    ADD INDEX (col_1),
    ADD INDEX (col_1,col_2)

參考資料:
MySQL CREATE TABLE Syntax
mysql temporary table簡介
避免 MySQL 使用 temporary table on disk
2011-11-22 23:29

[PHP] 把多個圖片壓縮封裝並下載

<?php
$fileList = array(
    '/var/www/pics/001.jpg',
    '/var/www/pics/002.jpg',
    '/var/www/pics/003.jpg',
    '/var/www/pics/004.jpg',
    '/var/www/pics/005.jpg',
    '/var/www/pics/006.jpg',
);


/*建立臨時壓縮檔*/
$file = tempnam("tmp", "zip");
$zip = new ZipArchive;
$res = $zip->open($file, ZipArchive::CREATE|ZipArchive::OVERWRITE);
if ($res!==true) { exit('壓縮錯誤');}

foreach ($filePathList as $filePath){
    $zip->addFile($filePath, $fileName);
}
$zip->close();

ob_end_clean();
header('Content-type: application/octet-stream');
header('Content-Transfer-Encoding: Binary');
header('Content-disposition: attachment; filename=pics_list.zip');

readfile($file);
unlink($file); 
exit;

參考連結:PHP: ZipArchive - Manual