こちらのサイトではDRUPAL10に関連する記事を掲載しています。
DrupalのForm APIを使うと簡単にAjaxが利用できます。ところが60秒で必ずタイムアウトになるのでその原因を調査したのでメモ代わりに残しておきます。
タイムアウトの原因
最初AJAXの設定の問題かと思い、ajax.js (web/core/misc)のajax.optionsにtimeoutプロパティを追加してみました。Drupal Core内のファイルなので確信は持てませんでいたがajax設定はここだけみたいなのでtimeoutを入れてみましたが、結果はかわらずでした。
ブラウザのデベロッパーツールで見てみると504エラーが出ています。
504エラーなのでサーバー側の問題かと思い調べてみると、stack overflowにAjaxで504ゲートウェイエラーになる件が載っていました。
まさしくこれだと思い、Apacheの設定ファイルにタイムアウトディレクティブを追加すると無事解決しました。
ここでは2つの設定に対して記載がありました。一つはphp設定のスクリプト実行時間ともう一つはAPACHE設定ファイルに追加するタイムアウトディレクティブ(タイムアウト時間)です。
それぞれの設定条件によって挙動が変わるのでまとめておきます。
max_execution_time (php.ini)は、phpスクリプトの実行時間です。ここで設定した時間を経過するとタイプアウトとなり処理は停止します。こちらの設定は、php.iniファイルに設定を追加することでできます。ちなみに、次に説明するApacheのタイムアウト時間が経過するまでは、KEEP ALIVEの状態で接続はつながっています。
TimeOut(APACHE設定)は、デフォルトは60秒です。サーバーが接続している時間なのでこの時間を経過すると504GATEWAYエラーになります。この場合でもブラウザで504GATEWAYエラーが表示されるわけでなくAJAXのERRORとして実行されます。こちらの設定はApache設定ファイルにタイムアウトディレクティブを追加することで行います。
### TimeOut-Config ###
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15
今回はTimeOut(APACHE設定)がデフォルトのままだったので接続が切れていました。この設定を
今回はDrupal内のAjaxのためロジックを追ってAjaxのタイムアウト値を変えるなどして原因がわかるまでに時間がかかってしまいました。
Ajaxタイムアウトで調べてみてもAjaxの設定のことしか出てこずに、意外と時間をとられたのでここで情報を共有します!
なにはともあれ無事タイムアウト問題が解決して一安心です。
この記事またはDrupalに関するご質問がございましたら、お気軽にお問い合わせください。