2009年2月27日 星期五

Linux下安裝memcached

要先下載libevent及memcached

#cd /usr/local/src
#wget http://monkey.org/~provos/libevent-1.4.8-stable.tar.gz
#wget http://www.danga.com/memcached/dist/memcached-1.2.6.tar.gz


安裝libevent,也可以加上prefix指定安裝位置

#cd libevent-1.4.8
#./configure
#make
#make install
#ln -s /usr/local/lib/libevent-1.4.so.2 /lib/libevent-1.4.so.2


安裝Memcached

#cd memcached-1.2.6
#./configure --prefix=/usr/local/memcached --with-libevent=/usr/local
#make
#make install


運行memcached

#/usr/bin/memcached -d -m 128 -l 192.168.1.1 -p 11211 -u httpd


參數解釋:
-d 以守護程式(daemon)方式運行 memcached;
-m 設置 memcached 可以使用的記憶體大小,單位為 M;
-l 設置監聽的 IP 位址,如果是本機的話,通常可以不設置此參數;
-p 設置監聽的埠,默認為 11211,所以也可以不設置此參數;
-u 指定使用者,如果當前為 root 的話,需要使用此參數指定使用者。

2009年2月23日 星期一

prefork和worker模式的切換

1.將當前的prefork模式啟動文件改名
mv httpd httpd.prefork
2.將worker模式的啟動文件改名
mv httpd.worker httpd
3.修改Apache配置文件
vi /usr/local/apache2/conf/extra/httpd-mpm.conf
找到裡邊的如下一段,可適當修改負載等參數:

StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0

4.重新啟動服務
/usr/local/apache2/bin/apachectl restart
即可換成worker方式啟動apache2

摘自:http://blog.yam.com/htshboy/article/17182660

Linux下安裝eaccelerator

PHP 加速器的調校(php-eaccelerator)

由於 PHP 屬於直譯語言,因此當放在 Web 伺器器上的 PHP 程式碼被瀏覽者所讀取時,系統為了要執行 PHP 程式碼就必須要使用直譯器(interpreter),將 PHP 程式碼翻譯成電腦系統看得懂(或可以執行)的語言。這個直譯的動作是非常耗費系統資源的,而直譯語言的特性偏偏就是每次執行前都要先進行直譯的動作,因此當您放在 Web 伺服器上的 PHP 程式碼被 1000 個 client 讀取時,系統就要進行 1000 次的直譯動作。而 PHP 加速器的功能就是會把被這些 PHP 程式碼快取(Cache)起來,也就是同一支程式碼只要被直譯一次而已,藉此大幅降低系統的負載。自己個人的經驗是:若你的 Web 伺服器流量非常大,有沒有使用 PHP 加速器會有非常大的差別。

php-eaccelerator 的安裝很容易,但麻煩的是後續的調整。一般來講,若你會需要安裝加速器通常就代表你遇上了效能的瓶頸,也就是系統負載過大所以才需要安裝它;但是 php-eaccelerator 有 BUG,當系統負載過大,php-eaccelerator 需要消除 Share Memory 中的老舊資料時,會導致 apache 出現如下的錯誤訊息並使 CPU 使用率衝上 100%,最後終將致使伺服器當機。


[Wed Feb 28 14:39:40 2007] [notice] child pid 18449 exit signal Segmentation fault (11)


下載並安裝php eaccelerator

#cd /usr/local/src
#wget http://bart.eaccelerator.net/source/0.9.5.3/eaccelerator-0.9.5.3.tar.bz2
#tar -jxvf eaccelerator-0.9.5.3.tar.bz2
#cd eaccelerator-0.9.5.3
#phpize
#./configure --enable-eaccelerator=shared --with-php-config=/usr/bin/php-config
#make
#make install


3. 建立 eaccelerator 的暫存資料,重點在於權限要設定正確!

# mkdir /tmp/eaccelerator
# chmod 777 /tmp/eaccelerator


就是因為負載過高才需要裝它,偏偏負載過高裝了它又會造成伺服器當機,很矛盾不是嗎?所幸經過適當的調整後,即可避免上述的情況發生。

修改/ect/php.ini


