私は高低を検索して、絶対パスを取得するための情報を含む多くの異なるソリューションと変数を取得しました。しかし、それらはある条件下では機能し、他の状況では機能しないようです。PHPで実行されたスクリプトの絶対パスを取得するための特効薬はありますか?私にとって、スクリプトはコマンドラインから実行されますが、Apacheなどで実行された場合でもソリューションは機能するはずです。
明確化:最初に実行されたスクリプト。必ずしもソリューションがコーディングされているファイルではありません。
私は高低を検索して、絶対パスを取得するための情報を含む多くの異なるソリューションと変数を取得しました。しかし、それらはある条件下では機能し、他の状況では機能しないようです。PHPで実行されたスクリプトの絶対パスを取得するための特効薬はありますか?私にとって、スクリプトはコマンドラインから実行されますが、Apacheなどで実行された場合でもソリューションは機能するはずです。
明確化:最初に実行されたスクリプト。必ずしもソリューションがコーディングされているファイルではありません。
回答:
正しい解決策は、get_included_files
関数を使用することです。
list($scriptPath) = get_included_files();
これにより、次の場合でも初期スクリプトの絶対パスが得られます。
以下は2つのテストスクリプトです。メインスクリプトとインクルードファイル:
# C:\Users\Redacted\Desktop\main.php
include __DIR__ . DIRECTORY_SEPARATOR . 'include.php';
echoScriptPath();
# C:\Users\Redacted\Desktop\include.php
function echoScriptPath() {
list($scriptPath) = get_included_files();
echo 'The script being executed is ' . $scriptPath;
}
そしてその結果; 現在のディレクトリに注意してください:
C:\>php C:\Users\Redacted\Desktop\main.php
The script being executed is C:\Users\Redacted\Desktop\main.php
__FILE__
定数は、現在のファイルへの絶対パスを提供します。
更新:
現在実行中のスクリプトではなく、最初に実行されたスクリプトを取得する方法を尋ねる質問が変更されました。これを行う唯一の(??)信頼できる方法は、debug_backtrace
関数を使用することです。
$stack = debug_backtrace();
$firstFrame = $stack[count($stack) - 1];
$initialFile = $firstFrame['file'];
__FILE__
のindex.phpの場所やインクルードファイルの場所を返しますか?index.phpの場所を取得するにはどうすればよいですか?
__FILE__
、現在のスクリプトのパスを指します。しかし、現在のindex.phpのパスを示すものは何も見つかりませんでした。
回答はここに移動されました-https://stackoverflow.com/a/26944636/2377343
str_replace( basename(__FILE__) , '',str_replace($_SERVER["DOCUMENT_ROOT"],'',str_replace('\\','/',__FILE__ ) ) ) === /folder1/folder2/
echo realpath(dirname(__FILE__));
これをインクルードファイルに配置すると、このインクルードへのパスが出力されます。親スクリプトのパスを取得するには、交換してください__FILE__
と$_SERVER['PHP_SELF']
。ただし、PHP_SELFはセキュリティリスクであることに注意してください。
__FILE__
常にシンボリックリンクが解決された絶対パスが含まれていましたが、古いバージョンでは、状況によっては相対パスが含まれていました。」プラス「DIRNAME()は、入力文字列に単純に動作し、実際のファイルシステムを認識しない、または例えば『..』パスコンポーネント。
PHP_SELF
か?
__DIR__
マニュアルから:
ファイルのディレクトリ。インクルード内で使用すると、インクルードされたファイルのディレクトリが返されます。これはと同等dirname(__FILE__)
です。このディレクトリ名は、ルートディレクトリでない限り、末尾にスラッシュがありません。
__FILE__
シンボリックリンクが解決された絶対パスが常に含まれているのに対し、古いバージョン(4.0.2以降)では、状況によっては相対パスが含まれていました。
注:__DIR__
PHP 5.3.0で追加されました。
あなたがしたい場合は、現在の作業ディレクトリを取得する使用をgetcwd()
http://php.net/manual/en/function.getcwd.php
__FILE__
XAMPPの例ではC:\xampp\htdocs\index.php
なく、ファイル名のパスを返しますC:\xampp\htdocs\
dirname(__FILE__)
絶対ルートを与える あなたがルートを求めている、そこから現在のファイルの、サーバーのディレクトリのルートを。
サンプルファイル:
www / http / html / index.php; このコードをindex.php内に配置すると、次のコードが返されます。
<?php
echo dirname(__FILE__); // this will return: www/http/html/
www / http / html / class / myclass.php; このコードをmyclass.php内に配置すると、次のコードが返されます。
<?php
echo dirname(__FILE__); // this will return: www/http/html/class/
これは私がこれを正確に記述した便利なPHP関数です。元の質問で明らかになったように、最初のスクリプトが実行されたパスが返されます。現在のファイルではありません。
/**
* Get the file path/dir from which a script/function was initially executed
*
* @param bool $include_filename include/exclude filename in the return string
* @return string
*/
function get_function_origin_path($include_filename = true) {
$bt = debug_backtrace();
array_shift($bt);
if ( array_key_exists(0, $bt) && array_key_exists('file', $bt[0]) ) {
$file_path = $bt[0]['file'];
if ( $include_filename === false ) {
$file_path = str_replace(basename($file_path), '', $file_path);
}
} else {
$file_path = null;
}
return $file_path;
}
これは私が使用するもので、Linux環境で機能します。これはWindowsマシンでは機能しないと思います...
//define canonicalized absolute pathname for the script
if(substr($_SERVER['SCRIPT_NAME'],0,1) == DIRECTORY_SEPARATOR) {
//does the script name start with the directory separator?
//if so, the path is defined from root; may have symbolic references so still use realpath()
$script = realpath($_SERVER['SCRIPT_NAME']);
} else {
//otherwise prefix script name with the current working directory
//and use realpath() to resolve symbolic references
$script = realpath(getcwd() . DIRECTORY_SEPARATOR . $_SERVER['SCRIPT_NAME']);
}
絶対パスを持っている簡単な方法最初に実行されるスクリプトは、そのスクリプト内とに含まれている任意の他のスクリプトinclude
、require
、require_once
使用することである定数との初めに存在現在のスクリプトのパスを格納するメインスクリプト。
define( 'SCRIPT_ROOT', __FILE__ );
上記のソリューションは、単一の「メイン」スクリプトが存在する場合に適しています。 include
、ほとんどのWebアプリケーションのように、他のすべての必要なスクリプトでます。
そうでない場合、いくつかの「初期スクリプト」が存在する可能性がある場合、再定義を回避し、定数内に正しいパスを格納するには、各スクリプトを次のように開始します。
if( ! defined( 'SCRIPT_ROOT' ) ) {
define( 'SCRIPT_ROOT`, __FILE__ );
}
(現在)受け入れられている回答に関するメモ:
答えは、最初に実行されたスクリプトのパスがによって返される配列の最初の要素であると述べています get_included_files()
ます。
これは巧妙でシンプルなソリューションであり、-執筆時点では-(ほぼPHP 7.4.0です)機能します。
ただし、ドキュメントを見ると、最初に実行されたスクリプトがによって返される配列の最初の項目であることについては言及されていませんget_included_files()
。
読むだけ
最初に呼び出されたスクリプトは「インクルードファイル」と見なされるため、インクルードおよびファミリによって参照されるファイルとともにリストされます。
執筆時点では、「最初に呼び出されたスクリプト」は配列の最初のスクリプトですが、技術的には、これが将来変更されないという保証はありません。
注意realpath()
、__FILE__
と__DIR__
:
他の人がその答えでの使用を示唆しています__FILE__
、__DIR__
、dirname(__FILE__)
、realpath(__DIR__)
...
dirname(__FILE__)
は__DIR__
(PHP 5.3.0で導入された)と等しいため、を使用してください__DIR__
。
両方__FILE__
と__DIR__
常に絶対パスのでrealpath()
不要です。