照以下步驟處理:

1. yum instal kernel-PAE kernel-PAE-devel kernel-headers kmod-xfs-PAE

2. vi /boot/grub/grub.conf

3. defult=0

4. reboot

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

切割字串通常都是有某些特殊分隔用 split 來分隔, 而另外一種是固定長度的切割法, 就是第一欄長度是 20, 第二欄長度是 15 .. 等, 遇到這種可以使用 unpack 來切割.

簡單範例

下述範例 $str 裡面第一欄的長度是 10, 第二欄是 10, 第三欄是 9, 第四欄是 8 (算法是由字串開始算到最後面空白結束), 那 unpack 用法就如下述範例:


<?php
$str = '12/01/08  00:22:33  112233   12342222';
print_r(unpack('a10date/a10time/a9phone/a8tel', $str));
?>

輸出結果:

Array
(
    [date] => 12/01/08
    [time] => 00:22:33
    [phone] => 112233
    [tel] => 12342222
)

unpack 裡面的第一欄 format 格式, 上述用的都是 a NUL-padded string (詳細格式可見: pack), "/" 是分隔下一欄用, 所以格式寫起來是 "10個字 指定給 date 的變數 / 10個字 指定給 time 的變數 ... 等", 而因為是固定字串, 所以這些資料印出來的後面, 有可能會有空白, 可以再用 trim 去掉.

範例: 讀檔再切割

範例2: (讀檔再切割)

<?php
$handle = fopen("unpack.txt", "r");
while (!feof($handle)) {
    $t = unpack("a10date/a10time/a9phone/a8tel", fgets($handle));

    $date  = trim($t['date']);
    $time  = trim($t['time']);
    $phone = trim($t['phone']);
    $tel   = trim($t['tel']);

    // todo something.
}
fclose($handle);
?>

 

文章轉載自 Tsung's Blog

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

管理 MySQL 最讓人困擾的就是如何有效的掌握 MySQL 的健康狀況,因為 MySQL 雖然有提供許多系統變數值供您參考,但這些零散的數據若要手動搜集與過濾將會是一件十分沒有效率的事情(除非您寫 Scripts 去分析)。而接下來要介紹的這套 "工具" 其實是由 hackmysql.com 的站長所撰寫的 Perl Scritps,旨在協助 MySQL DBA 搜集與分析 MySQL 的運作狀況。

官方網站: http://hackmysql.com/
軟體下載: http://hackmysql.com/mysqlreport

