私は次のファイルアップロードスクリプトを持っています。それは素晴らしい仕事をしており、私のファイルは完全にアップロードされています。私はそれを使用することができます。しかし、この問題はファイルのアップロードについてではなく、アップロード後に処理されるクエリです。エラーMySQL server has gone away
がスローされます。 小さなファイルをアップロードすると、スクリプトは正常に動作し、挿入は正常に動作しています。大きなファイルをアップロードする場合にのみ、この問題が発生します。大きなファイルでも正常に保存され、エラーはMySQL Insert
でのみ発生します。ファイルアップロード - MySQLサーバーがなくなった
<?php
include('utils.php');
$result = array();
log_event("info", "Upload script initiated...");
log_event("info", "POST: ".json_encode($_POST, JSON_PRETTY_PRINT));
if(!isset($_FILES['file']['name'])){
$result['error'] = "File not present"; echo json_encode($result); exit();
}
if(isset($_POST['auth'])){
$is_valid = cookie_login($_POST['auth']);
if($is_valid){
log_event("info", "Authenticated for uploading.");
if(isset($_POST['id'])){
$exist = get_project($_POST['id']);
if(!$exist){
$result['error'] = "Project not specified";
} else{
log_event("info", "Project loaded. Analysing files for upload.");
log_event("info", "FILES: ".json_encode($_FILES, JSON_PRETTY_PRINT));
$file_name = $_FILES['file']['name'][0];
$file_size = $_FILES['file']['size'][0];
$file_tmp = $_FILES['file']['tmp_name'][0];
$file_type = $_FILES['file']['type'][0];
$file_name = mysql_real_escape_string($file_name);
$file_ext=$ext = pathinfo($file_name, PATHINFO_EXTENSION);
//print_r($_FILES['file']);
$token = md5($file_name. $file_size.$file_tmp.$file_type. time() . rand(0, 99999) . rand(0, 99999));
log_event("info", "Token Generated: $token");
$filePath = "files/".$token;
log_event("info", "Movable file path named after token: $filePath");
if(!move_uploaded_file($file_tmp, $filePath)){
$result['error'] = "File Copying Error";
log_event("error", "File copying error");
} else {
$sql = mysql_query("INSERT INTO files (name, path, package_name, token, username) VALUES ('$file_name', '$filePath', '$exist[package_name]', '$token', '$is_valid')");
if(!$sql){
$result['error'] = "Internal Server Error. Contact Administrator.";
log_event("error", mysql_error());
}
}
}
} else {
$result['error'] = "Project not specified";
}
} else {
$result['error'] = "Authenticaton Failure";
}
} else {
$result['error'] = "Authenticaton Failure";
}
echo json_encode($result);
間違っているものを分析するために、私はちょうどファイルにどのようなイベントを記録log_event()
方法を作成しました。これが結果です。
[Wednesday 1st of June 2016 09:08:42 PM][info][http://www.example.com/bucket/upload.php] cookie_login(db64f68dee27eb08d29117c7da678f81): Success
[Wednesday 1st of June 2016 09:08:42 PM][info][http://www.example.com/bucket/upload.php] Project loaded. Analysing files for upload.
[Wednesday 1st of June 2016 09:08:42 PM][info][http://www.example.com/bucket/upload.php] FILES: {
"file": {
"name": [
"Sibidharan_Software_Engineer_Android 3.zip"
],
"type": [
"application\/zip"
],
"tmp_name": [
"\/tmp\/phpTJJcQz"
],
"error": [
0
],
"size": [
97226470
]
}
}
[Wednesday 1st of June 2016 09:08:42 PM][info][http://www.example.com/bucket/upload.php] Token Generated: 599293ad3d30fd0d981f967df9d0f61f
[Wednesday 1st of June 2016 09:08:42 PM][info][http://www.example.com/bucket/upload.php] Movable file path named after token: files/599293ad3d30fd0d981f967df9d0f61f
[Wednesday 1st of June 2016 09:09:05 PM][error][http://www.example.com/bucket/upload.php] MySQL server has gone away
最後の2つのプロセスの間に時間が表示された場合、クエリの処理には約23秒かかりました。なぜそれが起こっているのか分かりません。 **
私は小さなファイルをアップロードすると予想されるように、スクリプトの動作
上で言ったように。大きなファイルをアップロードする場合にのみ、この問題が発生します。
**さらに、問題はローカルホストではなく、ライブサーバーでのみ発生します。
私のPHP_MAX_UPLOAD
は128M
に設定され、アップロードされたファイルサイズはログに表示される98M
です。
UPDATE - ここでは、これは、上記のスクリプトに含まれているutils.php
ファイルで行われ、私はデータベースに接続する方法
$db = NULL;
$logs_enabled = "yes";
function dbConnect(){
$DB_SERVER = "localhost";
$DB_USER = "root";
$DB_PASSWORD = "";
$DB = "bucket";
$GLOBALS['db'] = mysql_pconnect($DB_SERVER,$DB_USER,$DB_PASSWORD);
if (!$GLOBALS['db']){
log_event("error", "mysql_pconnect(): ".mysql_error());
return false;
}
if($GLOBALS['db']){
log_event("success", "mysql_pconnect(): Connection obtained");
$check = mysql_select_db($DB,$GLOBALS['db']);
if($check){
log_event("success", "mysql_pconnect(): Database selected");
mysql_query ("set character_set_client='utf8'");
mysql_query ("set character_set_results='utf8'");
mysql_query ("set collation_connection='utf8_general_ci'");
} else {
log_event("error", "mysql_pconnect(): Couldn't select database. Error: ".mysql_error());
}
return true;
}
}
です。
UPDATE 2 Sasha Pachevで言ったように私は、クエリの前に `dbConnectの()を入れてみました、私は次のログを得ました。
[Thursday 2nd of June 2016 12:41:57 AM][info][http://www.example.com/bucket/upload.php] Project loaded. Analysing files for upload.
[Thursday 2nd of June 2016 12:41:57 AM][info][http://www.example.com/bucket/upload.php] FILES: {
"file": {
"name": [
"Sibidharan_Software_Engineer_Android 3.zip"
],
"type": [
"application\/zip"
],
"tmp_name": [
"\/tmp\/php3Gtac3"
],
"error": [
0
],
"size": [
97226470
]
}
}
[Thursday 2nd of June 2016 12:41:57 AM][info][http://www.example.com/bucket/upload.php] Token Generated: f2131640ca97468b62e4ab2b2eed25f9
[Thursday 2nd of June 2016 12:41:57 AM][info][http://www.example.com/bucket/upload.php] Movable file path named after token: files/f2131640ca97468b62e4ab2b2eed25f9
[Thursday 2nd of June 2016 12:42:20 AM][success][http://www.example.com/bucket/upload.php] mysql_pconnect(): Connection obtained
[Thursday 2nd of June 2016 12:42:20 AM][error][http://www.example.com/bucket/upload.php] mysql_pconnect(): Couldn't select database. Error: MySQL server has gone away
[Thursday 2nd of June 2016 12:42:20 AM][error][http://www.example.com/bucket/upload.php] MySQL server has gone away
結果:エラーは引き続き発生します。
あなたは[SQLインジェクション攻撃](http://bobby-tables.com)に脆弱です。 –
これは今問題ではありません。私はそれらを扱う方法を知っています。あなたがそれらを扱う方法を知っているなら、 'MySQLサーバーがなくなった'エラー – Sibidharan
を手伝ってください。どうしてあなたは上記のコードでそれらを扱っていませんか? –