推文按鈕

收進你的MyShare個人書籤

2009年9月13日 星期日

MySQL 的調校 (軟硬體、版本、設定)

轉錄自 Gea-Suan Lin's Blog
http://blog.gslin.org/archives/2009/09/13/2088/

把一些關於 MySQL 的資料整理一下。

初期的 MySQL 隨便跑沒關係,備份的部份記得要把 binlog 也一起備份起來,用 gzip 壓過後 (不使用 bzip2 或是高壓縮率參數,是因為考量解壓縮速度;另外推薦用 Parallel gzip 壓縮,速度比較快) 再用 openssl 加密丟到 Amazon S3 上。

成長後,買獨立伺服器要一次買兩台跑 HA,每台分別是:

  • CPU 要考量 SQL query 的方式,如果打算在 MySQL 做很多事情 (i.e. JOIN),CPU 要選高階的;如果大多都是 simple query,則以 C/P 值高的 CPU 優先:兩顆四核心 CPU 算是現在比較划算的硬體。不管哪一種,選低電壓的,像是 Intel Xeon L5408 或是 Intel Xeon L5520,因為硬碟蠻熱的,要減少熱量以免伺服器容易當掉。
  • 記憶體愈多愈好,64GB 算是還蠻基本的。
  • 硬碟選轉速快的 15krpm SAS,挑大一點的硬碟 (以現在的市場就是 300GB) 省得以後空間不夠要搬動。最好是硬體 RAID1+0,依照應用決定單台 database 要多大,如果預定八顆的話可以買 2U 來塞。

軟體的部份:

  • 一定要跑 Linux x86-64 版本,挑大的 distribution 以免遇到問題卻無法解決。我自己還蠻偏好用 Debian。不論是 Debian 還是其他 distribution,儘量跟穩定的 branch,遇到需要升級時的問題會比較少,像是 Debian Lenny
  • 如果要跑 DRBD,先在兩台上面設定好 Heartbeat + DRBD。如果是跑 MMM 的話就設定 MMM,比較需要注意的是 MMM 的版本,參考「MySQL MMM 的情況」。
  • Filesystem 跑 XFS,很多人在上面跑很久了,經過時間考驗的 Filesystem,跑起 MySQL InnoDB 的效率還不錯。
  • MySQL 跑 Percona 的 5.0 標準版本 (非 highperf 版),穩定性還不錯。如果預期到資料量很大的時候會是 I/O bound,可以考慮 Percona 的 5.1 版本,並且開啟 InnoDB Plugin 壓縮的功能。
  • 跑監控程式,把系統的狀態記錄下來。可以是 MuninCacti 或是 nagios,資料對於瓶頸分析很重要。

my.cnf 設定的部份要花不少功夫,除了一般常見的設定外 (這部份網路上很多文件),有些在站台比較大時會發生的問題要注意:

  • back_log 要開大,因為站台大的時候通常不會用 pconnect (每個 web server 都掛著 64 個連線,當有十台 web server 就佔用 640 個連線),而是用 connect,在每次做完事情就斷線,配合 memcached 降低 MySQL 的需求。不過在量夠大的時候,還是會遇到預設的 back_log 不夠。Smugmug 的 CEO 在「Great things afoot in the MySQL community」有提到吃過這個值的虧。
  • max_allowed_packet 設大一點,避免比較大的 INSERT 或是 UPDATE 造成錯誤。通常這是設計上的問題,應該要避免在 MySQL 裡放 blob 資料,不過偶而還是會需要…
  • max_connect_errors 設 4294967295,可以避免當 client (像是 php) 發生太多錯誤時被 block 住。
  • innodb_adaptive_checkpoint 要打開,可以避免在 flush dirty pages 的時候產生 slow query。MySQL 官方的版本沒有這個參數,而這個參數也是為什麼要用 Percona 版本之一。效果可以參考「Adaptive checkpointing」這篇文章。

2009年9月12日 星期六

[教學] 用php發送E-MAIL

用來傳送 e-mail 的描述語言程式(Script)可說是網站上最常見的程式之一。雖然它很單純,但是在某些時候,它卻往往對程式設計師們造成極大的困擾。在 PHP 中有一個函式叫做 mail(),只要有收信者名稱以及訊息內容,就可以拿來傳送訊息。但是你還是需要針對 mail()做某些調整,才能讓mail()為你完成你想做的事。

