2017-11-23 9 views
0

このCIプロジェクトはデータベースからCSVに変換されています。処理に時間がかかり、「このページは動作していません.SS-server-ip-address>はデータを送信しませんでした。」ERR_EMPTY_RESPONSE

SSHサーバーにデプロイされています。

すべてのデータをロードしようとしています(2,000,000以上あります)。それをCSVに変換します。

私の最初の試みI(それは66,000+私にデータを提供します。)電子メールのみを持つ行でそれをフィルタリング

それは成功した(少し時間がかかりました)csvファイルにデータをエクスポートしました。

しかし、ときに私は最終的に私はそれはとても多くの時間の負荷がかかりますし、ブラウザがエラーを与える、「CSVに変換」をクリックした後、すべてのデータをエクスポートしよう:

This page isn’t working 

<server-ip-address> didn’t send any data. 
ERR_EMPTY_RESPONSE 

んが、これは重要でする何かを持っていますサーバーとは?

私は、これらの設定と/etc/php.iniに設定を変更してみました:

max_execution_time = 259200 
max_input_time = 259200 
memory_limit = 300M 
session.gc_maxlifetime = 1440 

しかし、それはまだ私に同じエラーを与えます。

どうすれば解決できますか?助けてください。

UPDATE:私はCSVファイルのダウンロードのための私のコードが含まれ、ここにある:

public function convcsv(){ 

     ini_set('memory_limit', '-1'); 
     set_time_limit(0); 

     $prefKey = $this->session->flashdata('prefKey'); 
     $searchKey = $this->session->flashdata('searchKey'); 
     $withEmail = $this->session->flashdata('withEmail'); 
     log_message('debug', 'CONVCSV prefKey = ' . $prefKey); 
     log_message('debug', 'CONVCSV searchKey = ' . $searchKey); 
     $list = $this->user_model->get_users($prefKey, $searchKey, $withEmail, "", ""); 
     log_message('debug', 'Fetched data'); 
     $headerArray = array("id", "prefecture_id", "industry_id", "offset", "name", "email"); 

     // Header 
     $header = str_replace(",", "", $headerArray); 
     $datas = implode(',', $header) . "\r\n"; 

     // Body 
     foreach($list as $body) 
     { 
      // 配列の内容を「,」区切りで連結する 
      $orig_email = $body['email']; 

      $mstring = preg_replace("/^([^a-zA-Z0-9])*/",',',$orig_email); 

      preg_match_all("/[\._a-zA-Z0-9-][email protected][\._a-zA-Z0-9-]+/i", $mstring, $matches); 
      $email = implode($matches[0]); 
      //$email = $matches[0]; 

      $datas .= $body["id"].",".$body["prefecture_id"].",".$body["industry_id"].",".$body["offset"].",".preg_replace('/[,]/',' ',$body["name"]).",".$email."\r\n"; 
     } 

     // 文字コード返還 
     $datas = mb_convert_encoding($datas, "SJIS-win", "UTF-8"); 

     // ダウンロード開始 
     $csvFileName = "phpList_" . date('Ymd_His') . ".csv"; 
     header('Content-Type: application/octet-stream'); 
     header('Content-Disposition: attachment; filename=' . $csvFileName); 
     header('Content-Transfer-Encoding: binary'); 
     while (ob_get_level() > 0) 
     { 
      ob_end_clean(); 
     } 

     ob_start(); 
     print trim($datas); 
     ob_flush(); 
     ob_end_clean(); 
     exit; 
    } 
+0

ブラウザからダウンロードする必要がありますが、ftpはより効率的です。 – nogad

+0

@nogadはオプションではありません。これは、データをcsvに変換するcodeigniterプロジェクトのものです。 –

+0

ファイルを提供していますか?またはデータストリーム?ファイルを圧縮していると考えられますか? – nogad

答えて

1

[OK]を、私は私はあなたが与えたものはほとんどデータでできる最善のようにこれを説明しようとします。私はあなたがデータベースからデータを引き出すことができると仮定します。あなたはPDOでunbufferedクエリ(私は最後の4 - 5年のためにPDOを使用)サイドノートとして

http://php.net/manual/en/mysqlinfo.concepts.buffering.php

を使用することができない場合は、私はバッファなしのクエリを使用してMySQLから1.1億行を引っ張ってきた、これは、 ramの56GB(Azure standard_A8、それはかなりの33t)のサーバ上で。

通常、ブラウザがページを読み込んだときに、すべてのサーバー側を「ビルド」してからブラウザで(一般的には)ダンプします。あなたの場合、これはあまりにも多くのデータです。だから、

(Psudoっぽいコード)

set_time_limit(-1); //set time limit. 

header('Content-Type: text/csv; charset=utf-8'); 
header('Content-Disposition: attachment; filename=data.csv'); 

$f = fopen('php:\\output', 'w'); 
while(false !== ($row = $stmt->fetch(PDO:FETCH_ASSOC))){ 
    fputcsv($f, $row); 
    flush(); 
} 

欠点は、手の前にダウンロードしたファイルのサイズを伝えるためには実際の方法がないです。基本的にダウンロードヘッダーを送信してから、各行を出力ストリームにダンプし、一度に1行ずつブラウザにフラッシュします。

全体的にこれは、より多くのネットワークトラフィックがあるが、メモリをよりよく管理するため、時にはそれが何であるかによって、1回のプッシュでそれを行うのが遅くなります。

あなたは

http://php.net/manual/en/function.flush.php

(出力をストリーミングするため)ページにいくつかの例を見ることができますし、それが動作しない場合(最初の)このようにいくつかのものを使用する必要があります、

@apache_setenv('no-gzip', 1); 
ini_set('zlib.output_compression', 0); 
ini_set('implicit_flush', 1); 

ダウンロードはかなり早く始まりますが、完全なファイルが途中でエラーとして出力されるという保証はありません。

私は甘やかされて育ったんだとデフォルトとして2GBを持っていると6GBまでの実行時にini_set('memory_limit', '300M'); //set at runtime

最後には、私は世界的に時間制限を設定していないと言うために強いと感じたが、これもmemory_limit = 300Mで問題が発生する可能性があり代わりに実行時にこの方法でset_time_limit(-1);を実行します。そうすれば、このスクリプトにのみ影響を与え、サーバー全体には影響しません。しかし、あなたは、Apache自体のタイムアウトに関する問題に遭遇するかもしれません。サーバーとブラウザの間には多くの可動部分が存在するため、非常に難しいことです。多くはサーバ、サーバOS、ブラウザなどに依存する可能性があります(環境)

FTPでダウンロードするのが理想的ですが、これはおそらく最もコンセプト上の解決策です簡単に消化可能なチャンクを送信する問題。

関連する問題