私の Phar スクリプトは、fwrite を使用して新しいファイルを作成します。これは正常に動作し、phar ファイルと同じディレクトリに phar の外に新しいファイルを作成します。
しかし、その後 if(file_exists('file.php')) を使用すると、それは拾われません。
しかし、それを含めて、それを拾う必要があります。
誰でもこの問題について知っていますか?しばらくの間、テストと調査を行ってきましたが、解決策が見つからないようです。
私の Phar スクリプトは、fwrite を使用して新しいファイルを作成します。これは正常に動作し、phar ファイルと同じディレクトリに phar の外に新しいファイルを作成します。
しかし、その後 if(file_exists('file.php')) を使用すると、それは拾われません。
しかし、それを含めて、それを拾う必要があります。
誰でもこの問題について知っていますか?しばらくの間、テストと調査を行ってきましたが、解決策が見つからないようです。
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)
今日も同じ問題に遭遇しました。数時間掘り下げた後...答えを見つけました。
最初に次のスクリプトを試していただけますか?
if(file_exists(realpath('file.php')));
ファイルが存在する場合、問題は
パス情報なしでファイル名だけを使用する場合、php 処理ファイルは phar stub に関連しています。例えば:
phar:///a/b/c/file.php
したがって、ファイルを操作するには絶対パスを使用する必要があります。次に例を示します。
/home/www/d/e/f/file.php
この助けを願っています。
マーク
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" と表示されます!
file_exists
in php には、特定のケースでいくつかの問題があります。
代わりに使用することをお勧めします。これは
、php だけでなくstat()
、その情報を取得するために一般的に好まれる方法です。
を呼び出してキャッシュをクリアすることも忘れないでくださいclearstatcache()
。
function FileExists($filename)
{
clearstatcache(false, $filename);
return false !== @stat($filename);
}
注:私はできる限り抑制演算子を避けようとして@
いますが、この特定のケースではそれを使用する必要があると思います:)
を呼び出すことで、この動作を再現できPhar::interceptFileFuncs()
ます。fopen
書き込みモードでの呼び出しは傍受されていないようですが、統計関連の関数は傍受されています。
絶対ファイル名は、ファイル機能をインターセプトする Phar アーカイブでもファイルシステムに関連するものとして扱われるため:
[...] ファイルシステムから外部ファイルをロードしようとすると、絶対パスが想定されます。
...問題に対処する1つの方法は、次を使用することrealpath()
です:
if (file_exists(realpath($filename)) { /* file exists on filesystem */ }