Session 的瓶頸與解決方法

 

Session 的使用 這篇最後面提到了當 PHP server 超過一台時會有問題,這有蠻多的解法,不同的解法偏重在解決不同的問題。

第一種解法是修改 PHP Session 存放目錄,指到 NFS 路徑上,這樣就不會有在 web1 登入後 web2 讀不到的問題。這個在 交大資工 的 PHP server 就是這樣做,這樣做很明顯的優點是「簡單」,缺點就是 NFS 效率與穩定性的問題,不過對於小量的網站來說其實還不錯,因為第一次擴充時的瓶頸通常都是先出現在前端的 PHP server 上,NFS 的效率反而不是重點。

第二種解法則是透過 memcached 來放,這種方法通常都是因為 NFS 效率影響太大,或是覺得 NFS 的穩定性不夠,把 NFS 換成 memcached 希望能解決掉這個問題。這個作法需要利用 session_set_handle() 設定自己寫 (或是網路上抓來的) 程式碼將 Session 資料丟到 memcached 裡。另外一個方案是 Mohawk Software Session Handler Functions,沒有實際用過,不過看起來也是這一類的方案。

第三種解法是透過密碼學的方式將資料放在使用者端。如果資料不敏感 (像是只有使用者的 username),就透過 HMAC 簽,然後在使用者的瀏覽器上設 Cookie 紀錄,其他的頁面就可以利用 HMAC 檢查是不是自己簽的。如果資料比較敏感,不方便給使用者看到,那麼先透過 Cipher 加密後再用 HMAC 簽,然後再塞到使用者端瀏覽器的 Cookie。這種方式的好處是 Server 端是處於 Stateless 的狀態,這種方式等於完全不需要在 Server 端存資訊。但缺點就是 HMACCipher 用的 key 如果外洩就糟糕了。

第四種解法是透過硬體或是某些特定的 Reverse Proxy 解決 Load Balance 時 Session 所產生的問題,簡單來說就是某個 Cookie 一樣就會導到後端一樣的機器 (在這個例子裡是 PHPSESSID),於是後端就可以用最原始的 /tmp 來放 Session 資料。

這四種解法都有優缺點,並沒有哪個絕對比較好或是比較差,好壞要看使用的環境而定。

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

PHPMailer 是一個功能豐富的函式庫,以下是用 PHPMailer 通過遠端 SMTP 認證發送郵件的例子:

PHP:
  1. <?php
  2. // 建立 PHPMailer 物件及設定 SMTP 登入資訊
  3. require("../phpMailer/class.phpmailer.php");
  4. $mail = new PHPMailer();
  5. $mail->IsSMTP(); // send via SMTP
  6. $mail->Host = "remote.smtp.server"; // SMTP servers
  7. $mail->SMTPAuth = true; // turn on SMTP authentication
  8. $mail->Username = "me@localhost"; // SMTP username
  9. $mail->Password = "123456"; // SMTP password
  10.  
  11. $mail->From = "myemail@localhost";
  12. $mail->FromName = "My Name";
  13.  
  14. // 執行 $mail->AddAddress() 加入收件者,可以多個收件者
  15. $mail->AddAddress("to@email.com","Josh Adams");
  16. $mail->AddAddress("to2@email.com"); // optional name
  17.  
  18. $mail->AddReplyTo("jyu@aemtechnology.com","AEM");
  19.  
  20. $mail->WordWrap = 50; // set word wrap
  21.  
  22. // 執行 $mail->AddAttachment() 加入附件,可以多個附件
  23. $mail->AddAttachment("path_to/file"); // attachment
  24. $mail->AddAttachment("path_to_file2", "INF");
  25.  
  26. // 電郵內容,以下為發送 HTML 格式的郵件
  27. $mail->IsHTML(true); // send as HTML
  28. $mail->Subject = "testing email";
  29. $mail->Body = "This is the <b>HTML body</b>";
  30. $mail->AltBody = "This is the text-only body";
  31.  
  32. if(!$mail->Send())
  33. {
  34.     echo "Message was not sent <p>";
  35.     echo "Mailer Error: " . $mail->ErrorInfo;
  36.     exit;
  37. }
  38.  
  39. echo "Message has been sent";
  40. ?>

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

以下是用 PHP 列出目錄內容的方法,當然也可以略為修改以程式碼改為 function 使用:

PHP:
  1. <?php
  2. // 定義要開啟的目錄
  3. $dir = "/var/www/vhosts/dir";
  4.  
  5. // 用 opendir() 開啟目錄,開啟失敗終止程式
  6. $handle = @opendir($dir) or die("Cannot open " . $dir);
  7.  
  8. echo "<b>Files in " . $dir . ":</b><br/>";
  9.  
  10. // 用 readdir 讀取檔案內容
  11. while($file = readdir($handle)){
  12.     // 將 "." 及 ".." 排除不顯示
  13.     if($file != "." && $file != ".."){
  14.         echo "$file<br/>";
  15.     }
  16. }
  17.  
  18. // 關閉目錄
  19. closedir($handle);
  20. ?>

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

現在網上購物越來越普及,所以對信用卡號碼的檢查也變得重要。要檢查信用卡號碼,一般可以用 LUHN 演算法來實現。現在大部份的主要信用卡也是使用 LUHN 演算法,包括 Visa, Master Card, American Express 及 Discover 等。LUHN 演算法只可以檢查信用卡號碼的合法性,而不會檢查信用卡其他資訊,包括是否過期。使用方法為:

