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

给我“用户名”,这是我要验证 ~/tmp 目录的正确用户,但是

shell_exec('whoami')

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

4

3 回答 3

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()and ,您都可以只使用系统临时目录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 回答