2017-10-12 5 views
0

私は非常に特殊な問題があります。 私はApache2.4の下でubuntuサーバー上で動作しているWebサイトを持っています。 サイトはPHPで書かれており、MySQLをデータベースとして使用しています。 私は、longblobとしてMySQLデータベース内の小さなファイルに対して "ファイルストレージ"を実現しました。ダウンロード中にApache2サーバー/ Webサイトが応答を停止する

MySQLデータベースからBLOB /ファイルをダウンロードするには、データベースへのPDO接続を開きます。

$sql = $pdoData->prepare("SELECT * FROM fileblob WHERE ID = ?"); 
$sql->execute(array($blobID)); 
$row = $sql->fetch(); 
$content = $row['data']; 

via "echo $ content"次に、ファイルをブラウザに送信します。 これは完璧に機能します。しかしながら。ダウンロード中、サイト全体が応答を停止し、新しい要求がすべてタイムアウトになります。 ダウンロードが正常に続きます。

ダウンロードが4MBになると、Webサイトは再び機能し始めますが、非常にゆっくりです。終了すると、サイトは完全に正常に戻ります。

MySQLデータベースは、InnoDBのバックエンドを使用する唯一の6オープンSQL接続があり、ダウンロードの時間の間、など

500の同時接続の最大値を有します。 ディスク使用率は最大約20%、CPU使用率は10%未満 Apacheは1k同時接続(最大100人の子供がいる10スレッド)を処理するようにも設定されています。サーバーは、測定されていない1Gbps回線を介して接続されています。 ハードウェアのボトルネックは考えられません。

私には何が欠けていますか? 質問にお答えします...

+0

あなたの出力バッファリングの設定は何ですか?スクリプトでPHPセッションを使用していますか? – CBroe

+0

@CBroeはい、私はどこでもPHPセッションを使用しています。出力バッファが4096に設定されています – user3829915

+0

_ "出力バッファが4096に設定されています" - なぜ約4MBで効果が変化するのか説明できます。この要求/スクリプトの一部で無効にしてみてください。また、セッション終了後すぐにsession_write_closeを使用してください。そうしないと、セッションデータファイルのファイルロックにより、同時に実行されているリクエストが「ハングする」ことがあります。 – CBroe

答えて

0

PHPのデフォルトのファイルベースのセッションメカニズムを使用している場合、PHPはセッションデータファイルをロックし、特定のセッションにアクセスしているスクリプトは実行中です。

ダウンロードが実行されている間、セッションデータファイルは常に開いたままになり、他のスクリプトは同じセッションにアクセスできなくなります。ファイルロックが再び解除されるまで待つだけです。

これを防ぐために、session_write_closeを使用できます。現在のスクリプトがセッションデータを操作してセッション内容をデータファイルに書き出し、ファイルロックを解放して他のスクリプトが再びアクセスできるようにPHPに指示します。

(あなたは明らかにこの時点で、あなたのセッションのデータ操作を行う必要があり、あなたはその後、同じスクリプトで再びセッションの内容を変更することはできません)

関連する問題