[eaccelerator]
extension=eaccelerator.so
;預設是32MB,這裡設為500MB
eaccelerator.shm_size="500"
eaccelerator.cache_dir="/tmp/eaccelerator"
eaccelerator.enable="1"
;預設是 1 (開啟),這裡設為 0 (關閉)
eaccelerator.optimizer="0"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.log_file = "/var/log/httpd/eaccelerator_log"
eaccelerator.filter=""
eaccelerator.shm_max="0"
;預設是3600,這裡設為0,也就是不移除Share Memory中的任何資料。
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"


大致上要注意的有以下幾點:

1. 調高php-eaccelerator可使用的Share Memory大小:
eaccelerator.shm_size = "500"
.
2. 關閉最佳化功能
eaccelerator.optimizer = "0"
.
3. 禁止php-eaccelerator清除Share Memory中的資料:
eaccelerator.shm_ttl = "0"
eaccelerator.shm_prune_period = "0"
.
4. 每日定時清除cache資料與Share Memory,並重新啟動httpd。
新增 /etc/cron.daily/restart_httpd:
/sbin/service httpd stop
rm -rf /tmp/php-eaccelerator/*
/sbin/service httpd start

參考:http://forum.slime.com.tw/thread210119.html

Linux下搜尋檔案

find / -name path_to_file

2009年2月22日 星期日

2009年2月20日 星期五

PHP 效能調校:最佳化你的php程式碼的訣竅

最近工作內容主要就是PHP的效能調校(performance tuning),除了看《php cookbook》,《programming php》裡都有一些相關的主題外,也上網找了一些文章和工具,其中不乏精譬的討論串,但其中整理的很好的個人覺得應屬以下這一篇(http://reinholdweber.com/?p=3),個人也稍稍地加上一點心得補充,所以應該一定會超過原文的四十點。

工具上可以善用xdebug和PEAR::Benchmark、APD等工具來量測效能是否真的有被調到。如果要做壓力測試可以用ab(Apache HTTP server benchmarking tool)和http_load或JMeter。另外,好的apache server組態設定和DB schema和index設計也很重要,總之,要調出好的performance除了程式撰寫上的風格和技巧外,有更多其它週邊相關的技術需求,也需要做不少的實驗來量測數據,一個系統需要調校的是整體,而不是部份的程式碼就可以達到全面性的成果,至於要調到什麼地步,套句老子的話:「知足不辱,知止不怠」,如此而已。

好在我工作上,公司中有一堆大俠相助(Frank, Winson, Chary, hermit, James 先謝囉!),還可以渡過這回的小小難關,希望我淺薄的實戰經驗和小小心得也可以幫到別人。

最佳化你的php程式碼的訣竅
* 如果method可以是static,那就宣告它為static。速度的改善可以是4倍。
* echo 比 print 快多了。
* 使用echo的多個參數用法,不要用string的串接(jiing: 也就是用逗號,不要用句號)
* 在迴圈之前設定你的for迴圈的極大值,不要在迴圈中
* Unset你的變數來釋放記憶體,尤其是大型陣列
* 避免使用magic 函式,像是 __get, __set, __autoload
* require_once()非常昂貴(jiing:能用require就用require,儘可能不要重覆require_once或include_once)
* 在includes和requires中使用完整的路徑,會花費較少的時間在解析OS路徑。
* 當script已經開始時,如果如果你需要找出時間(time),$_SERVER['REQUEST_TIME'] 要比time()好的多。
* 看看你是否能用 strncasecmp, strpbrk 和 stripos 來取代regex(jiing:如果可以用字串相關函數來取代正規表示式,那麼就試試看,有時候多個幾行反而比較快)作法:搜尋所有的(用find指令) preg_exp , preg_match相關指令,並研究如何用str相關的函式來取代
* str_replace比 preg_replace快,不過strtr又比str_replace快四倍
* 如果函式(例如字串取代函式),同時接受array和單一字元作為引數,且你的引數串接不是太長,考慮撰寫一些多餘的置換陳述式,一次傳遞一個字元,不要寫一行程式碼來作為搜尋和取代引數、接受陣列。(jiing:意思是寧可多寫幾行來做這件事)
* 用switch陳述式會比多個if else if 好的多。
* switch中,常跑的case放前面一點也會gain到一點效能。
* 用@來做錯誤抑制非常慢
* 打開apache的 mod_deflate
* 當你完成資料庫相關操作時,關閉你的資料庫連結
* $row['id']要比$row[id] 要快上七倍
* 錯誤訊息非常昂貴
* 在for迴圈中不要使用函式,例如:for ($x=0; $x < count($array); $x)
* count()函式會每次都被呼叫。
* 一般而言for會比foreach快,但當迴圈裡的元素(element)大時,有時foreach會稍快一些(個人的心得是要作實驗)
* 在method中遞增local變數是最快的。幾乎和呼叫函式中的一個local變數一樣快。
* 遞增一個global變數比local變數慢二倍。
* 遞增一個object property(e.g., $this->prop++)會比local 變數慢上三倍。
* 遞增一個未定義的local變數會比一個預先初始化的變數慢上9-10倍
* 只宣告一個global變數,而沒有在函式中使用它也會讓事情變慢(大約與遞增local變數的時間一樣)。php可能會去做檢查來看看全域(global)變數是否存在。
* 方法呼叫似乎與class內所定義的方法數目不相干,因為我新增十多個方法到test class(在test method之前和之後),在效能上並沒有變化。
* 在子class的method執行的比在母class定義的更快。
* 具有一個參數和一個空函式主體的函式呼叫花費大約是7-8個$localvar++運算一樣多的時間。
* 相似的方法呼叫當然約是15個$localvar++運算一樣多的時間。
* 以單引號括住字串會比以雙引號(")括住字串快一丁點,因為php會對"..."查找變數,而不會對'...'。(jiing:少寫含糊不清的雙引號(""),是字串就用單引號)當然囉,只當你在字串中沒有變數時,才可以這麼做。
* 儘量減少型別轉換和判斷
* 當使用echo來列印字串時,使用逗號來分隔字串會比用句號(.)快一點。
* 注意:這只要對echo有用,echo是個函式,它可以採取數個字串作為引數(arguments)。
* 使用php 快取的產品。(jiing:如 xcache, php_apc,也可以考慮架設squid等proxy server,, db能開多大的cache就開上去)
* 快取多多益善。 用 memcached
* 可以用isset()來取代stelne($str)==0
*

Ex.
if (strlen($foo) < 5) { echo "Foo is too short"; }
vs.
if (!isset($foo{5})) { echo "Foo is too short"; }

* 在php裡++$i,比$i++快一點
* 不需要每件事都OOP,通常它是過度負載(overhead),每個method和物件呼叫花費很多的記憶體。(jiing:效能和可維護性、可擴充性的取捨真難啊.......orz)
* 不要實作每個資料結構成class,array也很有用
* 不要過度切分method,思考,哪些程式碼是你真的將會重覆使用的
* 當有需要時,你總是可以稍後再切分一個method的程式碼
* 善用數不盡的內定(predefined)函式(jiing:也有例外,hash('md5','optimize this')比md5('optimize this')快)
* 如果有一堆字串結合後不斷輸出的動作,可以考慮使用ob_start()相關的函式
* 如果你有非花費時間的函式的程式碼裡,那麼考慮寫C的extension。(jiing:PECL裡有相關文件,敝公司中據說有V Ving大神留下來的程式碼可以參考,目前祈禱不要用到這個大絕招)

摘自:http://blog.sina.com.tw/jiing/article.php?pbgid=872&entryid=578626

2009年2月19日 星期四

[軟體]檔案切割

推薦:GSplit

2009年2月15日 星期日

Flash 對 JavaScript 的通訊

1. 在 Flash 建立新檔案, 以 flash_to_javascript.fla 命名並儲存。
2. 使用「文字工具」, 將文字欄位置於「舞台」上。
3. 選取文字欄位, 在「屬性」面板中, 從下拉式選單中選擇「輸入文字」。選取邊框圖示, 就能看到欄位 (請參閱上圖的步驟指引)。
4. 在變數欄位中輸入 inputVar。
5. 將按鈕拖曳到「舞台」上。您可以選擇「視窗 > 內建元件庫 > 按鈕」, 尋找範本按鈕。
6. 選取「按鈕」並開啟「動作」面板 (「視窗 > 動作」)。
7. 將下列 fscommand 動作加到按鈕:

on(release) {
fscommand ("send_var", inputVar);
}


8. 儲存檔案。
9. 使用「發佈」功能, 選擇「僅限 Flash」HTML 樣版, 從 Flash 同時發佈 HTML 頁面以及 Flash SWF, 這些動作會在與儲存原始 FLA 檔案相同的資料夾中建立。

# 開啟上述步驟 9 中 Flash「發佈」命令建立的 HTML 檔案。
#
插入 Flash 媒體及 OBJECT/EMBED 程式碼

1. 選擇「插入 > 媒體 > Flash」, 然後選擇上面建立的 SWF"javascript_to_flash.swf"。
2. 選取 Flash 影片預留位置。
3. 使用「檢視 > 程式碼」, 開啟 Dreamweaver 的程式碼檢視。需要著重的 OBJECT 及 EMBED 標籤會反白顯示。
4. 如果程式碼尚未出現在 OBJECT 標籤中, 請輸入值 id="myFlash"。另外還要確定 name="myFlash" 此值沒有出現在程式碼的第一個部份中, 也就是標籤的主要 OBJECT 部份。

codebase="http://download.macromedia.com/pub/shockwave/cabs/
flash/swflash.cab#version=5,0,0,0"
width=366 height=142 id="myFlash">

注意: 複製程式碼並貼至 Dreamweaver 時, 必須移除 Script 中可能的多餘斷行, 否則會在頁面上產生錯誤。

注意: Netscape 6.2 及以上版本需要移除 object 標籤的 name 屬性, 才能允許 Script 通訊。Dreamweaver 在「屬性」檢測器中有個欄位, 會自動寫入兩種屬性, 因此您必須手動編輯程式碼, 確定標籤是正確的。
5. 在標籤的 EMBED 區段中如果不包含這兩種屬性, 請輸入值 name="myFlash" 和 swLiveConnect="true"。確定 EMBED 標籤的這個部份沒有「id」值。


width=366 height=142
type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?
P1_Prod_Version=ShockwaveFlash" name="myFlash" swLiveConnect="true">




建立用以擷取與顯示值的 Javascript 函數

1.開啟 HTML 文件的開頭標籤時, 插入下列程式碼:




執行警示的特定函數以紅色加強顯示。如需有關 Javascript 的詳細資訊, 請參閱其他資訊。
# 選擇「檔案 > 儲存」。
# 使用 F12 在瀏覽器中測試或預覽檔案。

摘自:http://www.adobe.com/tw/support/flash/ts/documents/javascript_comm.htm#ftjc

2009年2月12日 星期四

2009年2月6日 星期五

如果你問柯瑞祥婦產科醫院好不好?推不推薦柯瑞祥婦產科醫院?柯瑞祥婦產科醫院的服務態度?

我太太是在柯瑞祥婦產科醫院看診,
我覺得柯瑞祥婦產科醫院的服務品質很不好,
對事情沒有很嚴謹,
醫生看診也沒有很用心,
護士的服務態度很差,
收的費用也不便宜。

我是不推薦到柯瑞祥婦產科醫院!
感覺真的很差。

2009年2月5日 星期四

[Debug]phpThumb CPU Loading Full

原來是同仁把
phpThumb.config.php中的thumb輸出的類型
從PNG改成GIF

2009年2月4日 星期三

2009年2月3日 星期二

Too Many MySQL Sleep Processes

I’ve been using the CodeIgniter PHP framework to develop a web site that connects to a MySQL database using InnoDB tables and transactions. I ran into some trouble when I filled the MySQL process list with entries with “Sleep” in the command column. This happened even if I was rendering a page that only required reading from the database (and not using transactions). Solutions on the Internet suggesting that I should reduce the MySQL wait_timeout value to 3 seconds (from a setting of 28,800 seconds) or increasing the number of allowed connections didn’t ring true. A post on the MySQL Performance Blog pointed me in the right direction. Apparently, persistent connections do not currently play nice with transactions and InnoDB. The fix was to set the $db['default']['pconnect'] value to FALSE in the CodeIgniter database configuration file (application/config/database.php).

摘自:http://www.appliedmiscellany.com/blog/archives/41

[Debug]Linux下phpThumb的far=C無法正常顯示

將ImageMagick移除即可

2009年2月1日 星期日

[MySQL]檢查MySQL的連線數


netstat -an | grep "192.168.1.1.3306" | grep "ESTABLISHED" | wc -l

wibiya widget