10

どうやら、realpath非常にバグがあります。PHP 5.3.1 では、ランダムなクラッシュが発生します。5.3.0 以前では、realpathランダムに失敗して false を返します (もちろん同じ文字列の場合)。さらにrealpath、同じ文字列を 2 回以上実行すると常に失敗します (もちろん、最初は機能します)。

また、以前のバージョンの PHP では非常にバグが多く、まったく使用できません。ええと...それは一貫していないので、すでにそうです。

とにかく、どのようなオプションがありますか?自分で書き直そうかな。これは賢明ですか?

4

6 に答える 6

28

Sven Arduwie のコード ( Pekka が指摘) といくつかの変更のおかげで、(できれば) より良い実装を構築できました。

/**
 * This function is to replace PHP's extremely buggy realpath().
 * @param string The original path, can be relative etc.
 * @return string The resolved path, it might not exist.
 */
function truepath($path){
    // whether $path is unix or not
    $unipath=strlen($path)==0 || $path{0}!='/';
    // attempts to detect if path is relative in which case, add cwd
    if(strpos($path,':')===false && $unipath)
        $path=getcwd().DIRECTORY_SEPARATOR.$path;
    // resolve path parts (single dot, double dot and double delimiters)
    $path = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $path);
    $parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen');
    $absolutes = array();
    foreach ($parts as $part) {
        if ('.'  == $part) continue;
        if ('..' == $part) {
            array_pop($absolutes);
        } else {
            $absolutes[] = $part;
        }
    }
    $path=implode(DIRECTORY_SEPARATOR, $absolutes);
    // resolve any symlinks
    if(file_exists($path) && linkinfo($path)>0)$path=readlink($path);
    // put initial separator that could have been lost
    $path=!$unipath ? '/'.$path : $path;
    return $path;
}

注意: PHP の とは異なりrealpath、この関数はエラー時に false を返しません。これらの癖を解決できる限りのパスを返します。

注 2:正しく読めない人もいるようです。Truepath() は、UNC や URL を含むネットワーク リソースでは機能しません。ローカル ファイル システムでのみ機能します。

于 2010-10-29T09:04:26.173 に答える
1

これほど大規模な問題については聞いたことがありませんrealpath()(私は常に、基礎となる OS の機能をインターフェースするだけだと思っていました - いくつかのリンクに興味があるでしょう)、マニュアルページのUser Contributed Notesには、多くの代替実装があります。これは大丈夫に見えるものです。

もちろん、これらの実装がすべてのクロスプラットフォームの癖や問題に対処できるとは限りません。そのため、完全なテストを行って、ニーズに合っているかどうかを確認する必要があります。

私が見る限り、正規化されたパスを返すものはなく、相対パスのみを解決します。それが必要な場合、回避できるかどうかはわかりませんrealpath()(おそらく、(システムに依存する) コンソール コマンドを実行してフル パスを取得する以外は)。

于 2010-10-29T07:31:15.777 に答える
0

Windows 7 では、コードは正常に動作します。Linux では、生成されたパスが /home/xxx で始まる必要があるのに (私の場合) home/xxx で始まるという問題があります。つまり、ルート フォルダーを示す最初の / がありません。問題はこの関数ではなく、Linux で getcwd が返すものにあります。

于 2011-09-06T08:40:12.977 に答える