今回からウェブサーバの構築に入ります。
php, ruby, python, javaでウェブサーバを構築したのち、JMeterを用いて負荷試験を行います。
まずは、phpでウェブサーバを構築しました。
既に研修1の内容でphpは表示できる状態になっていましたのでそのまま進めていきます。
今回の内容は、
1.MySQLにデータベースをつくる。
2.id1, id2, letterの3つのカラムをつくる(id1のみインデックスあり)。
3.テストデータを100万レコード入れる。
4.パラメータを付けてアクセスしたときに、id1あるいはid2の値に応じてletterの値を表示する。
5.JMeterを使って負荷試験を行う。
少しわかりにくいので例を挙げると、
データベースに(id1 = 1, id2 = 1, letter = a)というデータを入れたとします。
このとき、http://192.168.0.160/test.php?id=1でアクセスしたときに、
ブラウザにletterの値。すなわち"a"と表示するということです。
実際に記述した内容は以下になります。
test.php
<?php
//connect
$conn = mysqli_connect('localhost', 'ユーザ名', 'パスワード', 'データベース名');
// mysql query
$sql = "";
$sql .= "select";
$sql .= " letter";
$sql .= " from テーブル名";
if(isset($_GET['id1'])) {
$id1 = $_GET['id1'];
}
if(isset($_GET['id2'])) {
$id2 = $_GET['id2'];
}
if ($id1 == null){
if ($id2 == null){
System.out.print("NG302");
}else if ($id2 > 1000000 || $id2 < 1){
System.out.print("NG303");
}else {
//connect database. pick letter up!
$sql .= " where id2 = $id2";
$result = mysqli_query($conn, $sql);
while($row = mysqli_fetch_assoc($result)){
$letter = $row["letter"];
}
//出力
System.out.print("OK id2 $id2 $letter");
}
}else if ($id2 != null){
System.out.print("NG301");
}else if ($id1 > 1000000 || $id1 < 1){
System.out.print("NG303");
}else {
//connect database. pick letter up!
$sql .= " where id1 = $id1";
$result = mysqli_query($conn, $sql);
while($row = mysqli_fetch_assoc($result)){
$letter = $row["letter"];
}
//出力
System.out.print("OK id1 $id1 $letter");
}
//結果セットを解放
$result->free();
// データベース切断
mysqli_close($conn);
?>
まず初めに、データベースに接続するための情報を書いています。
そして、送られてきたパラメータに応じて条件分岐を行っています。
id1, id2が同時に指定されたときはNG301、
id1, id2がどちらも指定されなかったときはNG302、
id1, id2の値が1~1,000,000じゃなかったときはNG303、
それ以外の場合はid1, id2に応じたletterの値をデータベースから検索して表示しています。
ちなみに、100万件のテストデータは
(1, 1, "a-zからランダム")
(2, 2, "a-zからランダム")
・・・
(1000000, 1000000, "a-zからランダム")
となっています。
今回はPHPスクリプトで、データの生成とデータベースへの挿入を行いました。
コードは以下の通りです。
makedata.php
<?php
//random letter
$str = array_merge(range('a', 'z'));
//connect mysql
$conn = mysqli_connect('localhost', 'ユーザ名', 'パスワード');
//select database
mysqli_select_db($conn, 'データベース名');
for($i = 1; $i < 1000001; $i++ ){
$r_str = $str[rand(0, count($str) - 1)];
$sql = "";
$sql .= "insert";
$sql .= " into テーブル名";
$sql .= "(id1, id2, letter)";
$sql .= " values";
$sql .= "($i, $i, '$r_str')";
mysqli_query($conn, $sql);
print($sql);
}
?>
まずa-zの文字列を生成しています。後ほどここからランダムに1文字抽出し、letterとします。
次に、データベースに接続する情報を記述します。
そして1-1,000,000までの数字に対してデータを生成し、都度データベースへ挿入しています。
合計で2時間半ほどかかりました。
終わってから、先にテストデータを生成しておいて一気にデータベースに挿入した方が早かったかなと思いました。
次回はその方法を用いてデータを挿入しています。
負荷試験の結果は最後にまとめて紹介します。
php編は以上です。次回はruby編です。