2016-06-01 12 views
0

私は次のファイルアップロードスクリプトを持っています。それは素晴らしい仕事をしており、私のファイルは完全にアップロードされています。私はそれを使用することができます。しかし、この問題はファイルのアップロードについてではなく、アップロード後に処理されるクエリです。エラー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_UPLOAD128Mに設定され、アップロードされたファイルサイズはログに表示される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 

結果:エラーは引き続き発生します。

+1

あなたは[SQLインジェクション攻撃](http://bobby-tables.com)に脆弱です。 –

+0

これは今問題ではありません。私はそれらを扱う方法を知っています。あなたがそれらを扱う方法を知っているなら、 'MySQLサーバーがなくなった'エラー – Sibidharan

+1

を手伝ってください。どうしてあなたは上記のコードでそれらを扱っていませんか? –

答えて

0

ファイルのアップロードに時間がかかり、低い設定のためサーバーがタイムアウトすることが考えられます。wait_timeout。アップロードを完了した直後と挿入の直前に接続すると、「離れた」問題が解決される可能性があります。だからdbConnect()の直前にmysql_query()の前に電話をかけてください。

+0

私の 'db_connect()'メソッドを追加しています。 – Sibidharan

+0

質問を更新してください。 – Sibidharan

+0

よくチェックしてお知らせします - THanks – Sibidharan

関連する問題