首先,要讓 mail()能夠運作,你必須先有一個 SMTP 伺服器,好讓你的 PHP 連上去。雖然這個伺服器在電子郵件程式中佔有極其重要的地位,大部分的人還是對它一知半解。在這篇教學指南裡,我們會為你揭開 SMTP 的神秘面紗,並且同時解說關於使用 PHP 傳送電子郵件的某些常見問題。其中精采的內容還包括了:如何以迴圈的程式敘述,讀取電子郵件住址名單,同時針對其中的收件者一一傳送郵件,包括純文字格式以及 HTML 格式的郵件等等。

瞭解你的 SMTP 伺服器
SMTP 是 Simple Mail Transfer Protocol 的縮寫,而 SMTP 伺服器則是透過執行該通訊協定而傳送電子郵件的電腦。基本上,執行通訊協定指的是:如果你使用的是非 Windows 作業平台,執行的是 Sendmail 或 Qmail這類的電子郵件軟體。而如果這部機器使用的是 Windows 作業平台,那麼 SMTP 服務已經包括在 Windows NT Service Pack 中,或者內建在 Windows 2000 裡面,而且,這項服務通常就是正在執行中的電子郵件服務。

這並不是說,SMTP 軟體就只有那幾種,只是它們是最被廣為使用的。如果你的網站是 ISP 的虛擬主機(Vitual hosting)套件的一部分,SMTP 服務應該就已經安裝在主機上面了。如果你是位系統管理者,負責管理某台放在 ISP 或公司機房的專屬主機(Dedicated machine)的話,那麼你很可能會需要在那部機器安裝某種 SMTP daemon,特別用來處理網站伺服器的電子郵件傳遞。

然而,如果你只是一個單獨的使用者,只有一套網站伺服器開發平台在你的個人電腦上面,你可能沒有在你的機器上安裝 SMTP。這裡有個非常簡單但是精確的準則: 如果你是個 Windows 使用者,而你從來未曾聽過 SMTP 伺服器,那麼你就沒有安裝 SMTP。若果真如此,你有兩個選擇:安裝, 設定,並維護一個 SMTP 伺服器(如果你不知道那是什麼,我並不鼓勵你這樣做)或者直接使用已經在你手邊的東西。

「我沒有安裝,怎麼會說在我手邊呢?」你可能會這樣問。嗯,如果你的電腦是透過撥接上網的(或 DSL 或者 cable),你可以直接使用你的 ISP 的外寄郵件伺服器(outgoing mail server)。例如,如果你的開發平台是 Windows 98,以及一台 56Kbps 的數據機,並透過 EarthLink 上網,那麼你可以用 mail.earthlink.net 當作你的 SMTP 伺服器。不管你使用的是哪一種電子郵件客戶端軟體(Eudora,Outlook,Netscape Mail 等等),你的外寄郵件伺服器都可以在 PHP 程式碼中,指定為 SMTP 伺服器。要訣在於,你要告知 PHP 這件事情。

在 PHP 的主要設定檔,php.ini 中,有一些 directive 是你必須去設定,這樣一來 mail() 函式才能夠使用。在更改那些設定以前,你先看看它們是什麼。使用 phpinfo() 函式,可以顯示你的系統目前的設定, 做法是,建一個檔案,包括下列文字:

CODE:
將檔案存起來,放在你的網站伺服器的文件根目錄中。然後用你的瀏覽器去看這個檔案。你應該會看到一個編排良好的現有設定列表。在這裡,你要注意的設定選項為:

SMTP
sendmail_from
sendmail_path
如果你用的不是 Windows,你只須擔心 sendmail_path directive。如果你用的是 Windows,你就要注意先前兩個 directive。

如果你用的是 Linux 或其他 Unix 變種系統,sendmail_path 應該差不多是這樣子設定的:

sendmail_path = /usr/sbin/sendmail

或者,如果你用的是 Qmail:

sendmail_path = /var/qmail/bin/sendmail

在這個 directive 裡面,你也可以設定某些 flag 來指明你的 queuing 做法,或者是用來明確的寫出你的 Return-Path 標題,就像這樣:

