質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

4回答

1132閲覧

phpでjsonをechoした後に重い処理を実行する方法を教えてください

wieee

総合スコア11

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

2クリップ

投稿2019/05/07 07:26

前提・実現したいこと

javascriptでAjaxを通じてバックエンドのphpに処理をpostし、その結果をjsonで受け取っています。
しかしphp側の処理が重くてレスポンス時間が長いので、phpの重い処理部分をjsonのレスポンス送信後に行いたいと考えています。
その方法がいろいろ検索してもわからないためこちらにて質問させてください。

発生している問題

以下のようにphp側の処理は、javascriptでAjaxからリクエストを受けてDBからデータを取得し、json形式にしてjavascriptに返しています。

php

1class AjaxProcess { 2 public static function execute() { 3 // 例としてuser情報を取得する 4 $data = DB_VAR( 'users', id ); 5 6 // ここで何か重い処理をする 7 8 // json出力 9 header( 'Content-Type: application/json; charset=utf-8' ); 10 echo json_encode( array( 'status' => 'SUCCESS', 'data' => $data )); 11 } 12}

しかし重い処理を待たないとecho json_encode();が実行されないため、クライアント側は待ち時間が長くなってしまっています。

試したこと

単純に、重い処理をecho json_encode();の後に移動しましたが、状況は変わりませんでした。

php

1class AjaxProcess { 2 public static function execute() { 3 // 例としてuser情報を取得する 4 $data = DB_VAR( 'users', id ); 5 6 // json出力 7 header( 'Content-Type: application/json; charset=utf-8' ); 8 echo json_encode( array( 'status' => 'SUCCESS', 'data' => $data )); 9 10 // ここで何か重い処理をする 11 } 12}

解決したいこと

jsonを出力した後に重い処理を実行したいです。
重い処理は、出力するjsonの内容に影響しないため、json出力後に処理をしたいのです。
重い処理ですが具体的には他のサービスにAPIでデータを送信しているだけです。そのレスポンスが遅いため、待ち時間が多くなっています。

どうぞよろしくお願いします。

補足情報

環境は以下になります。
php7.2 windows10 xampp7.2.10

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

他の回答にもありますが、内容を出力するだけならob_flushがあります。
ただAjaxは通信終了かタイムアウトまで待つのでJS側でタイムアウトエラーをハンドリングする必要があります。

権限があるならexec()で別プロセス化が近道ですがosコマンドインジェクションなどセキュリティの問題などあることを忘れないでください。
execが駄目な場合ジョブキューと言うアルゴリズムで重たい処理だけ分離したバッチ処理が王道パターンです。
これは例えばjsonだけ先に表示し、重たい処理に必要な情報だけ書き出し(jobをQueueし)処理を一旦終了させ、バックグラウンドで先に書き出したjobをpopさせて処理を完遂させます。

投稿2019/05/07 10:38

namda

総合スコア705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

重い処理が走る前にob_flushすれば重い処理より先にjsonが出力されると思うけど、動作確認した訳ではないので目的に沿った動作になるかは分からない

しかし質問内容読んだ感じだと重い処理の結果をレスポンスに含めたい訳でも無さそうなので、自分なら後の修正や機能の分離を考慮してajaxで呼ぶプログラムを「json出力」と「重い処理」の二つに分けて作る

投稿2019/05/07 09:55

bcaa

総合スコア170

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

DBからの戻りが遅いとわかっていてSQLの最適化で改善できない見込みなら
「ダウンロード予約」する仕組みをつくって完了したらダウンロードできるような
UIにするが妥当です。
なおajaxで非同期で受け取るのと相反する機能ですが、ダウンロードできるように
なるまでダウンロード可能になったかどうかをインターバル処理で繰り返すことで
対応可能です

投稿2019/05/07 09:10

yambejp

総合スコア114806

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

「重い処理」が確実に実行されなくても問題ないのであれば、Ajaxを2つに分けるのが簡単では。

投稿2019/05/07 08:34

tabuu

総合スコア2449

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問