家サーバで遊んでいて、virtual hostをたくさん作ってサーバPCが重くなったときに、PHPで簡単なページを表示する方法。もっとまともな方法があると思うがここでは適当に作った。
最初にエラーのとき表示するHTMLを用意する。ここでは以下の物を作った。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <style type="text/css"> #main { background-color: #fcc; } </style> <title>サイトがビジー状態です</title> </head> <body> <div id="main"> <p> ただいまアクセスが集中しており、サイトがビジー状態です。 </p> <p> もう少し待ってからブラウザのリロードボタンをクリックしてください。 </p> </div> </body> </html> |
これを/phpGlobal/busy.htmlに保存する。ディレクトリは適当でいい。
次にPCが重いかどうかチェックするPHPを書く。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php checkMachineState(); function checkMachineState() { $a = @file_get_contents('/proc/loadavg'); if(!$a) { return; } $a = explode(' ',$a); if($a[0] <= 3) // if(false) { return; } header ('HTTP/1.0 503 Service Temporarily Unavailable'); require 'busy.html'; exit(); } ?> |
これを/phpGlobal/check.phpに保存する。
これはサイトの負荷が3を越えたらbusy.htmlを表示する。
つぎにapache2の設定ファイルapache2.confなどに以下の行を追加する。
1 |
php_value auto_prepend_file /phpGlobal/check.php |
これでapache2をリスタートすると、すべてのPHPの実行前にcheck.phpが実行される。
ただしこの方法だと文字コードによって化けることがあるし、その他にも問題があるかもしれない。POSTリクエストのときは処理したほうがいいと思われる。
PCの現在の負荷はtopコマンドの右上に表示されるのでそこで確認できる。