2

次のコードを実行しようとしています。

is_dir('~/tmp');

共有LAMPスタック上。正常に動作し、TRUEを返します。(そのディレクトリが存在します。)ローカルボックス(Mac OSX 10.5、Zend Server Community Edを実行)で同じコードを実行すると、FALSEが表示されます。これは、〜/ tmpが存在し、アクセス許可が777に設定されているため間違っています。

どこかにサーバーディレクティブがありません。

私はphpInfoで確認しましたが、(ローカルと本番の両方で)次のようになっています。

safe_mode           Off         Off

safe_mode_exec_dir  no value    no value

safe_mode_gid           Off         Off

safe_mode_include_dir   no value    no value

open_basedir    no value    no value

だから私は何かが足りないと思いますが、何ですか?

[編集...]いくつかの詳細情報...

私のローカルで以下を実行します

get_current_user()

'username'を取得します。これは、〜/ tmpディレクトリを確認したい正しいユーザーですが、

shell_exec('whoami')

「デーモン」をくれます。だから私は自分の問題がどこから来ているのか知っていると思います。ここで、ローカルでWebサーバーを実行しているユーザーを変更できるかどうか/どのように変更できるかを理解する必要があります。

4

3 に答える 3

5

~ホームディレクトリに展開されることを期待していますか? PHP の内部に依存するのは気が進まないでしょう。(私の Mac でテストしたところ、展開しませんでした。)

可能であれば~/tmp、フル パス名が何であれ (たとえば、 など/Users/meriial/tmp) に変更してみてください。

UPDATE : または、次のよう~に置き換えることもできます。$_ENV['HOME']

is_dir($_ENV['HOME'] . '/tmp');

array_key_exists('HOME',$_ENV)理想的には、最初にそれが返されることを確認し、返さTRUEれない場合は適切なアクション (システムの一時ディレクトリを使用するなど) を実行します。

さらに言えば、@xmarcos が指摘しているように、 and の使用に関係なく、システムの一時ディレクトリを使用できsys_get_temp_dir()ますtempnam()。これが最も移植性が高いため、最良の選択となる可能性があります。そのようにしてアトミック一時ファイルを作成することもできると思うので、より安全で競合状態になりにくいかもしれません。

于 2011-10-30T01:19:34.570 に答える
3

ディレクトリがユーザー ディレクトリ内に存在することを確認しますか?

に移動しTerminal、 と入力しcd ~/tmpます。動作しますか?

更新:sys_get_temp_dir利用可能な場合は、コード例を使用できます:

$some_log = tempnam(sys_get_temp_dir(), 'some_log');    
var_dump($some_log);
// will return '/private/var/folders/.../some_logbqzDvg'
于 2011-10-30T01:16:54.950 に答える
2

すべての仮想パスについて、最初にそれらを拡張しようとします。行う:

var_dump(realpath('~/tmp'));

次に、何が起こるかを確認して
から、それを試してopendir()、どのようなエラーが発生するかを確認します。

于 2011-10-30T04:30:08.260 に答える