1. 檢查信用卡號碼是否 16 位。
2. 將信用卡號碼切割成 16 個個別數字。
3. 將上面切割得的所有數字,由左至右起計,每逄單數位置的數值乘 2。
4. 將加總後所有結果都切割成個別數字再相加。
5. 將上面求得的總數求出 10 的餘數,如果餘數是 0 便表示信用卡號碼正確,否則便是錯誤。

以下是 PHP 使用 LUHN 演算法檢查信用卡號碼的函式:

PHP:
  1. <?php
  2. /* luhn_checker(): This is a small PHP function for checking valid *
  3. * credit card with LUHN algorithm                                  *
  4. *                                                                  *
  5. * Last updated: 26 August 2007                                     *
  6. * This is a free PHP script under GNU GPL version 2.0 or above     *
  7. * Copyright (C) 2007 Sam Tang                                      *
  8. * Feedback/comment/suggestions : http://www.real-blog.com/        */
  9.  
  10. function luhn_checker($card_num){
  11.     // 將非數字的字串移除
  12.     $card_num = preg_replace("/\D|\s/", "", $card_num);
  13.  
  14.     $sum = 0;
  15.     for($i=0; $i<strlen($card_num); $i++){
  16.         $digit = substr($card_num, $i, 1);
  17.         if(($i % 2) == 0){
  18.             // 在單數位置的數值乘 2
  19.             $digit = $digit * 2;
  20.         }
  21.  
  22.         if ($digit> 9)  $digit = $digit - 9;
  23.         $sum += $digit;
  24.     }
  25.  
  26.     if(($sum % 10) == 0 && strlen($card_num) == 16){
  27.         return TRUE;
  28.     }else{
  29.         return FALSE;
  30.     }
  31. }
  32.  
  33. /* Example
  34. if(luhn_checker("1234567812345678")){
  35.     echo "Correct!";
  36. }else{
  37.     echo "Wrong card number!";
  38. }
  39. */
  40. ?>
9) $digit = $digit - 9; $sum += $digit; } if(($sum % 10) == 0 && strlen($card_num) == 16){ return TRUE; }else{ return FALSE; } } /* Example if(luhn_checker("1234567812345678")){ echo "Correct!"; }else{ echo "Wrong card number!"; } */ ?>

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

  1. 在 PHP 內用 mail() 發出郵件時,如果沒有指定 Return Path,系統便會以預設的電郵地址代替 (例如 me@localhost 這類)。以下是一個常見的錯誤:

    PHP:
    1. <?php
    2. $header = "From:My Name<my_name@mydomain.com>";
    3. mail($to, $subject, $email_body, $header);
    4. ?>

     

    以上設定了所發出的郵件的 From 內容,但這是不夠的,只要查看所發出郵件的 header,會發現有一個 Return-Path 顯示系統的預設電郵。因為現時 spam 非常猖獗,很多 email server 會這類 email 檔掉或者標示成 spam,將以上程式碼改成這檔便可以避免這個問題:

    PHP:
    1. <?php
    2. $header = "From:My Name<my_name@mydomain.com>\r\n";
    3. $header .= "Reply-To: My Name<my_name@mydomain.com>\r\n";
    4. $header .= "Return-Path: My Name<my_name@mydomain.com>\r\n";
    5. mail($to, $subject, $email_body, $header);
    6. ?>

     

  2.  

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


防止機器人大量註冊程式

http://www.ez2.us/~ricky/RobotAway/

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


1. 安裝JDK

chmod 755 jdk1.6.0_03.rpm.bin
./jdk1.6.0_03.rpm.bin

設定目錄
vi /etc/profiles

JAVA_HOME=/usr/java/jdk1.6.0_03
PATH=$PATH:$JAVA_HOME/bin
CATALINA_HOME=/var/tomcat
CLASSPATH=. : $JAVA_HOME/lib
export PATH JAVA_HOME CLASSPATH CATALINA_HOME

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


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


demo:http://www.healdream.com/upLoad/html/jquery/datepicker/index.html
down:http://www.51files.com/?3UWL82G4ILOTOEIT3BQ6
用法很簡單,而且js文件也很小,之前也見過一些日期選擇控件,但個頭都比較大,影響速度
可以設置日期的格式,可以選擇日期的起止時間,如果不加參數的話,默認就是之前的日期不可選,而只能從今天開始選擇

本站備份下載...

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


nicejforms可以算是jquery的一個插件,可以起到非常好的美化表單的作用

demo:http://www.healdream.com/upload/html/nicejforms/nicejforms_green.html
down:http://www.51files.com/?O4IXTNT9ZO9BIL954XTP

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


demo:http://www.healdream.com/upload/html/jquery/greybox/test.html
down:http://www.51files.com/?9UF4NA8RCRX5A0Z2F170

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


實在是太方便了,只要一句話,就能讓目標div變成圓角,就像這樣

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

原始文章出處:http://www.blueidea.com/tech/web/2003/1303.asp

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


點擊下載觀看範例...

[轉] 上面的這個select輸入之後是不起作用的,是不可編輯的select。
下面這個是可編輯的select:

點擊下載觀看範例...

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

靜態文字分頁效果

可將字串中的文字進行分頁


點擊下載觀看範例...

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