9

我的 Phar 脚本使用 fwrite 创建了一个新文件,它工作正常,它在 phar 之外创建新文件,与 phar 文件位于同一目录中。

但是当我使用 if(file_exists('file.php')) 时,它并没有捡起它。

但是然后包含并要求将其捡起。

有人知道这个问题吗?测试和研究了一段时间似乎无法找到解决方案。

4

6 回答 6

7

在 PHAR 的存根处,您可以使用__DIR__魔术常量来获取 PHAR 文件的文件夹。

考虑到这一点,您可以简单地使用

is_file(__DIR__ . DIRECTORY_SEPARATOR . $path);

检查 PHAR 之外的文件是否存在。

您只能从存根中执行此操作,并且仅当它是自定义存根时,而不是由 Phar::setDefaultStub() 生成的存根。如果您需要进一步检查文件,则必须以某种方式使该常量的值可用,例如全局变量、自定义非魔法常量或静态属性或其他文件然后咨询的东西。

编辑:实际上,您也可以使用dirname(Phar::running(false))从 PHAR 中的任何位置获取 PHAR 的文件夹。如果您不在 PHAR 中,该函数将返回一个空字符串,因此无论您的应用程序是作为 PHAR 执行还是直接执行,它都应该可以正常工作,例如

$pharFile = Phar::running(false);
is_file(('' === $pharFile ? '' : dirname($pharFile) . DIRECTORY_SEPARATOR) . $path)
于 2013-08-26T11:23:07.197 回答
6

我今天遇到同样的问题。经过几个小时的挖掘......我找到了答案。

你可以先试试下面的脚本吗?

if(file_exists(realpath('file.php')));

如果文件存在,那么问题是

如果只使用没有路径信息的文件名,则 php Treat 文件与 phar stub 相关。例如:

phar:///a/b/c/file.php

因此,您必须使用绝对路径来操作文件,例如:

/home/www/d/e/f/file.php

希望这有帮助。

标记

于 2013-12-03T08:44:34.717 回答
5

使用文件路径和 Phar 档案

在 PHP 中使用文件路径和 Phar 归档文件可能会很棘手。Phar 文件中的 PHP 代码会将相对路径视为相对于 Phar 存档,而不是相对于当前工作目录。这是一个简短的示例:

假设您有以下文件:

phar/index.php
test.php
my.phar

index.php 文件位于 phar 目录中。它是 phar 存档的引导文件:

function does_it_exist($file){
  return file_exists($file) ? "true" : "false";
}

当 phar 文件包含在 PHP 脚本中时,将执行引导文件。我们的引导文件将简单地导致函数“does_it_exist”被声明。

让我们尝试在 test.php 中运行不同的代码,看看每次运行的结果是什么:

//Run 1:
require_once 'phar/index.php';  //PHP file
$file = __DIR__ . "/index.php"; //absolute path
echo does_it_exist($file);      //prints "false"

//Run 2:
require_once 'phar/index.php';  //PHP file
$file = "index.php";            //relative path
echo does_it_exist($file);      //prints "false"

//Run 3:
require_once 'my.phar';         //phar file
$file = __DIR__ . "/index.php"; //absolute path
echo does_it_exist($file);      //prints "false"

//Run 4:
require_once 'my.phar';         //phar file
$file = "index.php";            //relative path
echo does_it_exist($file);      //prints "true"

查看 Run 4。此代码包含 phar 文件并向函数传递相对路径。相对于当前工作目录,index.php 不存在。但是相对于 phar 存档的内容,它确实存在,这就是它打印“true”的原因!

于 2013-08-22T11:10:30.207 回答
2

file_exists在 php 中有几个问题,在特定情况下。

我建议您stat()改用它,这是获取该信息的常用方法,
而不仅仅是在 php.ini 中。也不要忘记通过调用清除缓存clearstatcache()

function FileExists($filename)
{
    clearstatcache(false, $filename);

    return false !== @stat($filename);
}

注意:我尽量避免使用抑制运算符@,但我认为这种特殊情况是使用它的必要条件:)

于 2013-08-25T21:33:41.093 回答
2

我可以通过调用来重现这种行为Phar::interceptFileFuncs()。似乎fopen写入模式下的调用不会被拦截,而与 stat 相关的函数会被拦截。

由于即使在拦截文件函数的 Phar 档案中,绝对文件名也被视为与文件系统相关:

[...] 假定绝对路径是尝试从文件系统加载外部文件。

...解决问题的一种方法是使用realpath()

if (file_exists(realpath($filename)) { /* file exists on filesystem */ }
于 2013-08-26T17:17:22.503 回答
1

不知道是什么导致file_exists()失败,但你可以尝试这样的事情

 function fileExists($path){
    //try to open the file, if it can be read the file exist
    return (@fopen($path,"r") == true); 
 }
于 2013-08-25T04:06:55.033 回答