使用php is_dir('〜/ tmp')可以在一台机器上运行,但不能在另一台机器上运行.为什么?

mer*_*ial 2 php apache zend-server-ce

我试图运行以下代码:

is_dir('~/tmp');
Run Code Online (Sandbox Code Playgroud)

在共享的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
Run Code Online (Sandbox Code Playgroud)

所以我认为我错过了什么,但是什么?

[编辑...]更多信息......

在我的本地运行以下

get_current_user()
Run Code Online (Sandbox Code Playgroud)

给我'用户名',这是我要验证的〜/ tmp目录的正确用户,但是

shell_exec('whoami')
Run Code Online (Sandbox Code Playgroud)

给了我'守护进程'.所以我想我知道我的问题来自哪里.现在我只需要弄清楚是否/如何更改在本地运行Web服务器的用户.

Tro*_*ott 5

您是否希望~扩展到您的主目录?我不愿意依赖PHP内部.(刚刚在我的Mac上测试过,它没有扩展.)

如果可能,尝试更改~/tmp为完整路径名称(例如,类似的东西/Users/meriial/tmp).

更新:另外,您也可以替换~使用$_ENV['HOME'],如下所示:

is_dir($_ENV['HOME'] . '/tmp');
Run Code Online (Sandbox Code Playgroud)

理想情况下,您首先检查array_key_exists('HOME',$_ENV)返回TRUE并采取一些适当的操作(如使用系统临时目录),如果没有.

就这一点而言,正如@xmarcos指出的那样,无论使用sys_get_temp_dir()和,你都可以使用系统临时目录tempnam().这可能是最便携的,因此是您的最佳选择.我认为你也可以通过这种方式创建原子临时文件,因此它可能更安全,更不容易出现竞争条件.