3

アプリケーション ベースのさまざまな部分をすべて拡張した一連の Coldfusion アプリケーションがあります。少しのコードを提供し、私たちが抱えている問題を説明し、誰かがこれをトラブルシューティングする最善の方法を明らかにできるかどうかを確認します:

app.cfc の「OnRequestStart」には、ユーザーを開始する次の行があります。

if(!structKeyExists(SESSION, 'user'))
SESSION.user = CreateObject("component","cfcs.ds_user");

次に、ds_user.cfc で次のように呼び出します。

component extends="cas.cas_user" displayname="basic_user"{

アプリケーションとそのすべての部分が正常に動作します。しかし、しばらくするとランダムに見える方法でアプリケーションがクラッシュし、ColdFusion サービスを再起動して再度実行する必要があります。私が得るエラーは次のとおりです。

Could not find the ColdFusion component or interface cas.cas_user.

そのため、何らかの理由でしばらくすると、私のアプリケーションは親コンポーネントへのパスが見つからないと判断します。その cfc のマッピングは、上部の application.cfc にあります。

THIS.mappings["/cas"] = "#ReplaceNoCase(currpath,ListToArray(THIS.name,'_')[1],'cas30')#assets\cfcs\";

アプリケーションはランダムな時間設計どおりに完全に動作しますが、親コンポーネントを見つけることができず、サーバーで ColdFusion サービスを再起動するまで親コンポーネントを見つけることができません。

これはどういうわけかメモリリークか何かだと思いますが、問題のトラブルシューティングをどこから始めればよいかわかりません。同じ方法で拡張され、正常に動作し、クラッシュすることのないアプリケーションが 6 つほどありますが、これはクラッシュします。

編集:マッピングをより明確にするために。当社のアプリケーションは次の場所にあります。

  • root.com/app1
  • root.com/app2

上記の方法を使用して、app1 で app2 から CFC を取得するためのマッピングを作成しました。この方法は、奇妙なことだと思いますが、すべてのアプリケーションで機能します。

編集:しばらく表示される正しいマッピングは次のとおりです。

/cfcs - D:\www\app1\assets\cfcs
/templates - D:\www\app1\assets\templates
/cas - D:\www\app2\assets\cfcs
/common - D:\www\app3\assets\common_elements

ただし、アプリケーションが「クラッシュ モード」になると、ダンプはマッピングが次のようになっていることを示します。

/cfcs - D:\www\app1\assets\cfcs
/templates - D:\www\app1\assets\templates
/cas - D:\www\app1\assets\cfcs
/common - D:\www\app1\assets\common_elements

Application.cfc の先頭でこれらのマッピングがどのように定義されているかを次に示します。

currpath = GetDirectoryFromPath(GetCurrentTemplatePath());
THIS.mappings["/templates"] = "#currpath#assets\templates";
THIS.mappings["/cfcs"] = "#currpath#assets\cfcs";
THIS.mappings["/common"] = "#ReplaceNoCase(currpath,ListToArray(THIS.name,'_')[1],'gum')#assets\common_elements\";
THIS.mappings["/cas"] = "#ReplaceNoCase(currpath,ListToArray(THIS.name,'_')[1],'cas30')#assets\cfcs\";

THIS.name = digisign_CAAAFACBDFFE または

name_var = (arrayLen(meta_array) >= 2) ? meta_array[arrayLen(meta_array) - 1] & '_' : 'root_';
THIS.name = name_var & right(reReplace(hash(getCurrentTemplatePath()), "[^a-zA-Z]","","all"), 64 - len(name_var));

どこで失敗する可能性がありますか。replace ステートメントが機能していないように見えるため、マッピングを設定するときに、パスの appname が app1 から app2 に変更されていません。これは、現在取り組んでいる次のエラーに関連している可能性はあります か? ただし、この問題は CF10 以前に発生していたと考えられます。この問題はありますが、最近発生したばかりです。問題のこのアプリケーションは、長い間このようにクラッシュしています。

編集: 1.「クラッシュ」と言うとき、アプリケーションが状態になり、Coldfusion を再起動するまでマッピングが正しく宣言されないことを意味していると思います。私たちのコードのエラーがクラッシュの原因だと思います。2.これは通常、SESSION.user 変数のこのチェックを行うときに問題が発生する場所です。同様に発生したと思いますが、データソースが見つからないと判断しました。これはまれです。3. 最初はイエスと思ったが、実際にはノーで、それほど多くはなかった. アプリ全体で、共通のマッピングにいくつかの名前があります。cas common cfcs templates等しかしD:\www\cas、アプリケーションdomain.com/cas30が配置されている場所です。ただし、そのアプリのレガシー バージョンは にありdomain.com/casます。マッピングは次の/cas場所に移動する必要がありますD:\www\cas30\assets\cfcsそして動作します。4.開発セットアップがあり、これは決して起こりません。(これは負荷の問題であると想定したため、開発環境では発生しません)。ただし、開発環境は次のように構成されています。

D:\www\deva\app1
D:\www\deva\app2
D:\www\devb\app1
D:\www\devb\app2
  1. 私たちがしていること (これはばかげていると思います) は、現在のアプリと同じディレクトリにないファイルがあることです。このファイルは、application_base.cfc と呼ばれます。他のアプリケーションのすべての application.cfc は、この application_base.cfc から拡張されています。これらは、他の Application.cfc ファイルから拡張されたものではありません。(意味があることを願っています) application_base には、init、onrequeststart、および onerror があります。以下に App.cfc を投稿します。また、一部の設定は、アプリケーション ベース (環境要素を決定するため) とアプリケーション レベルの両方で XML ファイルから読み取られます。ただし、それが問題の原因である可能性があると考えたため、以前の開発者はアプリケーション レベルで xml ファイルを削除しました。6.はい。app.cfc と appbase.cfc を投稿して、両方を表示できるようにします。
  2. 再初期化とは、onapplicationstart などを呼び出すことを意味します。私が知っていることではありません。
  3. 私たちが持っているいくつかのアプリケーションは次のとおりです。

    currpath = GetDirectoryFromPath(GetCurrentTemplatePath()); app_path = ListToArray(currpath,'\'); THIS.name = app_path[ArrayLen(app_path)];

これは次のことを行います:

meta_array = ListToArray(GetMetaData(this).name,'.');
name_var = (arrayLen(meta_array) >= 2) ? meta_array[arrayLen(meta_array) - 1] & '_' : 'root_';
THIS.name = name_var & right(reReplace(hash(getCurrentTemplatePath()), "[^a-zA-Z]","","all"), 64 - len(name_var));

他のいくつかもこれを行います。それが 2 人の異なる開発者によるものかどうかは定かではありませんが、その通りです。

アプリが失敗すると、coldfusion を再起動するまで失敗します。アプリはdomain.com/appページからのログインを必要とするため (リクエストごとに変更できないとは言いません)、リクエストの場所は常に失敗した場所と同じです。

こんなに複雑じゃなかったらいいのに。私は最近、現在の CMS をこのクレイジーなものから引き離しましたが、7 つまたは 8 つのアプリケーションが互いに絡み合っており、さまざまなパスを持つ開発/本番環境で動作するように設計されており、削除できるものを判断するのが難しい場合があります。そしてできないこと。

エラーハンドラーからアプリケーション名をダンプしようとしたと思いましたが、渡されない限り機能しないと思いました。マッピングを通過したので、「クラッシュ」する必要があるようにdigisign変更されていないことがわかりました。cas30モード。

すべての動的マッピングは、元の開発者が何も変更せずに同じ app.cfc テンプレートを使用できるようにするためのものだったと思います。彼はコメントなしでがらくたのようなことをするのが好きだったvar a = (b) ? (a-c) ? a-f+b : (a+b) ? d : d; : a; h;ので、デバッグどころかいまいましいコードを読むのが難しいこともありました。

編集

この問題とstackoverflow.com/q/14300915/1229594の問題が関連しているように感じます。こちらにも詳細を投稿しました: forums.adobe.com/message/5022377#5022377

4

3 に答える 3

1

まず最初に、なぜ でセッション指向のものを初期化するのonREQUESTStart()ですか? でそれを開始した場合onSessionStart()、リクエストごとにその存在を確認する必要はありません。これは、些細なことですが、不必要なオーバーヘッドであり、単に間違った場所に間違ったコードがあるだけです。

第二に...あなたはあなたのエラーを引用しますが、それがどこで起こっているのかは言いません. onRequestStart() のその行で発生していますか?

もしそうなら、私にお願いします: それを try/catch で囲み、その中に の値と の値をthis.mappingsログ ファイルに書き込みますcurrPath。その変数の値はどのように導出されますか?

そうは言っても、そのsession.user初期化コードを適切な場所に配置すれば、問題は解決すると思います。

注: この問題は、ほぼ確実にメモリ リーク (つまり、ColdFusion のせい) ではなく、コードが予期していなかった動作をしている (だから... エラー...あなたのせい ;-) と考えてください。これにより、問題を見つけることに集中することができます。私はあなたに挑戦していませんが、「私のコードのどこが間違っているのか」は、「おそらく何か他のものだ」よりも優れたアプローチです. そして、正しい可能性が高くなります;-)

ああ...そして、CFのどのバージョンを使用していますか?

于 2013-01-11T22:02:35.390 に答える
0

これを見て、それがあなたの問題に関連しているかどうかを確認してください。 https://github.com/Mach-II/Mach-II-Framework/wiki/Application-Specific-Mapping-Workaround

そうでない場合は、同じ CF サーバー上の同じ名前のアプリケーション固有のマッピングと関係がある可能性があり、これらのアプリケーションは異なるアプリケーション名を持っています。

于 2013-01-11T22:03:30.897 に答える
0

いくつかの質問:

  1. クラッシュの原因はコード エラーだと思いますか、それともクラッシュが原因でコード エラーが発生していると思いますか?

  2. これらのパス エラーが表示されるコード行は、セッション ユーザーのインスタンス化だけですか?

  3. アプリ内に、マッピング名と同じ名前の物理ディレクトリがありますか?

  4. これは他の環境 (開発/テスト) でも発生しますか? これはクラスター化された環境ですか?

  5. この同じ Application.cfc を拡張する Application.cfc ファイルが複数ありますか?

  6. Application.cfc メソッドを直接呼び出しているコードはありますか?

  7. アプリケーションの再初期化を引き起こすコードはありますか?

  8. meta_arrayアプリケーション名の派生に使用されている を決定しているのは何ですか?

いくつかの観察:

アプリケーション名が変更されているか、他のアプリケーションが同じ名前で上書きしているようです。ここでは非常に多くの動的な命名が行われているため、これは大げさではないようです。アプリケーション名から始めて、現在のテンプレートの物理的な場所に依存します。これは、アプリがリクエストをルーティングする方法に応じて、リクエストごとに異なる場合があります。現在のテンプレートが異なる場合、アプリケーション名が異なり、他のアプリ固有のマッピングが変更されます。これにより、アプリ名を使用してそれらのマッピングの物理的な場所を決定する他のすべてのマッピングにカスケード効果が発生します。

ここで疑問が生じます: アプリケーション名とマッピング場所の動的な評価がなぜ必要なのでしょうか? 単純化またはハードコーディングできますか? 代わりにサーバー マッピングを使用できますか? それほど複雑である必要がない場合は、必要最小限に単純化することでトラブルシューティングに役立ち、問題を完全に解決できる可能性があります。

最後に、通常の動作中のアプリケーション名が、エラーが発生しているときに参照されているアプリケーション名と同じであることを確認できますか?

  • それらが異なる場合、何かがアプリケーションを別のコンテキスト内で実行させています (手がかりについては、上記の私の最初の質問を参照してください)。アプリケーション名が突然変更されると、既存のセッションが無効になり、セッション ユーザーのインスタンス化コードの再実行が強制されます。また、ユーザー コンポーネントのパスはアプリケーション名に部分的に基づいているため、パスが正しくない可能性があります。

  • ただし、通常の操作とクラッシュ モードでアプリケーション名が同じである場合currpathは、予想とは異なる物理パスで実行されているアプリケーションの一部によって変数が影響を受けている可能性があります。残りのマッピングを決定する際に直接使用されるためcurrpath、予期しないパスが原因でコンポーネントが失われる理由を確実に説明できます。

  • これらの名前の派生には非常に多くの変数が使用されるため、通常の操作中およびクラッシュ モード中にこれらの変数をログに記録することをお勧めします。見たくなる

    GetCurrentTemplatePath()
    GetDirectoryFromPath(GetCurrentTemplatePath())
    THIS.name
    meta_array
    THIS.mappings
    

正常に動作している場合とクラッシュ/エラーが発生している場合では、これらの変数に大きな違いがあることがわかると思います。その違いが答えに近づくはずです。

于 2013-01-18T22:54:43.247 に答える