テーブルに挿入する PHP mysql コードがいくつかあります (以下を参照)。自宅の私のボックスでは正常に動作しているように見えましたが、ホストされている実稼働サーバーでは、実行中に信じられないほどのメモリが発生し、速度が低下しています。
Column Type Null Default Comments
uid int(1) No
CUID int(11) No
AUID int(11) No
user varchar(10) No
position varchar(15) No
User Added By varchar(10) No
Added On datetime No Indexes
Keyname Type Unique Packed Column Cardinality Collation Null Comment
PRIMARY BTREE Yes No uid 17196 A No
AUID BTREE No No AUID 9 A No
user BTREE No No user 150 A No
CUID BTREE No No CUID 3439 A No
Space usage:
Data 794,776 B
Index 605,184 B
Total 1,367 KiB
Row Statistics:
Format dynamic
Rows 17,196
Row length ø 46
Row size ø 81 B
Next autoindex 27,104
フォームがある Web ページに移動すると、フォームに記入してこのテーブルに挿入します。初回はそこそこの速度。2 回目は、ページが完了するまでに数十秒かかり、ホスティング サーバーのメモリ ログなどを確認すると、RAM がすべての制限に達しています。
From ▴ To aCPU mCpu aEP mEP lEP aMEM mMEM lMEM MemF MepF
02-27 10:08 02-27 10:09 12 62 1 3 20 359.1M 4.0G 4.0G 1 0
02-27 10:07 02-27 10:08 0 0 0 0 20 4.1M 4.1M 4.0G 0 0
02-27 10:06 02-27 10:07 0 0 0 0 20 4.1M 4.1M 4.0G 0 0
02-27 10:05 02-27 10:06 0 0 0 0 20 4.1M 4.1M 4.0G 0 0
02-27 10:04 02-27 10:05 25 62 1 4 20 22.5M 59.8M 4.0G 0 0
02-27 10:00 02-27 10:05 0 0 0 2 20 4.6M 22.7M 4.0G 0 0
02-27 09:00 02-27 10:00 0 75 0 4 20 5.8M 452.7M 4.0G 0 0
02-27 08:00 02-27 09:00 0 0 0 1 20 284K 18.1M 4.0G 0 0
最初の行の 4.0G に注意してください。
私はこれが何であるかについて本当に立ち往生しています。ホスティング場所はsuPHPを使用しており、これにはバグがあったと聞いています(ただし、それは数年前のことです)。
おそらく非現実的かもしれませんが、このテーブル (比較的小さいと思います) に単一の挿入を行うことで、いたるところにメモリの問題が発生することはありません。挿入ステートメントは次のとおりです。
mysql_query('INSERT INTO call_member SET user="'.$user.'", position="'.$position.'", CUID="'.$CUID.'", AUID="'.$apparatus.'", `LOSAP Added By`="'.$losap_added_by.'", `Added On`=NOW()');
これで、mysqli に切り替える必要があることがわかりました。それが短期計画です。
サーバーを殺すのは何ですか?ホスティング会社と協力しましたが、サーバーは問題ないようです。
これがメモリの問題を引き起こしているかどうかは完全にはわかりませんが、このコードを実行するたびに発生します。ですから、それが原因だと思います。どんなアイデアでも大歓迎です。
[さらにコードを追加]
$query = 'SELECT USER FROM member WHERE USER = "'.strtolower($user).'"';
$ck = squery( $query );
$num_entries = mysql_num_rows( $ck );
$row_person = mysql_fetch_assoc($ck);
$query = 'SELECT USER FROM call_member WHERE CUID='.$_REQUEST['CUID'].' AND USER = "'.strtolower($user).'" LIMIT 1';
$ck = squery( $query );
if( $num_entries == 1 && mysql_num_rows($ck) == 0 )
{
if( $num_entries == 1 )
{
$query = 'INSERT INTO call_member SET LOSAP="'.$row_person['LOSAP'].'", ccnumber ="' . $ccnumber . '", position="'.$position.'", CUID="'.$CUID.'", apparatus="'.$apparatus .'", `LOSAP Added By`="'.$user_added_by.'", `Added On`=NOW()';
$result = squery( $query );
}
else
{
print '<div>Error: Could not find a user number or unique person for "'.$user.'" or the person is not a current member.</div>';
}
}
そして、インクルード関数で定義された関数 squery があります。
function squery( $query )
{
$result = mysql_query( $query );
print mysql_error();
return $result;
}