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

时间:2011-10-30 01:08:32

标签: php apache zend-server-ce

我正在尝试运行以下代码:

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

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

[edit ...]更多信息......

在我的本地

上运行以下内容
get_current_user()

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

shell_exec('whoami')

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

3 个答案:

答案 0 :(得分:5)

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

如果可能,请尝试将~/tmp更改为完整路径名称(例如/Users/meriial/tmp之类的内容)。

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

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

理想情况下,您首先检查array_key_exists('HOME',$_ENV)是否返回TRUE并采取一些适当的操作(如使用系统临时目录),如果不这样做的话。

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

答案 1 :(得分:2)

您确定该目录在您的用户目录中 吗?

转到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'

答案 2 :(得分:1)

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

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

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