2017-09-23 14 views
1

"大きな"ファイルをアプリケーションにアップロードしようとしています。ユーザーは200MB未満のビデオファイルをアップロードできる必要がありますが、サーバーが4MBまたは30秒後に接続を切断してアップロードが失敗するようです。30秒後にDropzone.jsのPHPアップロードが失敗しました

私はすでにこのように私php.iniファイル内のすべてのパラメータを設定しました:

max_input_time = 320
max_execution_time = 320
max_file_uploads = 20
memory_limit = 512M
post_max_size = 201M
upload_max_filesize = 200M

私がアップロードしたときにすべてが働いていますaここDropZone.js confのですが2メガバイト@最高1Mbps /秒(ファイルサイズや転送時間に関連する問題であるならば、私は知らない)

ライブphp_info()ファイルのファイルはphp_info

に到達することができます。

$("#dZUpload").dropzone({ 
    url: "/ajax/admin/admin.acceptVideo.php", 
    maxFilesize: 209715200, 
    acceptedFiles: "video/*", 
    addRemoveLinks: true, 
    dataType: "HTML", 
    data: { id: '' }, 
    success: function (file, response, data) { 
     var imgName = response; 
     file.previewElement.classList.add("dz-success"); 
     $('#form_video').val(imgName); 
    }, 
    error: function (file, response) { 
    file.previewElement.classList.add("dz-error"); 
    } 
}); 
Dropzone.autoDiscover = false; 
Dropzone.prototype.defaultOptions.dictRemoveFile = "Rimuovi file"; 
Dropzone.prototype.defaultOptions.dictCancelUpload = "Annulla"; 

そして、ここでアップロードを処理するPHPスクリプトです:

<?php 
require_once '../db.config.php'; 

header('Content-Type: text/plain; charset=utf-8'); 

ini_set('upload_max_filesize', '200M'); 
ini_set('post_max_size', '201M'); 
ini_set('max_input_time', 320); 
ini_set('memory_limit', '256M'); 


try { 
    if (
     !isset($_FILES['file']['error']) || 
     is_array($_FILES['file']['error']) 
    ) { 
     throw new RuntimeException('Invalid parameters.'); 
    } 

    switch ($_FILES['file']['error']) { 
    case UPLOAD_ERR_OK: 
     break; 
    case UPLOAD_ERR_NO_FILE: 
     throw new RuntimeException('No file sent.'); 
     break; 
    case UPLOAD_ERR_INI_SIZE: 
     break; 
    case UPLOAD_ERR_FORM_SIZE: 
     throw new RuntimeException('Exceeded filesize limit.'); 
     break; 
    default: 
     throw new RuntimeException('Unknown errors.'); 
     break; 
} 

    // check filesize. 
    if ($_FILES['file']['size'] > 209715200) { 
     throw new RuntimeException('Exceeded filesize limit.'); 
    } 

    // Check MIME Type. 
    $finfo = new finfo(FILEINFO_MIME_TYPE); 
    if (false === $ext = array_search(
      $finfo->file($_FILES['file']['tmp_name']), 
      array(
       'mp4' => 'video/mp4', 
       'mov' => 'video/mov', 
       'avi' => 'video/avi', 
      ), 
      true 
     )) { 
     throw new RuntimeException('Invalid file format.'); 
    } 

    // name uniquely. 
    $fileName = sha1_file($_FILES['file']['tmp_name']); 
    if (!move_uploaded_file($_FILES['file']['tmp_name'], sprintf('/var/www/html/beta.vedocompro.it/web/webtemp/%s.%s', $fileName, $ext))) { 
     throw new RuntimeException('Failed to move uploaded file.'); 
    } 

    try { 

     $PDO = new PDO('mysql:host=' . $DB_HOST . ';dbname=' . $DB_NAME,$DB_USER,$DB_PASS); 
     $insert = $PDO->prepare("INSERT INTO `videos` (`id`, `aid`, `accepted`, `uid`, `dir`) VALUES (NULL, '0', '0', '0', $fileName);"); 
     $insert->execute(); 

     echo $fileName; 

    } catch(PDOException $exception) { 
     echo $exception; 
    } 



} catch (RuntimeException $e) { 

    echo $e->getMessage(); 

} 

だから、すべてがOKのようですが、サーバ間違って何かした後、接続をドロップします(私は私は思いませんに関連しているため、2MBの小さいファイルが機能します)。

問題を特定できますか?私は、スクリプトの実行の30秒で正確に落とすことがわかってきたいくつかのテストを行う

EDITは、私は、スクリプトの先頭にset_time_limit(0);を追加するためにしようと試みましたが、何も

+0

あなたのケースの中には、休憩がありません。これはあなたのコードを修正することはできませんが、それらを追加する必要があります。 –

+0

* "PDOqueryに関連しているとは思わない" * - ファイル名が文字列である可能性が高い 'VALUES(NULL、 '0'、 '0'、 '0'、$ fileName)失敗しても、私は間違っている可能性があります。 –

+0

あなたの投稿を編集して、そのためのHTMLを含むことができますか?たぶんそこには制限が入っているものがあります。ローカルサーバー上でこれを実行している場合は、変更を加えた場合はすべてのサービスを再起動してください。最大実行時間も0に設定してください。 –

答えて

9

問題がXHRタイムアウトにあった再度変更しませんajaxコール設定を参照します。

これを避けるには、のinitパラメータにtimeout: 180000(またはmsで必要なもの)を入れる必要があります。

$("#dZUpload").dropzone({ 
    url: "/ajax/admin/admin.acceptVideo.php", 
    maxFilesize: 209715200, 
    acceptedFiles: "video/*", 
    addRemoveLinks: true, 
    dataType: "HTML", 
    timeout: 180000, 
    success: function (file, response, data) { 
     // Do things on Success 
    }, 
    error: function (file, response) { 
    file.previewElement.classList.add("dz-error"); 
    } 
}); 

DropZone.jsでファイルをアップロードするとき、これは30 secondsタイムアウトが発生することはありません。

UPDATE

@Brendonミューアが報告したように、あなたはまた、タイムアウトを無効にするにはtimeoutとして0を挿入することができます。

DropZone.jsドキュメントでは、デフォルトのタイムアウトが0であることが報告されています。これは間違っています。デフォルトのタイムアウトは30秒です。 値が0の場合、タイムアウトは無効になります。

+0

Webサーバーレベルでもタイムアウト動作に影響する設定があります。これは私を助けました:https://stackoverflow.com/questions/24127601/uwsgi-request-timeout-in-python –

+0

タイムアウトを無効にするには、タイムアウトを0に設定することもできます。ドキュメントではデフォルトでは0と誤って報告されていますが、実際にはデフォルトで30秒に設定されています。 –

+0

あなたの提案@ BrendonMuirをありがとう、私は私の返信を更新しました。 – andreaem

関連する問題