使用PHP is_dir('~/tmp')在一台机器上工作,但在另一台机器上不起作用.为什么


using php is_dir('~/tmp') works on one machine, but not on another. Why?

我试图运行以下代码:

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')

给我'daemon'。所以我想我知道我的问题从哪里来了。现在我只需要弄清楚我是否/如何改变在我的本地运行web服务器的用户。

您希望~扩展到您的主目录吗?我不太愿意在PHP中依赖它。(刚刚在我的Mac上测试了一下,它无法展开。)

如果可能,尝试将~/tmp更改为完整路径名(例如,/Users/meriial/tmp)。

UPDATE:或者,您可以将~替换为$_ENV['HOME'],如下所示:

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

理想情况下,您应该先检查array_key_exists('HOME',$_ENV)是否返回TRUE,如果没有,则采取一些适当的措施(如使用系统临时目录)。

对于这个问题,正如@xmarcos所指出的,您可以只使用系统临时目录,而不用使用sys_get_temp_dir()tempnam()。这可能是最便携的,因此是您的最佳选择。我认为您也可以用这种方式创建原子临时文件,因此它可能更安全,更不容易出现竞争条件。

您确定在用户目录中存在目录吗?

进入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'

对于所有虚拟路径,首先尝试展开它们。做的事:

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

然后看看会发生什么,
然后尝试opendir(),看看它得到什么错误。