這份文件有很大部份是參考 Daniel Nichter 的 mysqlreport Guide(http://hackmysql.com/mysqlreportguide),但不完全是翻譯,裡面加入了一些我覺得可能會對讀者有幫助的資料,並刪除了部份我認為會對讀者產生混淆的資訊。小弟的功力不足,也許會有所錯誤,若是您發現我有地方寫錯了也請您不吝指正,謝謝。



接下來本文開始:

mysqlreport 可將重要的 MySQL 系統資訊整理為具有較高可讀性的報表,使你更容易閱讀與深入理解目前 MySQL 的實際運作狀況。除了手動執行 SHOW STATUS 指令並以人眼去過濾與判斷目前的系統狀態以外,mysqlreport 大概是較好(八成也是唯一)的替代方案。

目前的 mysqlreport 版本可以產生大量、具有完善資訊的報表,其報表完整的覆蓋了實務上所有重要的 MySQL 系統資訊,也可以產生只具有最重要資訊的較精簡報表。完整的報表包含了 14 種不同面向,超過 121 行的完整資訊;精簡的報表包含了 6 種不同面向,總計 29 行的最重要資訊。

此文件可教導您如何解讀 mysqlreport 所產生出來的各項資訊。如此一來,當您在閱讀 mysqlreport 所產生出來的報表時,您才可以回答最重要的問題:『MySQL Server 目前的運作狀況究竟如何?』

為了讓您有較深入的理解,此文件將從報表的第一行開始逐項的解釋,當您閱讀完此文件後,您應該具有完整的知識可以將 mysqlreport 佈署在任何 Server 上,並且有效的掌握 MySQL Server 的運作實況。

在開始之前,這裡有一份範例報表,我們將以此份報表為藍本開始進行教學。
(建議您將此報表列印出來和內文對照看,這樣子會比較容易理解文章內容)

PHP 語法:
   1 MySQL 5.0.3              uptime 0 0:34:26       Fri Sep  1 19:46:02 2006
   2
   3 __ Key _________________________________________________________________
   4 Buffer used   380.00k of 512.00M  
%Used:   0.07
   5   Current      59.32M            
%Usage:  11.59
   6 Write ratio      0.93
   7 Read ratio       0.00
   8 
   9 __ Questions ___________________________________________________________
  10 Total          98.06k   47.46
/s
  11   DMS          81.23k   39.32
/s  %Total:  82.84
  12   QC Hits      16.58k    8.02
/s           16.91
  13   COM_QUIT        200    0.10
/s            0.20
  14   Com_            131    0.06
/s            0.13
  15   
-Unknown         82    0.04/s            0.08
  16 Slow                0    0.00
/s            0.00  %DMS:   0.00
  17 DMS            81.23k   39.32
/s           82.84
  18   SELECT       64.44k   31.19
/s           65.72         79.33
  19   INSERT       16.75k    8.11
/s           17.08         20.61
  20   UPDATE           41    0.02
/s            0.04          0.05
  21   REPLACE           0    0.00
/s            0.00          0.00
  22   DELETE            0    0.00
/s            0.00          0.00
  23 Com_              131    0.06
/s            0.13
  24   change_db       119    0.06
/s            0.12
  25   show_fields       9    0.00
/s            0.01
  26   show_status       2    0.00
/s            0.00
  27 
  28 __ SELECT 
and Sort _____________________________________________________
  29 Scan               38    0.02
/%SELECT:   0.06
  30 Range              14    0.01
/s            0.02
  31 Full join           3    0.00
/s            0.00
  32 Range check         0    0.00
/s            0.00
  33 Full rng join       0    0.00
/s            0.00
  34 Sort scan          14    0.01
/s
  35 Sort range         26    0.01
/s
  36 Sort mrg pass       0    0.00
/s
  37
  38 __ Query Cache _________________________________________________________
  39 Memory usage   17.81M of  32.00M  
%Used:  55.66
  40 Block Fragmnt  13.05
%
  
41 Hits           16.58k    8.02/s
  42 Inserts        48.50k   23.48
/s
  43 Prunes         33.46k   16.20
/s
  44 Insrt
:Prune    1.45:1    7.28/s
  45 Hit
:Insert     0.34:1
  46
  47 __ Table Locks _________________________________________________________
  48 Waited          1.01k    0.49
/s  %Total:   1.24
  49 Immediate      80.04k   38.74
/s
  50
  51 __ Tables ______________________________________________________________
  52 Open              107 of 1024    
%Cache:  10.45
  53 Opened            118    0.06
/s
  54
  55 __ Connections _________________________________________________________
  56 Max used           77 of  600      
%Max:  12.83
  57 Total             202    0.10
/s
  58
  59 __ Created Temp ________________________________________________________
  60 Disk table         10    0.00
/s
  61 Table              26    0.01
/s
  62 File                3    0.00
/s
  63
  64 __ Threads _____________________________________________________________
  65 Running            55 of   77
  66 Cache               0              
%Hit:    0.5
  67 Created           201    0.10
/s
  68 Slow                0    0.00
/s
  69
  70 __ Aborted _____________________________________________________________
  71 Clients             0    0.00
/s
  72 Connects            8    0.00
/s
  73
  74 __ Bytes _______________________________________________________________
  75 Sent           38.46M  18.62k
/s
  76 Received        7.98M   3.86k
/



Report Header: Line 1

報表的第一行包含了三 樣不同的資訊:MySQL Server 的版本、自上次啟動後已經過多少時間、目前 Server 的日期與時間。有些人會定時讓系統自動產生報表(eg. cron)然後用程式去分析進行分析,此時表頭將可用來協助您辨識出不同時間點的報表。對於那些租用或使用虛擬主機的管理者,表頭可以協助您了解自己所需 面對的是什麼樣的 Server。MySQL Server 版本可以指出該 Server 有提供或沒有提供那些功能,而它的 Uptime 則表示該報表具有多大的代表性。Uptime 是重要的指標,可讓您了解此份報表所包含的資訊是否可能有偏誤,一般來說 Uptime 最少要有一小時會比較適當,甚至光是一小時其實也還不夠。例如您的 Server 可能已執行了六個小時,但此六小時皆是在使用率最低的午夜,此時產生出的報表就很不具有代表性。最理想的情況下,你會希望 MySQL Server 至少已經執行了一整天,這樣子一來你就可以確定報表中的資訊已包含了 Server 負載的高峰與低峰期,而不是只包含其中之一。在範例報表中 Server 只執行了 34 分鐘,因此該報表的代表性是不足的,但因為這只是用來做範例,也就沒什麼關係。



Key Report: Lines 3 - 7

第一個主要報告區 塊就是 Key Report,因為 Key(Indexes, 索引)是所有資訊中最重要的一項。雖然此報表無法告知您 Server 是否有善用 Index,但它可以告訴您 Server 對於 Shared Key Buffer 的使用狀態。請注意,這裡所指的 Key Buffer 是指 MyISAM Storage Engine 所使用的 Shared Key Buffer,InnoDB 所使用的 Key Buffer 並不包含在內。

MySQL Server 支援許多種不同類型的資料表(比較正式的說法是 Storage Engine),你可以將它們想像為各種不同的資料結構,而不同的 Storage Engine 各有其優缺點。其中 MySQL Server 預設是使用 MyISAM Storage Engine。

MySQL Server 的 Buffer 大略可分為二種:
1. Global Buffer:由所有 Client 所共用的 Buffer
key_buffer
innodb_buffer_pool
innodb_log_buffer
innodb_additional_mem_pool
net_buffer ...等等
2. Thread Buffer:個別的 Connection 所需佔用的 Buffer
例如:
sort_buffer
myisam_sort_buffer
read_buffer
join_buffer
read_rnd_buffer ...等等
計算 Server 至少需使用的總記憶體數量的方式為:
min_memory_needed = global_buffer + (thread_buffers * max_connection)

關於 MySQL 的 Cache 機制有一點需要特別注意,各位應該都知道 MyISAM Storage Engine 將每個 table 分成三個檔案儲存在硬碟之中,例如若您有一個資料表的名稱為 example,那麼您就會在硬碟上發現 example.FRM, example.MYD, example.MYI 等三個檔案。這三個檔案所儲存的資料如下:
FRM: 儲存這個資料表的結構
MYD: Row Data,也就是你存在 example 資料表裡的資料
MYI: 此資料表的索引
接下來是重點:
當 MySQL 要 Cache 某個資料表時,請問 MySQL 會 Cache 哪些資料?

答案是:
MySQL 只會 Cache 索引,也就是 *.MYI 檔案,而 Row Data(*.MYD) 則是交由作業系統來負責 Cache。

接下來我們再回到 Key Buffer,有個很重要的問題我們一直沒有回答,就是『到底 Key Buffer 要設定多少才夠呢?』。如前所述,MySQL 只會 Cache 索引(*.MYI),因此您只要將資料庫中所有的 MYI 檔案加總起來,你就會知道大概要設為多少。



Buffer used: Line 4

身為 MySQL 的管理者您通常會問的第一個問題是:『Server 到底用掉了多少 key buffer?』。如果您發現 MySQL 只使用了一小部份的 Key Buffer,這並不是什麼需要注意的問題,因為 MySQL 只會在需要的時候才實際分配與使用 System RAM。也就是說,當你設定 MySQL 可使用 512MB 的 RAM 時,並不代表 MySQL 啟動的時候將佔用 512MB 的 RAM(只有在 MySQL 認為需要這麼做的時候才會)。報表中的第四行(Buffer used)指出 MySQL "曾經" 耗用過的最大記憶體數量,因此目前 "正在使用" 的記憶體數量有可能少於(甚至大於)這個數字。MySQL 稱此數值為 "High Water Mark",但在報表的下一行我們將會看到它並不總是如此。無論如何,從 Buffer used 我們通常可以看出 key_buffer_size 這個系統變數值是否設定的夠大,如果你的 MySQL 已經使用了 80~90% 以上的 Key Buffer,你就應該要調高 key_buffer_size。注意,Buffer used 永遠不會有使用率超過 95% 的情況,因為 MySQL 的官方文件中指出 Share Key Buffer 中有部份將會挪用給內部資料結構使用,因此當 Buffer used 指出 Share Key Buffer 的使用率高達 95% 時,其實在實務上等於是已使用了 100% 的 Share Key Buffer。在這個例子中 Server 只使用了 380KB(0.07%) 的 Share Key Buffer,看到這裡也許您會判斷 Server 的 Share Key Buffer 是十分充足的,但請勿太早下定論,我們必須要接著考量報表中的下一行才能做出客觀的判斷......。



Current: Line 5

mysqlreport 使用 Key_blocks_unused 這個系統變數來決定目前 MySQL "正在使用" 的 Share Key Buffer 大小,只有在 MySQL Server 4.1.2 以上的版本才會有這個功能。如果報表中的上一行(Buffer used)真的有如 MySQL 官方文件中所說的是 "High Water Mark",那麼 Current 所載明的數值應該永遠會小於或等於它。但在接下來的例子中我們將會看到,事情並不總是如此。目前這台 Server 已經使用了大約 60MB(12%) 的 Share Key Buffer,這是一個好現象因為它代表了你的 Share Key Buffer 仍然十分充足。Current 與 Buffer used 合在一起看即可提供一個很有用的指標,告訴您目前的 key_buffer_size 是否充足。

設定 key_buffer_size 的方式也很簡單,只要直接修改 MySQL 的設定檔然後重新啟動 Server 即可。例如若要將 Key Buffer 設定為 2000MB,則只要在 /etc/my.cnf 中加上:
[mysqld]
key_buffer_size=2000M



Write ratio: Line 6

索引(Indexes, Keys)主要是在記憶體內(RAM-Based)進行操作的,索引之所以如此有用有部份原因就歸功於它們主要是在 RAM 裡面運作,因此擁有極高的存取效能,不像儲存在硬碟中的資料存取速度非常慢。然而,不可否認的是 MySQL 終究還是必須從硬碟中將索引讀入 RAM 或是將儲存在 RAM 中的索引寫回硬碟之中。Write ratio 標示著 MySQL 將索引寫入硬碟與 MySQL 將索引寫入 RAM 的比值(Write Ratio = MySQL 將索引寫入硬碟的次數 / MySQL 將索引寫入 RAM 的次數)。具有接近於 1 的 Write Ratio 並不是一件很罕見的事,就像 MySQL 官方手冊中所說的,如果你的 MySQL 最主要的活動是 Update、Insert 等等,那麼 Write Ratio 將會很接近於 1。Write Ratio 若大於 1 表示 MySQL 將索引寫入硬碟的次數大於將索引寫入 RAM 的次數,很少有 MySQL Server 的 Write Ratio 會大於 1,絕大部份都應該會小於 1,即便是負載非常重的 Server。



Read ratio: Line 7

Read Ratio 比 Write Ratio 來得重要一些,它標示了 MySQL 從硬碟讀取索引與從 RAM 讀取索引的比值(Read Ratio = MySQL 從硬碟讀取索引的次數 / MySQL 從 RAM 讀取索引的次數)。Read Ratio 的值應該要是 0.00 或 0.01,若大於這個值則表示 Server 有問題需要進一步的調查,通常此問題的成因是 Share Key Buffer 設得太小造成 MySQL 需要不斷地從硬碟中讀取所需要的索引資訊,而這個動作是十分沒有效率的並且完全抵消了使用索引可以帶來的好處。在 Server 剛啟動的頭一個小時 Read Ratio 很常會出現大於 0.01 的數值,但 Server 執行過一陣子後它應該(也必須)降低至 0.01 或是 0.00。



Questions Report: Lines 9 - 26

第 二個主要的報表區塊,Questions,是第二重要的資訊,因為它可以告訴你 MySQL 到底都在忙些什麼事情。Questions 包含了 SQL queries 以及 MySQL protocol communications。大部份的人都只在意 Server 每秒可以處理多少查詢(Queries Per Second, QPS),但若以整個 Server 的觀點來考量,QPS 其實是非常不精確的數值,它無法有效的告訴您 Server 的整體運作狀況。而 Questions 則提供了較完整的資訊,讓您一窺 Server 的全貌。



Total: Line 10

第一個欄位單純的記載 MySQL 總共回應過多少查詢,第二個欄位則記錄回應的頻率(QPS),當大部份的人說『我的 Server 平均每秒處理 XXX 個查詢』時,他們指的其實就是第二個欄位所記錄的回應頻率。此時你應該要反問他們『在那 XXX 個查詢之中,MySQL 到底做了哪些事情?』,接下來 mysqlreport 將可以協助您回答此問題......。



Distribution of Total Queries (DTQ): Lines 11 - 15

所有的 Questions 可以大致區分為五個不同的類別:
1.Data Manipulation Statements (DMS)
2.query cache hits (QC Hits)
3.COM_QUIT
4.all other Com_ commands
5.Unknown

這五個類別將會展示在 Lines 11 至 15,但它們的順序是會改變的。mysqlreport 預設是以查詢的總數(第一個欄位)來排序,次數越多排得越上面,讓您可以快速的分辨出 MySQL 大部份時間都在忙些什麼東西。理想的情況下,你會希望 MySQL 把大部份的時間都花在 DMS 與 QC Hits 這兩個類別,因為這兩個類別才是真正在 "完成正事" 的類別。COM_QUIT、Com_、與 Unknown 也有其存在的必要,但它們應該只佔了其中的一小部份。在繼續深入介紹之前,也許你會好奇第三個欄位是做什麼用的,它代表了該分類(例如 DMS)佔全部 Queries 的百分比;若是在子分類(例如 Select)中,則表示該子分類佔所屬分類(例如 DMS)的百分比。在此範例中 DMS 佔了所有 Queries 的 82.84%,這是一個很好的現象。

Data manipulation statements(DMS) 包含 了:ELECT, INSERT, REPLACE, UPDATE, 與 DELETE(技術上來說,其實不只這幾個類別但 mysqlreport 只會用到這幾類)。基本上,你可以將 DMS 想成是 MySQL 真正有在做些 "有用的事" 的情況,因此你會希望 DMS 是 MySQL 最忙著處理的事情。

QC Hits 是 MySQL 不需要實際執行 Query 而只要直接從 Query Cache 中即可找到所需資料的次數。擁有高比例的 QC Hits 是讓人夢寐以求的事,因為從 Query Cache 直接存取所需要的資料是十分快速且有效率的。然而大部份的 MySQL Server 因為各種原因,而無法具有非常有效率的 Query Cache。在本範例中 QC Hits 佔了所有 Questions 的 16.91%,這是非常好的情況。然而,千萬不要被這個數值給誤導了,在報表中的 38 至 45 行(Query Cache Report)將會告訴您完全不同的狀況。這是一個很好的範例,展示了 mysqlreport 可以做為深入、相互參照與比對的分析工具。當 QC Hits 看來似乎十分完美時,這個 Server 的 Qeury Cache Report 卻可以明確的告訴您其實事情沒有表面上看起來的那樣完美,我們在稍後會在回到這個問題。


COM_QUIT 算是比較不重要的類別,若您不是真的很有興趣其實您大可忽略這個類別的內容。

COM_ 這個類別代表著所有 MySQL 所執行過的指令,通常與 MySQL protocol 相關。在正常的情況下,你會希望這個類別所佔的比例越低越好,因為當這個數值很高的時候就表示 MySQL 正忙碌於無關緊要的事情上。若這個數值很高通常代表 MySQL 正遭遇到某些很奇怪的問題,當我們深入討論 COM_ 的子類別的時候,我們會在回來探討這個問題。

Unknown 是推論出來的類別,在理想的狀況下,之前所述的四個分類加總起來應 該要等於 Questions 總數,但它們通常不會剛好等於。這是因為有些 Questions MySQL 在處理時會增加 Total Questions 的計數器,但卻沒有相對應的系統變數用來記錄所執行過的 Questions。在不同的 Server 上這個數值的變異很大,在有些 Server 上這個數值非常的高,在有些 Server 上則非常的低,但在大部份的情況下它應該要維持在很低的水準才是。如果這個數值非常的高,可能代表 MySQL Server 有什麼地方出了問題。

Slow: Line 16
第 16 行非常的重要:它記錄了 MySQL 總共執行了多少次 Slow Query。Slow Query 就是指執行所需時間超過某個時間區間的 Query,例如執行超過 10 秒的 Query。用來判定是否為 Slow Query 的時間區間是可以透過 long_query_time 這個系統變數來設定的,MySQL 預設 long_query_time 為 10 秒,但通常我們會將它設定為 5 秒。在最理想的情況下,我們會希望看到這個數值等於零,但通常這數值不會是零。一般來說 Slow Query 佔 Total Questions 的比例應該要低於 0.05,Slow Query 的次數(第一個欄位)本身不是很重要,真正需要注意的是 Slow Query 佔 Total Questions 的比例,若這比例偏高就代表 Server 有些問題需要解決。第四個欄位中的『%DMS: 』表示 Slow Query 在所有 DMS 中所佔的比例。


DMS: Lines 17 - 22
DMS 的子分類項目可以告訴我們,這台 MySQL Server 是屬於哪一個類型的 MySQL Server,例如它是著重在 SELECT 操作或是 INSERT 操作,大部份的 MySQL Server 都是著重在 SELECT 操作。知道某台 Server 是屬於哪一個類型的 MySQL Server 有助於我們思考報表中的其他資訊,例如一台著重在 SELECT 操作的 MySQL Server 的 Write Ratio 應該會非常的接近 1,並有著較高的 Lock 時間。同時它也隱含了一個意義,就是也許你可以考慮使用 InnoDB Storage Engine,因為 MySQL 預設採用的 MyISAM Storage Engine 所提供的 Lock 層級只有 Table Lock(只能針對整個資料表鎖定),而 InnoDB 則提供 Row Lock 層級的鎖定機制(可只針對特定的 ROW 進行鎖定,減少等待時間)。若是著重在 SELECT 操作的 Server,它的 Read Ratio 應該會接近於零,並有著非常低的 Table Lock 時間。

在範例中的 Server 是屬於著重在 SELECT 操作的 Server:65.72% 的 Questions 是 SELECT(第三個欄位)、79.33% 的 DMS Questions 是 SELECT(第四個欄位)。很明顯的,這是台著重在 SELECT 操作的 Server,知道了此項事實之後,我們才有辦法對其進行最佳化。


Com_: Lines 23 - 26
這個子分類只有在它的值偏高的時候才需要注意,因為過高的值表示 MySQL 正在忙著處理 "程式方面的東西",而不是回應使用者的查詢。對大部份的 Server 來說這裡應該都不會出現偏高的數值,但您最好還是定期的檢查一下。


SELECT and Sort Report: Lines 28 - 36
大 致上來說,你只要注意第 29 行與第 31 行:Scan 與 Full Join。Scan 指的是有多少 SELECT statements 造成 MySQL 需要進行 Full Table Scan。Full Join 的意思與 Scan 差不多,但它是適用在多個 Tables 相互 Join 在一起的情況。這二種情況的執行效能都非常的差,因此原則上你會希望這兩個數值越低越好。但這也不是絕對的,仍然要考慮實際的情況,例如雖然 Server 有很高比例的 Scan,但若這些 Scan 都是針對一些只有幾十筆資料的 table,那麼相對而言它依然是十分有效率的;但反之,若這些 Scan 是針對具有上百萬筆資料的 table,那麼就會嚴重影響系統效能。


Query Cache Report: Lines 38 - 45
Query Cache Report 只有在 MySQL 有支援 Query Cache,以及 Query Cache 功能有開啟的情況下才會有這段資訊出現。


Memory usage: Line 39
此項目指出 Query Cache 的使用狀況,若系統已達到 Query Cache 的上限則會連帶影響到 Prunes Value,因為當配給的 Memory 不足時,MySQL 必須不斷地消除 RAM 中較不常使用的資料以挪出空間擺放新的資料。


Block Fragmnt: Line 40
這個數值越高表示 Query Cache 的 Fragment 狀況越嚴重,通常它會界於 10%~20% 之間。在此範例中 Block Fragmnt 為 13.05%,這是可接受的情況,當然你也可以調整 query_cache_min_res_unit 的值來降低 Block Fragmnt。


Hits, Inserts, Prunes: Lines 41 - 43
Hits 是這三個數值中最重要的一項,因為它指出有多少 SELECT statements 是可直接從 Query Cache 裡面取得所需的資訊,此數值越高就越好。Inserts 和 Prunes 最好是從第 44 行的比值來觀察比較容易理解。雖然 Prunes 的值偏高可能代表著 Query Cache 設得不夠大,但並不一定是如此。在本例中只有 55% 的 Query Cache 被使用,有著相對而言算低的 fragmentation 值,但 Prunes 值偏高,Prunes 的值(16/s)是 QC Hits 的兩倍。你可以想像這台 Server 的 Query Cache 是一顆蘋果樹,它的樹枝被剪去的速度比你採收蘋果的速度還快。


Insrt:Prune and Hit:Insert Ratios: Lines 44 - 45
第 44 行中的 Insert 與 Prune 的比值可顯示 Query Cache 的揮發性。在一個高度穩定的 Query Cache 中,Insrt 的值應該要高於 Prune 的值;反之,在一個揮發性較高(較不穩定)的 Query Cache 中,這個比值將會是 1:1 或是偏重在 Prune 那方,這表示 Query Cache 中的資料有可能在使用到之前就已經被清除了。我們會希望擁有一個穩定的 Query Cache,因為穩定的 Query Cache 表示那些被 Cache 在 Query Cache 中的資料會常被用到。高揮發性(較不穩定)的 Query Cache 代表兩件事情:第一,Query Cache 設得太小,需要加大。第二,MySQL 正試圖要 cache 所有的東西,甚至是那些其實並不需要 cache 的資料。若是第一種狀況,只要單純的加大 Query Cache 即可。若是第二種情況,可能是 MySQL 試圖要去 cache 所有可以 cache 的資料,你可以使用 SQL_NO_CACHE 來明確的告訴 MySQL 什麼資料是你不想要 cache 的。

Hit 與 Insert 的比值代表著 Query Cache 的有效性,理想的情況是我們新增了一些 Qeury 到 Query Cache 中,然後希望得到許多 Hits。因此若是這個 Query Cache 是有效率的,那麼該比值應該要偏重在左方。若比值是偏重在 Insert 那方,那麼這個 Query Cache 的揮發性就太高了。考慮以下這個比值,若 Hit:Insert 為 1:1,那就表示 Query Cache 中的資料只使用了一次就被清除掉了,換句話說,我們放進去的資料比我們從裡面拿出來的資料還多,這樣一來就失去了使用 Query Cache 的意義。回想我們前面所提過的,雖然在本範例中 QC Hit 在全部的 Questions 中佔了很高的比例,但實際上我們可以發現 QC 的有效性其實是很低的(Hit:Insert 的比值偏重在 Insert 那方)。若造成這個現象的原因是 MySQL 正試圖 cache 所有的東西,那麼將 Cache 模式改為 DEMAND 或許可以解決此問題。


Table Locks Report: Lines 47 - 49
這 個部份包含了兩項資訊:第一項是 Waited,代表 MySQL 需要等待以取得 table lock 的次數。第二項是 Immediate,表示 MySQL 不需要等待即可立刻取得 table lock 的次數。對資料庫來說『等待』幾乎可以肯定是一件很不好的事情,因此 Waited 的值應該要越小越好。最具有代表性的是第三個欄位(Waited 佔所有 table lock 的百分比),這個數值應該要小於 10%,大於這個值就表示 table/query 的索引設計不良或是有過多的 Slow Query。


Tables Report: Lines 51 - 53
Tables Report 同樣包含了二項資訊:第一是 Open,顯示目前正開啟的 table 數量、總共可開啟的最大數量,以及 Table Cache 的使用狀況。第二是 Opend,表示截至目前為止 MySQL 總共開啟過的 Table 數量,以及除上 Uptime 後的比值。這裡有兩件事值得注意:首先是 Table Cache 的使用狀況,100% 的 Table Cache 使用率並不是一件壞事但你可以試著調大 Table Cache 以增進效能。第二是 MySQL 開啟 Table 的平均速率,若這個值很高則表示您的 table_cache 設得太小了,需要調大一些。一般來說,MySQL 開啟 Table 的平均速率最好是小於 1/s。但大於這個數值也不一定就是壞事,有些調校良好且運作的十分有效率的 MySQL Server 其值為 7/s 並使用了 100% 的 Table Cache。


Connections Report: Lines 55 - 57
Connections Report 所代表的意義與 Tables Report 相似,請各位以此類推。比較需要注意的是:若你發現 Connections 的使用率接近 100%,也許你會想調大 max_connections 的值以允許 MySQL 的 Client 建立更多連線。然而,這通常是一種錯誤。我們常常可以發現很多網路上的資料會教我們要調大 max_connections,但卻從來沒有給一個明確的理由。事實上,max_connections 的預設值(100),就算是對於負載十分沉重但有良好調校過的 Server 都已十分足夠。MySQL 對於單一連線的資料處理通常只需要零點幾秒的時間即可完成,就算是最大只能使用 100 個連線也夠讓你用上很長一段時間。若是您的 Server 有著非常高的最大連線數(max connections)或是單一連線需要很長時間才可完成,那麼問題八成不是 max_connections 的值不夠大而是在別的地方,例如 slow queries、索引設計不良、甚至是過於緩慢的 DNS 解析。在您將 max_connections 的值調到 100 以上之前,您應該要先確定真的是因為 Server 過於忙碌而需要調高此數值,而不是其他地方出了問題。每秒平均連線數有可能會很高,事實上,若這個值很高而且 Server 的運作十分順暢,那麼這通常會是一個好現象,無需擔心。大部份 Server 的每秒平均連線數應該都會低於 5/s。


Created Temp Report: Lines 59 - 62
MySQL 可以建立暫時性的資料表,它可建立在硬碟中、檔案裡、或是 RAM 之中,而 Created Temp Report 則提供了相關的數據供您參考。這些數據大多是相對而言,沒有一定的標準,但將暫時性的資料表建立在硬碟中是十分沒有效率的,因此 Disk table 的值最好是三者中最小的一個。當暫時性的資料表被建立在硬碟中,表示此資料表沒有辦法被放進 RAM 裡面(因為 tmp_table_size 的值設得不夠大)。


Threads, Aborted, Bytes Reports: Lines 64 - 76
這 幾個部份大多沒什麼好解釋的,只有一個項目值得特別說明:第 66 行的最後一個欄位(%Hit)。每一個連接到 MySQL 的連線都是由不同的 Thread 來處理,當 MySQL 啟動時會預先建立一些 Threads 並保留在 Thread Cache 中,如此一來 MySQL 就不用一直忙著建立與刪除 Threads。但當每秒最大連線數大於 MySQL 的 Thread Cache 時,MySQL 就會進入 Thread Thrash 的狀態:它不斷地建立新的 Threads 以滿足不斷增加的連線的需求。當 Thread Thrash 發生時,%Hit 的數值就會降低。在本範例中 %Hit 的值為 0.05%,這是非常不好的,因為它表示幾乎每一個新進來的連線都會造成 MySQL 建立新的 Thread。我們可以看到在此範例中造成此現象的原凶就在第 66 行的第一個欄位,我們可以發現 Thread Cache 的值為 0,因此 thread_cache_size 的值需要調大。

話說回來,究竟 %Hit 接近於零真的有什麼關係嗎?Jeremy Zawondy 曾在部落格上說到:Thread caching 並不是我們最需要關心的問題,但當你解決了所有其他更嚴重的問題之後,它就會是最嚴重的問題。(hread caching really wasn't the worst of our problems. But it became the worst after we had fixed all the bigger ones.)

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

有時候常常會需要取得來訪者的IP位址,但是IP位址有兩種
一種為非透過proxy上網
另一種為透過proxy上網
兩種方式其實都不一樣

取得使用者ip,php取得使用者ip

以下為不同取得IP位置的方式

 

 

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




獲取一組radio被選中項的值 
var item = $('input[@name=items][@checked]').val()
獲取
select被選中項的文本 
var item = $("select[@name=items] option[@selected]").text()
select下拉框的第二個元素為當前選中值 
$
('#select_id')[0].selectedIndex = 1
radio單選組的第二個元素為當前選中值 
$
('input[@name=items]').get(1).checked = true
 
獲取值: 
 
文本框,文本區域:$
("#txt").attr("value"); 
多選框
checkbox:$("#checkbox_id").attr("value"); 
單選組
radio:   $("input[@type=radio][@checked]").val()
下拉框
select: $('#sel').val()
 
控制表單元素: 
文本框,文本區域:$
("#txt").attr("value",'');//清空內容 
                 $
("#txt").attr("value",'11');//填充內容 
 
多選框
checkbox: $("#chk1").attr("checked",'');//不打勾 
                 $
("#chk2").attr("checked",true);//打勾 
                
if($("#chk1").attr('checked')==undefined) //判斷是否已經打勾 
 
單選組
radio:    $("input[@type=radio]").attr("checked",'2');//設置value=2的項目為當前選中項 
下拉框
select:   $("#sel").attr("value",'-sel3');//設置value=-sel3的項目為當前選中項 
                $
("<option value='1'>1111</option><option value='2'>2222</option>").appendTo("#sel")//添加下拉框的option 
                $
("#sel").empty()//清空下拉框


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

PEAR::HTML_QuickForm的驗證規則

參考資料:http://phpeye.com/article/view/id/108

規則名稱

參數

規則描述

required

 

必須輸入,不能為空

maxlength

$length

最大字符長度

minlength

$length

最小字符長度

rangelength

$min,$max

字符長度的範圍

regex

$rx

輸入的數據必須匹配給定的正則表達式

email

true
(forDNS heck)

驗證email地址的格式(有個可選的選項還可以查看域名是否有效)

lettersonly

 

只能是英文字母

alphanumeric

 

只能是英文字母或數字

numeric

 

只能是數字

nopunctuation

 

不能包含以下特殊字符: ( ) . / * ^ ? # ! @ $ % + = , " ' > < ~ [ ] { }.

nonzero

 

不能為零

compare

 

兩次輸入必須相同

uploadedfile

 

表單元素必須包含正確上傳文件

maxfilesize

$size

上傳文件的最大容量

mimetype

$mime

上傳文件的類型,$mime可以是數組,則上傳文件的類型必須為其中一種

filename

$file_rx

上傳的文件的名稱必須滿足給定的正則表達式



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

過濾XSS的function







原始網站: http://quickwired.com/smallprojects/php_xss_filter_function.php

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

PHP 過濾器: PECL Input Filter

過濾用戶輸入一直也是 web 應用很重要的安全工作,在 PHP 內除了自行編寫過濾特別字符串的程式外,也可以用現成的 PECL extension: Input Filter extension。要使用這個 extension 需要在 shell 輸入以下指令安裝:

pecl install filter

以下例子假設有一張表單,裡面有兩個欄位: name, age 及 email。而我們希望 name 會用字串;age 是數字;email 就是電郵格式,那麼便可以這樣做:


以上會使用 filter_input 函式來過濾輸入,如果輸入是合符規定,會回傳沒有改動的變數;如果不符合規定,便會回傳 FALSE,而如果變數不存取便會回傳 NULL。

如果不想回傳 FALSE,而是回傳經過處理的輸入,假設 $_POST['name'] 是 "<b>My Name</b>" 可以這樣做:


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

MySQL 字串連接

有時我們需要將不同欄位的資料連接,或者在現在的資料後面加入內容,當然可以先從 MySQL 匯出資料,再把連接好的字串更新到 MySQL,但這未免太麻煩,另一個較方便的方法是借助 CONCAT() 實現,CONCAT() 語法為:

CONCAT(string_1, string_2, string_3, ...)

MySQL 的 CONCAT() 支援多個字串連接,但在 Oracle 裡面只可以有兩個參數,要實現多個字串連接可以用 '||' 來實現。以下是 CONCAT() 的使用實例:

update `table_name` set `email`=CONCAT(`email`, ':me@email.com') where id='1';

以上 SQL 語法會更新 table_name 資料表的 email 欄位,在原本的資料後面加入 ':me@email.com'

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

測試網站在流動裝置的外觀

現在流動上網越來越流行,而現在的流動上網裝置不一定是 laptop,有可能是 PDA 或手機。如果要開發一個給 PDA 及手機使用的系統,要測試網頁的呈現效果可有幾種方法:

1. 調較視窗大小
只需將瀏覽器的視窗大小縮小成與流動裝置一樣,那就可以測試,Firefox 有一個很好的 Add-on 是 Web Developer 可以較鬆實現。以下是一些流動裝置的大小:

* 176 x 208
* 240 x 160
* 320 x 240

2. 模擬器
可以安裝一些模擬器,而很多流動裝置瀏覽器的廠商也有提供 windows emulators:

* WinWap Smartphone Emulator
* OpenWave Browser
* Nokia Browser Simulator
* Microsoft Pocket PC Emulators
* Online Mobile Simulator
* Online WAP Browser

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

PHP中製作驗證圖片

今天推出驗證圖片的功能
每一行的指令都有加上註解
下面各項參數最佳化於100X30的尺寸
如有變更驗證圖片的長寬
參數需要自行修正


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

PHP中檢查字串是否含有非中文字




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

善用 ignore_user_abort() 函式

話說最近在為了上傳圖片經過縮圖的時間來煩惱,只不過我在想,為甚麼我上傳圖片還要等待縮圖時間才可以,然而無名小站,只需要上傳時間,縮圖是在它機器背景執行,後來發現一個函式非常好用,那就是

ignore_user_abort(true);


http://tw2.php.net/manual/tw/function.ignore-user-abort.php


無名在上傳圖片的php檔案,肯定有加上這個函式,他的好處是使用者如果關掉瀏覽器,但是php還是會繼續執行,也就是無名可以把檔案上傳之後,重新導向到使用者的相簿,程式可以如下




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

PHP4
putenv("TZ=Asia/Taipei");

PHP5
date_default_timezone_set( "Asia/Taipei" );

或是在 php.ini 設定:
date.timezone = Asia/Taipei

(PHP 5.1 起,主機不論是不是在國外都要設定)

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

安全模式 safe_mode

PHP 的安全模式是為了試圖解決共享伺服器(shared-server)安全問題而設立的。在結構上,試圖在 PHP 層上解決這個問題是不合理的,但修改 WEB 伺服器層和操作系統層顯得非常不現實。因此許多人,特別是 ISP,目前使用安全模式。


保安措施和安全模式


表格 22-1. 保安措施和安全模式配置指令

名稱 預設值 作用範圍
safe_mode "0" PHP_INI_SYSTEM
safe_mode_gid "0" PHP_INI_SYSTEM
safe_mode_include_dir NULL PHP_INI_SYSTEM
safe_mode_exec_dir "" PHP_INI_SYSTEM
safe_mode_allowed_env_vars PHP_ PHP_INI_SYSTEM
safe_mode_protected_env_vars LD_LIBRARY_PATH PHP_INI_SYSTEM
open_basedir NULL PHP_INI_SYSTEM
disable_functions "" PHP_INI_SYSTEM
PHP_INI_* 常數的進一步詳細說明與定義見 ini_set()


這裡是配置指令的一些簡短解釋。

safe_mode boolean

是否啟用 PHP 的安全模式。更多訊息請閱讀安全一章。

safe_mode_gid boolean

預定情況下,安全模式在打開文件時會做 UID 比較檢查。如果你想將其放寬到 GID 比較,則打開 safe_mode_gid。是否在文件連接時使用 UIDFALSE)或者 GIDTRUE)來做檢查。

