mkdir()は正しく機能しています。この質問は、エラーのキャッチに関するものです。ディレクトリが存在するときにこれを印刷する代わりに、カスタムログにメッセージを書き込んでもらいたいだけです。この例外を作成するにはどうすればよいですか。
警告:mkdir()[function.mkdir]:ファイルが存在します
mkdir()は正しく機能しています。この質問は、エラーのキャッチに関するものです。ディレクトリが存在するときにこれを印刷する代わりに、カスタムログにメッセージを書き込んでもらいたいだけです。この例外を作成するにはどうすればよいですか。
警告:mkdir()[function.mkdir]:ファイルが存在します
カスタムログにメッセージを書き込んでもらいたいだけです。
解決策はとても簡単です。PHPにはすでにすべてが揃っています。
ini_set('display_errors',0);
ini_set('log_errors',1);
ini_set('error_log','/path/to/custom.log');
またはphp.iniまたは.htaccessの同じ設定
考えられる各エラーを手動で書き込むよりも良いと思います
このエラーをログに記録したくない場合は(エラーではなく、アプリケーションロジックの一部である可能性があるため)、最初にフォルダーの存在を確認できます。
if (!file_exists($folder)) mkdir($folder);
else {/*take some appropriate action*/}
エラーメッセージの表示を停止するには、設定を使用してエラーメッセージをグローバルに(構成または実行時に)抑制するかdisplay_errors
、関数呼び出しの前に-文字を付けてケースバイケースで表示し@
ます。(例@mkdir('...')
)。
error_get_last
その後、いつmkdir
返品されるかを確認できますfalse
。
エラーロギングには、グローバルルールが適用されます。を使用して手動でエラーをログに記録できますerror_log
。
詳細については、エラー処理のマニュアルセクションを参照してください。
編集:
コメントで示唆されているように、カスタムエラーハンドラーも可能であり、おそらくより堅牢ですが(実装によって異なります)、確かにより洗練されたソリューションです。
function err_handler($errno, $errstr) {
// Ignore or log error here
}
set_error_handler('err_handler');
このように、明示的にエコーしない限り、エラーメッセージは表示されません。ただし、カスタムエラーハンドラを使用すると、error_get_last
が返されることに注意してくださいNULL
。
次のようなクラスを使用して、任意のシステムコール関数を書き直すことができます。
file: system.php
namespace abc;
class System {
const CAN_NOT_MAKE_DIRECTORY = 1;
static public function makeDirectory($path) {
$cmd = "mkdir " . $path;
$output = \shell_exec($cmd . " 2>&1"); // system call
if ($output != "") {
throw new \Exception($output, System::CAN_NOT_MAKE_DIRECTORY);
}
return(\TRUE);
}
}
次に、メソッドを呼び出して例外をインターセプトできます。
file: index.php
namespace abc;
require 'system.php';
try {
System::makeDirectory($directoryName);
} catch (\Exception $e) {
throw new \Exception($e->getMessage(), System::CAN_NOT_MAKE_DIRECTORY);
}
これで、すべてのシステムエラーをtry {...} catch(...) {...} finally {...}
通常どおりに処理できます。