我试图运行以下代码:
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()
,看看它得到什么错误。