safe_mode_include_dir string

當從此目錄及其子目錄(目錄必須在 include_path 中或者用完整路徑來包含)包含文件時越過 UID/GID 檢查。

從 PHP 4.2.0 開始,本指令可以接受和 include_path 指令類似的風格用分號隔開的路徑,而不只是一個目錄。

safe_mode_exec_dir string

如果 PHP 使用了安全模式,system() 和其它執行系統程序的函式將拒絕啟動不在此目錄中的程序。

safe_mode_allowed_env_vars string

設置某些環境變數可能是潛在的安全缺口。本指令包含有一個逗號分隔的前綴列表。在安全模式下,用戶只能改變那些名字具有在這裡提供的前綴的環境變數。預定情況下,用戶只能設置以 PHP_ 開頭的環境變數(例如 PHP_FOO = BAR)。

註: 如果本指令為空,PHP 將使用戶可以修改任何環境變數!

safe_mode_protected_env_vars string

本指令包含有一個逗號分隔的環境變數的列表,最終用戶不能用 putenv() 來改變這些環境變數。甚至在 safe_mode_allowed_env_vars 中設置了允許修改時也不能改變這些變數。

open_basedir string

將 PHP 所能打開的文件限制在指定的目錄樹。本指令不受安全模式打開或者關閉的影響。

