is_readable() returns 假而 require_once returns 真

is_readable() returns false while require_once returns true

每当我在我的主机在 VM 上共享的文件上使用函数 is_readable 时,我都会得到 false,预期结果是 true。

我正在为现有项目设置本地开发环境。我不想使用其他功能,因为它是一个复杂的遗留系统,我担心我会隐藏其他潜在的问题,我会在以后的开发中偶然发现。

VM 是使用 vagrant 和 virtualbox 设置的。 OS 是一台装有 Zend Server 的 Windows Server 2008 机器,在主机上共享 PHP 5.3 托管代码,即 Mac。

共享文件夹创建如下:

vmConfig.vm.synced_folder "/path/to/shared/folder/cms", '/cms', mount_options: ["dmode=775,fmode=664,type=smb"], owner: 'wcmadmin', group: 'wcmadmin'

一段代码试图查看文件是否可读。 is_readable returns 错误。我通过命令行与用户 wcmadminAdministrator 运行 脚本,我得到了相同的结果。

function smarty_core_assemble_plugin_filepath($params, &$smarty)
{
    [...]
    // try relative to cwd (or absolute)
    if (is_readable($_plugin_filepath)) {
        $_return = $_plugin_filepath;
        break;
    }
    [...]

我做了一个测试脚本来进一步挖掘:

echo 'is_readable: ';
var_export(is_readable('C:\cms\path\to\file\file.php'));
echo "\n";
echo 'require_once: ';
var_export(require_once('C:\cms\path\to\file\file.php'));

我得到以下结果:

is_readable: false
require_once: true

在文件 returns 上正确使用 file_get_contents 内容。

使用cygwin,文件权限如下:

$ ls -al C:\cms\path\to\file\file.php
-rw-r--r-- 1 wcmadmin None 1498 Apr 18 07:22 C:\cms\path\to\file\file.php

为了解决这个问题,文件路径已经更改。虽然它们可能存在一些差异,但在实际测试中它们会正确解决。

这是 virtual box 中的一个错误,从 5.0.18 版本开始仍然存在。

参见: https://www.virtualbox.org/ticket/11675