sendmail_path = /usr/sbin/sendmail -t -fyou@yourdomain.com

如果你不是 Windows 使用者,你所需要做的就那麼多了。如果你使用的是 Windows,你還有一些事情要處理。你必須看看 SMTP 以及 sendmail_from 的值。不要被 sendmail_from 的 directive 名字中的 sendmail 給搞糊塗了。雖然你在 Windows 上面並沒有用一個叫做 Sendmail 的程式,這個只是 directive 的名字而已。不要緊張。

在phpinfo() 所顯示的結果中,注意一下 SMTP 以及 sendmail_from 原先的設定值 -- 它們應該是空白的,或者只是虛值(dummy)。你必須將它們改為對你系統有意義的值。

如果你真的在你的機器上安裝並啟動 SMTP 伺服器,你的 php.ini 應該要有這樣的設定:

SMTP = localhost

然而,如果你要用你的 ISP 的外寄郵件伺服器(在這裡,我們用 EarthLink 做例子),那麼你的 php.ini 就要有這樣的設定:

SMTP = mail.earthlink.net

你也可以直接用 IP address 而非名字,因為電腦並不會區別這兩者的差異。

第二個我們要設定的 directive 是 sendmail_from,這個是設定在 From 標題(header)裡面所使用的 e-mail 位址。這個設定值可以用 mail 程式更改,但是通常這裡的設定值都被拿來當作內定值。以下是,如果你的電子郵件地址是 youraddress@yourdomain.com, 所應該做的設定值。

sendmail_from = youraddress@yourdomain.com

在更改以上設定值之後,重新啟動你的網站伺服器,再用 phpinfo() 函式來確定這些設定已經被更改了。當你完成這些事情後, 你就已經準備好用 PHP 來傳送 e-mail 了。


傳送一個簡單的 e-mail
mail() 函式相當簡單:只有五個參數,而且其中兩個是選擇性的(optional)。這些參數是:
收件者地址
主旨
訊息
其他郵件標題(選擇性)
其他 SMTP 伺服器的設定選項(選擇性)
額外的郵件標題參數,是用來控制某些電子郵件功能,像是 CC,BCC,Reply-To fields,或其他 SMTP 通訊協定所規定的功能。 在這個例子裡,我只用 From 以及 Reply-To 電子郵件標題。

如果你要送 mail 給我,而你用的不是 Windows 系統,那麼它看起來會像這樣:

CODE:
如果你用的是 Windows 的 SMTP 服務,那麼很可能你不需要設定第五個參數,以及額外的郵件標題參數 (即第四個參數),不過你要用 \r\n 而非 \n 將你的參數分開。因此,同樣的電子郵件,透過 Windows 的 SMTP 服務傳送,看起來會是這樣:

CODE:
在以上程式中的 echo 敘述,是讓你的網頁瀏覽器在執行完這個程式後,回傳給你一個訊息。如果沒有這項敘述,你會收到一個「Document contains no data」對話方塊,因為沒有東西傳送到你的網頁瀏覽器上。

mail() 函式只要連到指定的 SMTP 伺服器,就會回傳 true。這並不意味著郵件已經成功抵達收件者了。mail() 函式並不會等 SMTP 伺服器告訴它傳送成功或失敗。

mail() 函式會回傳 false,並且送給你一個警告,像是「Couldn't connect in line x」 或者是「Unknown error in line x」。如果你沒看到前面兩個訊息,檢查一下 php.ini 的 SMTP 設定值。有兩種可能性會導致這個訊息的產生:SMTP 伺服器當掉了,或者是 PHP 沒連到 SMTP 伺服器。當然,這兩種情況下, 你的電子郵件都不會被傳送出去。

這個程式用的參數都是寫死在程式中的。你可以透過一個簡單的 HTML 表格,將這些值送出去,然後再回傳給你一個回饋表格(feedback form)。

以迴圈讀取傳送名單
一旦你知道要怎樣傳送電子郵件給一個人,你或許會感到非常興奮而且想傳送同樣的訊息給很多收件者 --就像電子報一樣。你只要做一個簡單的迴圈敘述, 一一閱讀你名單上的名字,然後傳送電子郵件給他們。

mail 函式的格式是一樣的:

mail([recipient], [subject], [message], [any headers]);

