5

この質問は何度も聞かれましたが、私が見つけた答えはどれも私を助けませんでした。

php file_exists()を機能させようとしています。それが機能する唯一のシナリオは、php-fileがファイルと同じディレクトリにあり、file_exist()を使用し、ファイル名のみを使用する場合です(つまり、パスを除く)。ただし、結果として生じる動作ではありません。以下を参照してください。

ソム情報:

  • safe_mode = off
  • ディレクトリ28のシンボリックリンクはありません
  • ファイル名に空白がありません
  • / var / www / html / smic / upload / 28 /内のすべてのディレクトリには、権限としてapache:apache777があります。
  • php5.3を使用する

PHP:

echo getcwd()
clearstatcache();
$file = 'file:///var/www/html/smic/upload/28/ul.txt';
//Also tried like this
//$file = '/var/www/html/smic/upload/28/ul.txt';

if(file_exists($file)){
    echo $file." exists";
}

getcwd()は/ var / www / html / smic / modules / core/ticketを出力します

php-scriptとチェックするファイルの権限はapache:apache777です。

ディレクトリ構造に関する詳細:

[root@localhost 28]# pwd
/var/www/html/smic/upload/28

[root@localhost 28]# ls -l ul.txt
-rw-r--r--. 1 apache apache 2 Feb  9 10:50 ul.txt

[root@localhost 28]# chmod 777 ul.txt

[root@localhost 28]# ls -l ul.txt
-rwxrwxrwx. 1 apache apache 2 Feb  9 10:50 ul.txt

ファイルのアクセス許可を変更しても、動作は変わりませんでした。ディレクトリ/28にはdrwxr-xr-xがあります。apacheユーザーおよびapacheグループの場合

テストのために、実際のphp-scriptも/ 28に移動し、apache:apache777rigthsを指定しました。$fileを"ul.txt"に変更しました(つまり、$ file ='ul.txt';)。これで、ul.txtファイルが見つかりました。

getcwd()は、/ var / www / html / smic / upload/28を出力します

別のテストとして、「ticket」ディレクトリ内のパスを除く別のファイルを見つけようとしましたが、ファイルが認識されませんでした。

私は頭を叩いています...

アドバイスをいただければ幸いです。

4

8 に答える 8

9

phpがfile_existsを評価するには、ファイルの許可だけでは不十分です。phpを実行するプロセスには、そのファイルに到達するためにそのファイルのすべての親ディレクトリをトラバースする権限も必要です。

それらを1つずつチェックし、phpが(rx)を読み取って入力できることを確認します

ls -ald /var
ls -ald /var/www
ls -ald /var/www/html
ls -ald /var/www/html/smic
ls -ald /var/www/html/smic/upload
ls -ald /var/www/html/smic/upload/28
于 2012-02-09T13:53:13.853 に答える
2

ここでストローを握りしめます...

su --apache(またはWebサーバーが実行しているユーザー..apache2、www-dataなど)を試してから、ディレクトリをトラバースします。

.htaccessファイルがノックアウトしたり、Apache構成に他の制限がありますか?

于 2012-02-09T13:54:00.377 に答える
2

やあ、これはかなり凝灰岩だった。Webから何かをコピーして、最初に通常のテキストエディタに貼り付けて、すべての奇妙な/隠された文字を削除してから、もう一度コピーして開発ツールに貼り付けるときは、常に確認します。

コメントのどこかで述べたように、私はpwdを実行し、仮想サーバーからosxにテキストをコピーしました。しかし、私が考えていなかった/知らなかったのは、Linuxサーバーからそれを行うと、奇妙な/隠された文字が続く可能性があるということでした。したがって、texteditorを介してすべてをコピーすることを確認しませんでした。

かなり前にWebからコピーしたときに問題が発生したことを思い出し、これも同様の問題である可能性があると考えました。スクリプトを16進エディターで開きました。そして、私は何を見つけましたか...'/ var'はこれを軽く見ました:'/var'。奇妙な文字を削除すると、問題が修正されました。

上記のコメントありがとうございます。それらが他の誰かを助けることができることを願っています、そしておそらくそれはそれを知らなくても私を助けました(私はあなたのコメントに基づいて多くのことをしたので)。

于 2012-02-09T15:49:53.117 に答える
1

フォルダへのアクセス権はどうですか?パス$file = 'file:///var/www/html/smic/upload/28/ul.txt';が正しくありません。phpスクリプトをフォルダにコピーしてアップロードしてみてくださいfile='28/ul.txt';。フォルダは読み取り可能である必要があります。

于 2012-02-09T13:56:16.400 に答える
1

$ file='/upload/28/ul.txt';を使用してファイルを開こうとします。

于 2012-02-09T14:09:00.537 に答える
0

php.netのマニュアルから、「失敗すると、E_WARNINGが発行されます。」エラー報告が警告を表示するレベルに設定されていることを確認して、試してください。

また、「この関数は、セーフモードの制限のためにアクセスできないファイルに対してFALSEを返します。ただし、これらのファイルがsafe_mode_include_dirにある場合は、これらのファイルを含めることができます。」あなたはPHPセーフモードで実行していませんか?phpinfo()が教えてくれるはずです。

于 2012-02-09T13:47:50.053 に答える
0

PHPファイルはどこにありますか?「html」フォルダ内の場合は、次のような相対パスを使用します$file = "smic/upload/28/ul.txt";

于 2012-02-09T13:53:21.200 に答える
0

おそらく、ファイルの名前に空白記号があります。それは重要です。

于 2014-09-22T13:45:18.813 に答える