當一個腳本試圖用例如 fopen 或者 gzopen 打開一個文件時,該文件的位置將被檢查。當文件在指定的目錄樹之外時 PHP 將拒絕打開它。所有的符號連接都會被解析,所以不可能通過符號連接來避開此限制。

特殊值 . 指定了存放該腳本的目錄將被當做基准目錄。

在 Windows 中,用分號分隔目錄。在任何其它系統中用冒號分隔目錄。作為 Apache 模塊時,父目錄中的 open_basedir 路徑自動被繼承。

用 open_basedir 指定的限制實際上是前綴,不是目錄名。也就是說 "open_basedir = /dir/incl" 也會允許連接 "/dir/include" 和 "/dir/incls",如果它們存在的話。如果要將連接限制在僅為指定的目錄,用斜線結束路徑名。例如:"open_basedir = /dir/incl/"。

註: 支援多個目錄是 3.0.7 加入的。

預定是允許打開所有文件。

disable_functions string

本指令允許你基於安全原因禁止某些函式。接受逗號分隔的函式名列表作為參數。 disable_functions 不受安全模式的影響。

本指令只能設置在 php.ini 中。例如你不能將其設置在 httpd.conf

參見 register_globalsdisplay_errorslog_errors

safe_mode 設置為 on,PHP 將檢查當前腳本的擁有者是否和將被文件函式操作的文件的擁有者相匹配。例如:

