最近、プロジェクトの1つで興味深い問題が発生しました。非常に長い間、REST APIのデータはわずかながらも提供されていました。 何が起こったのか、そしてその理由-私はあなたに話をする。
データベースからの情報が管理パネルに表示され、ページあたり20エントリ+リンクが強化されました。 50(!!!)秒かかりました。 基地で何が起こっているかを見ないのは罪だった。 5万件のレコード、フィルタリングのための約6〜7の結合、および6〜7の
積極的な読み込み要求では、このようなブレーキが発生する可能性があるとは思いませんでした。
そのため、すべてのリクエストで約0.18秒かかりましたが、これはまったく問題ありません。
さて、さらに掘り下げます。 そして、モデルのシリアル化にすべての時間が費やされていることに気付いたとき、私のinりは際限がありませんでした。 これはどうですか?
class OrderController { public function index(Request $request, OrderFilter $filter) {
ディスパッチャーは、クライアントの要求に応じてコントローラーの結果の変換を開始します。 もちろん、彼は
Accept: application/json
というタイトルを見て、汚い仕事を始めました。 そして、熱が始まりました。
各モデル、各接続、そして
多くのメソッドが再帰的に呼び出されます-マジックゲッター、ミューテーター、カースト。
同じ邪悪なコード public function attributesToArray() { $attributes = $this->getArrayableAttributes();
もちろん、ミューテーターは非常に便利です。 モデル/関係のさまざまなデータにアクセスできるのはクールで美しいことですが
、ドキュメントページでは、開発者が書くのが面倒で、その使用がパフォーマンスに大きな影響(大きな影響を与えたい)であると書いています。
そしてここで、列車がすでに非常に高速化されており、datamapper / querybuilderですべてをやり直す時間がないという理解があります。 ActiveRecordのトラフにとどまりました。 私はこの魔法が好きですが、あなたはそれを悪用することはできません。
何も壊さないようにするために、私はRedisに連絡する必要がありました。Redisにはすべてのデータが含まれており、モデルの更新後に定期的に更新されます。 しかし、そこにありました! データ量が非常に大きいため、Redisが落ちました(私には罪があります。おそらくそれを引き締める必要がありました)。 標準の64MBは良くないので、gzcompressを介してデータを渡す必要がありました。 また、別のインスタンスが開始されたため、Redisに負荷がかからないという確信がありました。
これですべてが機能し、すべてが正常になりました。 データは0.5秒未満で与えられ、誰もが幸せです。 しかし、私は座り、「スピードとシンプルさを備えたBribes Laravelを考えますが、次のプロジェクトは間違いなくこれらのActiveRecordなしです。」
それが物語の終わりであり、よく聞いた人なら誰でもボトネコフは逃げます。