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 処理ファイルは 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";
}

ブートストラップ ファイルは、PHP スクリプトから phar ファイルがインクルードされるときに実行されます。私たちのブートストラップ ファイルは、関数 "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_existsin php には、特定のケースでいくつかの問題があります。

代わりに使用することをお勧めします。これは 、php だけでなくstat()、その情報を取得するために一般的に好まれる方法です。
を呼び出してキャッシュをクリアすることも忘れないでくださいclearstatcache()

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

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

注:私はできる限り抑制演算子を避けようとして@いますが、この特定のケースではそれを使用する必要があると思います:)

于 2013-08-25T21:33:41.093 に答える
2

を呼び出すことで、この動作を再現できPhar::interceptFileFuncs()ます。fopen書き込みモードでの呼び出しは傍受されていないようですが、統計関連の関数は傍受されています。

絶対ファイル名は、ファイル機能をインターセプトする Phar アーカイブでもファイルシステムに関連するものとして扱われるため:

[...] ファイルシステムから外部ファイルをロードしようとすると、絶対パスが想定されます。

...問題に対処する1つの方法は、次を使用することrealpath()です:

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