-rw-rw-r--    1 rasmus   rasmus       33 Jul  1 19:20 script.php 
-rw-r--r-- 1 root root 1116 May 26 18:01 /etc/passwd

執行 script.php
<?php
readfile('/etc/passwd');
?>

如果安全模式被啟動,則將會導致以下錯誤:
Warning: SAFE MODE Restriction in effect. The script whose uid is 500 is not 
allowed to access /etc/passwd owned by uid 0 in /docroot/script.php on line 2


同時,或許會存在這樣的環境,在該環境下,寬松的 GID 檢查已經足夠,但嚴格的 UID 檢查反而是不適合的。您可以用 safe_mode_gid 選項來控制這種檢查。如果設置為 On 則進行寬松的 GID 檢查;設置為 Off(預設值)則進行 UID 檢查。

除了 safe_mode 以外,如果您設置了 open_basedir 選項,則所有的文件操作將被限制在您指定的目錄下。例如:

<Directory /docroot>
php_admin_value open_basedir /docroot
</Directory>

如果您在設置了 open_basedir 選項後執行同樣的 script.php,則其結果會是:
Warning: open_basedir restriction in effect. File is in wrong directory in 
/docroot/script.php on line 2


您也可以單獨地屏蔽某些函式。請注意 disable_functions 選項不能在 php.ini 文件外部使用,也就是說您無法在 httpd.conf 文件的按不同虛擬主機或不同目錄的方式來屏蔽函式。 如果我們將如下內容加入到 php.ini 文件:

disable_functions readfile,system

則我們會得到如下的輸出:
Warning: readfile() has been disabled for security reasons in 
/docroot/script.php on line 2

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