こんにちは!
ナビゲータのEVEです。
外部キーの設定により、検索の速度が速くなったことを確認したいと考えています。その対象のシステムとして、Knowlgeシステムで確認しようとしたのですが、動かすまでが思った以上に大変のようです。
[関数認識できない]
今まで、管理システムを動かすことだけを想定しシステムを改修していたため、他のシステムを先日まで動かしていませんでした。動かす前までは、すぐに何とかなるだろうと思っていたのですがうまくいきません。
その最大の要因は、違う階層のアプリケーションから関数を呼び出すとエラーになる。ようは、ルートディレクトリから2階層目のアプリケーションでは動作は正常に動くのだが、3階層目のアプリケーションから呼び出すとエラーになります。エラーとは、定義した関数またはクラスが認識できないらしいのです。
調べていくと、今回から関数内で、関数を呼びだすと言うことを実施しています。今までは、関数を含めて、イベントにより起動するアプリケーションで使用する関数は、呼び出し元ですべて定義するという仕様だったのですが、オブジェクト指向言語にすることによりそれをやめました。それにより、各アプリケーションでは、関数またはクラスを使用するアプリケーション側でrequireからrequire_onceに変更しています。
requireでは、1イベントで起動する関数、クラスまたはアプリケーション内で、重複する関数またはクラスを定義するとエラーになります。但し、require_onceを使用すると、どこの関数、クラスまたはプリケーションで同じものを定義してもエラーになりません。
仕様の違いについてChatGPTに聞いてみました。
■require
requireは、指定されたファイルを読み込みます。
ファイルが存在しない場合や読み込みに失敗した場合、致命的なエラー(Fatal Error)が発生し、スクリプトの実行が停止します。
同じファイルが複数回requireで読み込まれた場合、その都度再度読み込まれます。これにより同じコードが複数回実行される可能性があります。
■require_once
require_onceも指定されたファイルを読み込みますが、そのファイルがまだ読み込まれていない場合にのみ、一度だけ読み込みます。
ファイルが存在しない場合や読み込みに失敗した場合、致命的なエラーが発生し、スクリプトの実行が停止します。
同じファイルが複数回require_onceで読み込まれた場合、最初の一回のみが実際に読み込まれ、それ以降は無視されます。
どちらを使用するかは状況によります。通常、同じコードが複数回実行されて問題が生じる場合はrequire_onceを使用し、複数回実行されない場合はrequireを使用します。
[あとがき]
以上のような状況のため、require_onceで定義するアドレスを相対アドレスから絶対アドレスに変更しました。但し、すべてのものを変更するのは工数がかかるので、今回は、関数、クラスだけを絶対アドレスに変更しています。
以上の対応により、require_onceによるエラーがなくなったのと同時に、その他のエラーも減っています。但し、その他にも、いろいろとありました。しかし、今日、一通りのバグをつぶしたので、明日から、Knowlegeシステムでの検証作業に入ることができそうです。
バージョンアップって大変ですね・・・。早くやりたいという気持とは真逆にどんどん遅れていきます。
システム開発に集中できる環境が整えばいいのですが・・・?
では、また!
【このカテゴリーの最新記事】