1

最近別のサーバーに移行したSocialEnginePHPアプリケーションを実行しています。

そしてその時点から-問題が発生します:

SocialEngineのコアは、大文字と小文字を区別しないパスにファイルを含めようとしますが、パスは存在しないように見えます(ただし、正しい場合は、ファイルは存在します)

PHP / Apacheの動作を改善し、他の場合にも検索するにはどうすればよいですか?

たとえば、SocialEngineはを検索し/application/modules/Menuitems.php、正しいパスは/application/modules/Menu**I**tems.phpです。

要約すると、大文字と小文字を区別しないパスが必要です。

4

3 に答える 3

0

上記のコメントで既に説明したように (気分を害した場合は申し訳ありませんが、そのように意図されたものではありません) 、与えられた回答には根本的な問題があります:

アプリケーションが使用しているファイル名が無効です。それらは Windows システム上にはありませんでしたが、Linux 上にあります。

これは解決するのが難しいです。しかし、私は次の考えを持っていました: PHPStreamWrapper .

ストリーム ラッパーは、ファイル名と基になるコードの間で相互運用します。includeやなど、同じインターフェイスで URL とファイルにアクセスできますfile_get_contents

通常、ストリームのタイプ (および独自のラッパーを登録できるストリーム) は、 のようなもので始まりますprotocol://

プロトコルが指定されていない場合は、 ですfile://

したがって、プロトコルに登録する独自のストリームラッパーを作成することができます。file://その後、大文字と小文字の区別の問題に対処できます。

このマニュアルには、再利用する可能性があるストリーム ラッパー クラスの定義済みの定義が記載されています。

他の人は、大文字と小文字の区別の問題を解決する方法のヒントとコードを提供しています。通常、ケースでは読み取り操作のみを処理する必要があります。

于 2011-10-31T11:48:34.443 に答える
0

このコードを試してみてください。TODO ステップを 2 つだけ残しました (申し訳ありません! 時間がありません.. 大きすぎてコメントにすることはできません)。完了することができます。このコードを index.php ファイルの先頭に置くと、インクルードが失敗するたびに正しいファイル名が呼び出されます。

ただし、php が返す警告からファイル名を取得するため、個別にテストする必要があります。私のphpバージョンは、括弧内のファイル名を返しますが、あなたのものはわかりません。コードをテストして、その動作を確認します。

<?PHP
/*****************put this at the very top*********************************/
 $flag=2; 
 function correctFileName($incorrectFileName)
 {
    //directory and file to look at/for
    $dirToLookAt = dirname($incorrectFileName);
    $fileToLookFor = basename($incorrectFileName);

    //get all .php files
    $files = array(); $directory = opendir($dirToLookAt ); 
    while($item = readdir($directory)) 
        if(is_string(strstr($item,'.php')))
            $files[] = $item; 

    //to do
    /*
    loop through the $files array and to 
    a case insensitive search for $incorrectFileName

    if you find one then rename the file you found to $incorrectFileName

    then break the loop
    */

 }
//error handler function
function customError($errno, $errstr)
  {
        global $flag;
        //find the file name
        if($errno==2 and (($flag%2)==0))
        {
              //this will allow to enter only once per time
              $flag++;
              //get the file name
             $start = strpos($errstr, '(') +1;//7
             $length = strpos($errstr, ')') -  $start ;//10
             correctFileName(substr($errstr, $start  ,$length));
        }
  }

//set error handler
set_error_handler("customError");
/*****************************************************************/

//trigger error
include 'c:\www\home\122221.php'; 
?>

また、このコードは、ディレクトリの part-name が正しいことを前提としています! それ以外の場合は、それも管理する必要があります。

于 2011-10-31T00:38:27.560 に答える