你必須將 [recipient] 換成迴圈中你的名單的下一個名字。假設你有一個 e-mail 地址的陣列:

$addresses = array("me@mycompany.com", "you@yourcompany.com", "someone@otherplace.com");

你只要以迴圈讀取這個 array, 取得新的電子郵件地址,然後傳送郵件。

如果你的電子郵件地址名單是存在資料庫裡面,你還是可以用同樣的方式:以迴圈一一讀取它們。

就是這麼簡單。顯然的,同樣的觀念可以運用到你特定的資料庫種類以及表格(table)架構, 雖然程式碼必須做一點修改。

這裡還有一個小小的訣竅,在以迴圈敘述讀取一串電子郵件名單的時候,似乎每一個人都忽略了它:如果你有多於五十個郵件地址,你的程式或許在還沒完成讀取名單的時候,就逾時(time out)了,因為 PHP 對每個程式的內建時間限制是三十秒。你可以修改這個時間限制, 但是要小心。試著將這個修改的效果限制在某些特定的程式中, 例如迴圈讀取電子郵件名單並且傳送郵件。否則的話,你可能會有一些伺服器程序 (server process) 一直在你的伺服器上,你的主機會幾乎停滯,整個世界就會停止。

要在程式裡面設定時間限制,使用 set_time_limit() 函式。你可以指定這個限制,例如六十秒(set_time_limit(60)),或者你可以讓它一直等下去,(set_time_limit(0))。

將這個放在你的程式中,你傳送電子郵件的迴圈敘述就會一直持續下去直到名單中所有的地址都傳送出去為止。

傳遞 HTML 格式的電子郵件
傳送 HTML 格式的 e-mail 是另一個看起來困難但是做起來簡單的事情。一旦你知道怎麼做,你或許會為了以前把它想得太困難而想打你自己一頓!

我們需要對先前用過的基本電子郵件敘述程式做兩個修改:

你的郵件訊息應該是 HTML 格式的。
你必須增加內容種類郵件標題(content-type header)。
這樣就可以了。使用者如果擁有可以讀取 HTML 格式郵件的電子郵件客戶端軟體的話,他所看到的郵件訊息會是大型的粗體字形。如果你傳送的 HTML 格式的電子郵件有影像的 tag 在裡面,你必須記得在 src 屬性中使用完整的 URL。例如:

記得,不是所有人都可以讀取 HTML 格式的電子郵件,如果使用的軟體不能讀取 HTML 格式的電子郵件,那麼收件者就只能看到 HTML 程式碼。這會讓人有點受不了,所以小心使用這項功能。

結論
你可以用幾乎你所能想像得到的所有各種不同的方式,使用 PHP 傳送電子郵件。這篇文章只有接觸到基本面而已:設定你的伺服器,並且傳送一些簡單的電子郵件。你也可以用 mail() 產生的電子郵件來傳送附件,修改很多不同的郵件標題。大致上說來,你也可以用 PHP 做任何現實生活中, 電子郵件客戶端軟體或郵件名單程式可以做到的事情。

2009年9月9日 星期三

ECFA即將簽署,台灣網路界可以要什麼?

ECFA說白話,就是台灣與中國的共同市場,也就是最惠國待遇的最極致
商周最近報導了一篇 ECFA對於台灣的影響
http://www1.businessweekly.com.tw/web/webarticle_37802_p1.php
裡面提到,ECFA是ECFA是富人的威而剛、窮人的土石流,
按WTO架構,ECFA屬過渡協定,雖無強制性,但通常在10年內,兩邊必須完成約90%的商品服務免關稅,台灣與中國將互相大幅開放市場給對方。

所以兩國間強者將恆強,台灣的優勢項目可以在大陸賣得更好,大陸的優勢項目可以在台灣賣得更好,也勢必帶來產業的重整。

在其他產業紛紛向政府施壓,希望將產業的需求列入ECFA談判
台灣網路界能不能也站出來大聲說出自己的需求
為何台灣的網站要到大陸,要申請ICP執照,要符合當地人成立資本額100萬人民幣的標準,
而大陸網站來台就沒有任何限制?

目前申请ICP许可证的条件?
1 经营者为依法设立的中资公司
2 注册资金达100万及以上
3 有为用户提供长期服务的信誉或能力
4 有业务发展计划及相关技术方案
5 有健全的网络与信息安全保障措施
6 国家规定的其他条件

