web-dev-qa-db-ja.com

PHPからmkdirが失敗した理由を見つける方法は?

PHPのmkdir関数は、trueとfalseのみを返します。問題は、falseを返す場合です。

エラーレポートを有効にして実行している場合、画面にエラーメッセージが表示されます。 Apacheログにもエラーメッセージが表示されます。しかし、私はメッセージのテキストをつかんで、それを使って何か他のことをしたいと思います(例えば、IM経由で自分自身に送信します)。エラーテキストを取得するにはどうすればよいですか?

更新:アイマンの考えに従って、私はこれに行き着きました:

function error_handler($errno, $errstr) {
    global $last_error;
    $last_error = $errstr;
}

set_error_handler('error_handler');
if (!mkdir('/somedir'))
    echo "MKDIR failed, reason: $last_error\n";
restore_error_handler();

ただし、グローバル変数を使用しているので気に入らない。よりクリーンなソリューションのアイデアはありますか?

18
Milan Babuškov

警告を抑制する そして error_get_last() を利用することができます:

if (!@mkdir($dir)) {
    $error = error_get_last();
    echo $error['message'];
}
53
soulmerge

例外を使用できます:

次のようなコードを設定します。

function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("exception_error_handler");

そして、次のようにします。

try {
   mkdir('/somedir');
} catch(ErrorException $ex) {
   echo "Error: " . $ex->getMessage();
}

それはあなたが望むことをするはずです。

Phpエラーハンドラーを保持したい場合は、その後、catchブロックを試してください。

restore_error_handler()
16
Kazar

私は次のようなものを使用します:

if(! @mkdir('$fileLocation', 0777, $recursive = true)){
    $mkdirErrorArray = error_get_last();
    throw new Exception('cant create directory ' .$mkdirErrorArray['message'], 1);
}
3
nick fox