1

CF サーバーで、アプリがかなり遅くなり始めていることに気付きました。私はこれの多くを、実際にキャッシュする必要があるのに、いくつかのものをキャッシュしないことに起因していると考えています。

このオブジェクトがアプリケーション スコープ内にあり、ページが読み込まれるたびに作成されないことを確認したいと思います。

<cfset application.components.blog = createObject('component','sharedcomponents.cfc.blog').init()>

オブジェクトが Application スコープ内に存在するかどうか、およびそれが手放されているかどうかを確認する最良の方法は何でしょうか。また、ファイルが更新されている場合、アプリ全体が更新されるように変更を検出する方法は?

どんな提案でも大歓迎です。

4

2 に答える 2

6

そのコードがどこにあるか、どのように/いつ実行されるかは言わないので、自信を持って質問に答えることは不可能です.

Application.cfc の onApplicationStart() にある場合は、アプリケーションの起動時にのみ実行されます。

ただし、ファイル内にある場合は、呼び出されないようにするための措置を講じない限り、そのファイルが呼び出されるたびに再実行されます。例: 条件を付けます:

<cfif not (structKeyExists(application, "components") and structKeyExists(application.components, "blog"))>
    <cfset application.components.blog = createObject('component','sharedcomponents.cfc.blog').init()>
</cfif>

変数の割り当てにより、ファイルが再実行された場合にCFが再実行しないことを自動的に認識するアプリケーションスコープに何かが設定されるため、魔法が発生するかどうか疑問に思われるようです。いいえ、CF は指示されたことを実行するだけです。つまり、そのコードを実行するように指示すると、CF は実行されます。変数が割り当てられているスコープに関係なく。

ファイルが更新されたかどうかの検出について質問し、それに応じてアプリケーション全体を再起動します。これらのファイルはどのように更新されていますか? それはアクティブな展開プロセスの一部であると思います(例:それらを展開するために何かをします)。この場合、アプリケーションの再起動が必要な時期を知るのに最適な立場にいるのではないでしょうか? 1 つには、すべてのコード変更がアプリケーションの再起動を保証するわけではないので、自動的に再起動する必要はないのではないでしょうか?

applicationStop()アプリを再起動する必要がある場合に実行するスクリプトが必要です。onRequestStart()URL パラメーターをチェックして、それが渡された場合に呼び出す人もいますapplicationStop()が、個人的にはそれを行う場所は間違っていると思います。ほとんどすべてのリクエストでは、その条件は無関係であるため、100 万分の 1 の機会に実際に関連するすべてのリクエストをチェックする意味はありません。私はそれを行うための別のスクリプトを用意することを好みます。これは必要に応じて呼び出されます。

于 2012-07-11T06:09:53.693 に答える
2

cfm を作成して実行すると、アプリケーション スコープをダンプしてその内容を確認できます。

dumpApplication.cfm:

<cfdump var="#application#">

または、アプリケーションのスコープが巨大か何かである場合は、具体的にターゲットにすることができます。

<cfdump var="#application.components.blog#">

では、その cfset はどこで実行されているのでしょうか? OnApplicationStart メソッドの Application.cfc で実行されている場合は、アプリケーションが最初に起動したときに一度だけ実行され、その後キャッシュされます。常にどこかに設定している場合、それは何度も何度も発生します。次のように変更できます。

<cfif NOT structKeyExists(application.components,"blog")>
  <cflock scope="application" type="exclusive" timeout="10">
    <cfset application.components.blog ="#createObject('component','sharedcomponents.cfc.blog').init()#">
  </cflock>
</cfif>

シングルスレッドであるため、OnApplicationStart で cflock する必要はありません。

編集済み:CFPARAMに関するコメント付きのアドバイスに従って

于 2012-07-11T06:10:38.783 に答える