台灣網路界能不能集結向政府呼籲,在ECFA中一併談判將中國所設立的壁壘消除?
中國希望管制言論,可以比照當地的標準審核。
要申請ICP,也可以比較當地去申請。
資本額100萬人民幣,也不是難事。
但是「限中資公司申請」,就很不合理
台灣或外商必須透過人頭成立中資公司,徒增困擾及可能的糾紛
既然要共同市場,就應該一併把這個限制消除
讓台灣網站有機會直接與對岸網站一較高下

有沒有人願意一起來連署呢?

2009年4月13日 星期一

YUI CSS 摘要

YUI CSS
出處:The YUI CSS Foundation影片
http://developer.yahoo.com/yui/reset/

延伸閱讀
css使用px和em的差異


詳細資料請點此(因為css的東西沒辦法Po上來)
http://docs.google.com/Doc?id=dgtnbc94_70hsw87hd8

2008年12月4日 星期四

Search Engine Starter Guide 中文摘要

搜尋引擎當紅,SEO已經是當今網路行銷的一門顯學
坊間一大堆公司靠SEO優化賺錢
不過Google最近公佈了《Search Engine Starter Guide》
教站長們如何正確的搜尋優化,而不需要求助旁門左道,大家可以參考
按此下載
此份文件需要基本的html概念

節譯如下:

1. 建立唯一且精確的網頁title:html碼之中的title標籤,必須唯一且精準,page title的文字會出現在搜尋結果的標題列

Good Practice:
  • 準確地描述網頁內容,避免和網頁無關的內容或者自動產生的「page1」、「untitle」
  • 為每一個頁面建立獨特的網頁title,避免在站上所有頁面或者很多頁面都使用同樣的title
  • 使用簡短、但是具描述性的title
2. 善用description的meta標籤,meta description的文字將會出現在搜尋結果的內容列

Good Practice:
  • 為每一個頁面下一個獨特的描述,避免在站上所有頁面或者很多頁面都使用同樣的meta
3. 改善url中的結構

