SPIRAL®の「30秒の壁」を突破せよ!
外部サーバ連携による大量データ処理の最適化

  • SPIRAL
「クラウドサービスは便利だけど、自由度が低くてかゆいところに手が届かない......」

そんな経験はありませんか? 今回は、SPIRAL®のPHP実行時間制限(30秒)をストリーミング処理で
回避した実装事例をご紹介します。

■【課題】大量CSV処理で直面する「30秒の壁」

今回の自治体向けWeb申請システムでは、堅牢なPaaS基盤であるSPIRAL®を採用しました。しかし、大量データを扱う処理では、標準機能の範囲だけで完結させることが難しい場面がありました。
自治体案件では、扱うデータが数十万件規模におよぶケースがあります。
  • ・大量の申請データをCSV形式で一括ダウンロードしたい
  • ・CSVを読み込ませてデータベースを一括更新したい

こうした要件に対し、SPIRAL®のPHP実行環境にはいわば「30秒の壁」という実行時間制限があります。大量レコードを一度に処理しようとすると、処理の途中でタイムアウトが発生し、処理が正常に完了しないリスクがありました。

■【解決】外部サーバへのオフロードとストリーミング出力

この制限を回避するため、実行環境のカスタマイズが容易な外部サーバを処理実行エンジンとして活用しました。
JavaScript側では複雑な制御を行わず、単一のリクエストで処理を開始し、負荷の高い処理は外部サーバ側に委ねる設計にしています。
SPIRAL&さくらサーバ.png

■技術的アプローチ:メモリを圧迫しないデータ処理

単に外部へ処理を委ねるだけでは、外部サーバ側でもメモリ不足やタイムアウトが発生する可能性があります。そこで以下の工夫を加えました。

フロントエンド処理のシンプル化:

フロントエンド(JS)側での複雑なループ制御を廃止し、サーバ側でスパイラルAPI(SPIRAL®で提供されるAPI)との通信から加工までを一貫して処理することで、通信のオーバーヘッドを最小限に抑えています。

ZipStream-PHPの活用:

ダウンロード処理では、全データをメモリに展開してから圧縮するのではなく、「生成しながら順次ブラウザへ送信する(ストリーミング)」方式を採用しました。
これにより、大容量のZipファイルもサーバのメモリを圧迫せずに安定して生成できます。

結果として、SPIRAL®の堅牢さを活かしつつ、数十万件のデータを淀みなく処理できるパワフルなバックエンドを実現しました。

■まとめ

  • ・SPIRAL®の30秒制限により、大量CSV処理ではタイムアウトが課題になります

  • ・外部サーバへ処理をオフロードすることで、負荷の高い処理を安定化できます

  • ・ZipStream-PHPのストリーミング出力により、メモリ消費を抑えられます

次回は「境界線の守り方 ―― JWT認証とセッション管理で実現する防衛術」をお届けします。