2016-10-28 31 views
1

私はZend FrameworkとMysql上にビルドされたPHPアプリケーションを持っています。 日付範囲を適用し、データベースを照会して出力を返すレポートページがあります。 数日を選択すると、クエリが高速に実行されます。しかし、私は数ヶ月の日付範囲を選択すると、データ出力が大きいため、非常に長い時間がかかります。ブラウザレベルから実行中のPHPプロセスを停止する方法

今私の質問は、私がより広い日付範囲を実行し、プロセスが長時間実行され始めると、キャンセルする方法がないということです。 私はブラウザを停止したり、ブラウザを再読み込みすることはできません。ブラウザを閉じて新しいページを開いても、Apacheは応答しません。言い換えれば、プロセスはApacheをハングアップさせます。 これを壊す唯一の方法は、Linuxサーバーでプロセスを強制終了するか、またはApacheを再起動することです。

私は、いつでもプロセスを強制的に停止できるようにするためにコードにどのような改善ができるのだろうかと思いました。

このようなロックアップを回避するためにコードをどのように開発しますか?私は何が欠けているのですか?

は、私が提案できる最善の方法は、日付範囲機能を使用しているあなたに

+0

できません。ブラウザの最後で実行できることは ''です。サーバへの接続を閉じます。しかし、PHPがコネクションがクローズされていること(例えば、出力を試みることによって)が終わったことを知らない限り、それは終了するまで、CPU /時間制限のヒット、または宇宙の熱死を徹底的に抑えるでしょう。また、ファイルベースのセッションを使用している場合は、実行中のスクリプトがセッションファイルをロックしたままにしているため、セッションを使用しているすべてのページから自分自身をロックしてしまいます。 –

+0

私は私の質問を言い換えたいと思います。大量のデータや悪いデータベース設計による – user1322977

+0

? あなたはそのページをajaxにすることができます。ユーザーに数ヶ月を選択させ、ビューに制限を付けるようにします(データテーブルのようなものかもしれません)。したがって、サーバーの制限されたデータのみを要求しますが、これは高速になります。しかし、それが悪いデータベース設計の場合は、他の場所でも問題を起こすでしょう。もしあなたがそれを修正することができれば。 –

答えて

0

ありがとうございます。 フロントエンドで、日付が選択され、送信ボタンがクリックされると、日数の差を計算する関数を起動します。

希望の範囲を超えている場合は、フォームを送信して、より低い期間を選択するようにメッセージを表示させます。

また、クエリが実行されているページでも同じように検証するようにしてください。ユーザーがJavaScriptを使いこなしても、バックエンドはリクエストを無視してクエリを実行しません。

関連する問題