不好的url結構:url中的文字無意義
http://www.bandonbaseballcards.com/folder1/1089257/x1/0000023.htm
好的url結構:url中的文字包含了關鍵字,對於搜尋引擎有意義
http://www.brandonbaseballcards.com/article/ten-rarest-baseball-cards.htm
(PS. 場地王的經驗,中文關鍵字url對於Google、Yahoo的搜尋優化效果超讚!)
Good Practice:
  • 在url中使用字眼,避免
    • 使用充斥著無效參數或sessionid的過長url
    • 選擇自動產生的檔名,如page1.html
    • 使用太超過的關鍵字

  • 建立簡單的目錄結構,避免
    • 太過深入的目錄結構,例如/dir1/dir2/dir3/dir4/dir5/dir6.page.html
    • 使用與內容無關的關鍵字
  • 僅提供唯一的url至每一個頁面,避免
    • 有網頁從次網域或根目錄都能到達同一頁(例如domain.com/page.html和subdomain.domain.com/page.html
    • 在內部連結結構中混用www及non-www的連結版本
    • 使用奇怪拼字的url
  • 使網站更易被瀏覽

....這篇放了一陣子因為工作忙一直沒翻完,大家自己看原文吧~
檔案下載 http://www.google.com/webmasters/docs/search-engine-optimization-starter-guide.pdf

2008年11月25日 星期二

用Javascript 判斷訪客為爬蟲還是使用者

場地王正從完全資料開放轉向免費對會員開放,
以增加會員數和網站上的會員動態資料
但首先便是要兼顧各家爬蟲能夠進來找資料,index網頁,帶來搜尋引擎的流量

找了一下資料
作法大致如下

用javascript判斷browser.userAgent的型態,可參考
http://www.w3schools.com/js/tryit.asp?filename=tryjs_browserdetails

另外各家搜尋引擎爬蟲註冊的名稱可以參考
http://www.user-agents.org/index.shtml
http://www.smart-it-consulting.com/internet/google/googlebot-spoofer/
http://www.mrsneeze.com/httplogs/useragents.html

SEO一年再看:49个影响网站排名的因素

http://www.admin5.com/article/20080920/105007.shtml

内部因素: 网站必修之内功篇,要想有金庸武侠小说里主人公的传奇色彩先练好内功

  URL中出现关键词 对百度很有用,一年时间我充分认为百度对中文的识别技术比GOOGLE厉害,英文则相反

  网页Title中出现关键词 地球人都知道

  常规内容中出现关键词 COPY↑

  在页面的第一段中出现关键词 有用

  在页面的最后一段中出现关键词 也有用看文章的长短合理的分布[关键字密度来着]

  Heading 标签 比如h1,h2中出现关键词 强调

  站内的链接中出现关键词 这个比较有用 所谓的锚点

  导向相关内容的导出链接 也要考虑

  导出链接中出现关键词 没有研究过

  图片文件名中出现关键词 对图片SEO有相当作用

  Alt标签中出现关键词 有用但是似乎不是很重要

  comment中出现关键词 很有作用

  合理的频率更新内容 这个值得注意那少女都一天换一件衣服,你一月洗次澡总可以吧

  内容对搜索引擎的展示位置 自左至右 从上到下

  网站结构循环PR,而非散发PR 新鲜玩意没有时间研究

  关键词进行适当的修饰(加粗、斜体等)很有作用

  外部因素:

  大量的导入链接 SEO一向倡导

  从高PR值得网页获得导入链接 所以那么多人热衷交换链接

  从相关内容网站获得导入链接 一条和相关度高的网站交换链接

  导入链接指向的网页有具体内容 内容为王 你我都喜欢看有故事的东西

  锚文字中有关键词 很不错的方法

  锚文字周围有相关词 提高关键字密度

  锚文字存在于文章或句子中 文章内链接 记得要加TITLE标签

  导入链接的时间长度,一般导入链接的存在时间有3-6个月 永久不是更好?

  单向链接的价值高于交换链接 是的你说的对 信任你才链接你

  导入链接的页面的导出链接小于100个,流出链接越少越好 很好 一个PR4只单向链接到你一个站的链接比一个PR5有100个链接 只有一个链向你要好

  链接来自不同IP 你觉得呢 这样很好

  合理的导入链接增长频率 一天增长个1000-10000个就是某些所谓的SEO公司的策略,汗!

  你需要避免的事情:

  关键词堆积 没有明显区别 要是内容够好那也不怕

  所有的锚文字都相同 不好吧 有点区别才能吸引啊

  使用CSS或背景色隐藏内容,这是十恶不赦的大恶 欺骗 你伤害了我还一笑而过

  使用JavaScript跳转 分情况不能一概而论

  相同ip之下的网页直接进行大量交换链接 蜘蛛很生气 后果很严重

  桥页和Cloaking,诱导搜索引擎的爬虫,这是十恶不赦的大恶 十恶不赦的大恶

  成人内容,违禁药品,赌博相关内容 这样的站赚钱就像笔者经常去的某网站 百度就没有收录 不过是XXXX级啊【想知道地址,单独MMM啊】

  内容重复 全民COPY的时代 好在搜索引擎还没有到辨别伪原创的地步

  连向作弊的网站 傻啊你

  站内的绝大部分网页有相同的网页title 你会在GOOGLE网站管理员工具里收到提示的

  加入到Link Farm或则Link交换类网站 初学者为了流量最容易这样

  使用被惩罚过的域名 买安全套的时候看看是不是放在针线盒的旁边

  网站建立在被惩罚的IP上 找工具查去

  尽量避免的问题:

  地址中存在动态变量 没有一定之规 其实动态的也凑活

  单一图片和Flash的网站 这个可要研究下

  用Javascript制作的网站导航条或目录 有时间你得换回来,悟空这样做是不好的

  用图片做网站导航而不加ALT标签 突然看见一排图片全XXXXXX 我也会当时就XX浏览器

  〈head〉〈/head〉之间有太多的代码 注意一下啦!

  存在太多与网站主题无关的内容 太多?那叫内容丰富

  导入链接中购买链接占多数 你是有钱人我佩服,别看这个对你没有用

  和作弊的网站在同一服务器上 哥们联系我 那服务器杠杠地...

  一年之后看这些 难免有些感触,有空你就琢磨琢磨!整不明白了就去www.coffly.com找我去!