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