Ia calea absolută de curent script

Am căutat de înaltă și joasă și a obține o mulțime de soluții diferite și variabile care conțin informații pentru a obține calea absolută. Dar ele par să funcționeze în anumite condiții și nu în altele. Există un glonț de argint mod de a obține calea absolută a executat script in PHP? Pentru mine, script-ul va rula din linia de comandă, dar, o soluție ar trebui să funcționeze la fel de bine dacă în termen de Apache etc.

Clarificări: inițial executat script-ul, nu neapărat de fișier în cazul în care soluția este codat.

Comentarii la întrebare (2)

__FILE__ constanta va oferi calea absolută a fișierului curent.

Update:

Întrebarea a fost schimbat pentru a întreba cum de a prelua inițial executat script-ul în loc de script care rulează în prezent. Singurul (??) încredere modalitate de a face asta este de a utiliza debug_backtrace funcție.

$stack = debug_backtrace();
$firstFrame = $stack[count($stack) - 1];
$initialFile = $firstFrame['file'];
Comentarii (16)

Exemple pentru: https://(www.)example.com/subFolder/myfile.php?var=blabla#555`

// ======= PATHINFO ====== //
$x = pathinfo($url);
$x['dirname']      🡺 https://example.com/subFolder
$x['basename']     🡺                               myfile.php?
$x['extension']    🡺                                      php?k=blaa#12345 // Unsecure! also, read my notice about hashtag parts    
$x['filename']     🡺                               myfile

// ======= PARSE_URL ====== //
$x = parse_url($url);
$x['scheme']       🡺 https
$x['host']         🡺         example.com
$x['path']         🡺                    /subFolder/myfile.php
$x['query']        🡺                                          k=blaa
$x['fragment']     🡺                                                 12345 // ! read my notice about hashtag parts

//=================================================== //
//========== self-defined SERVER variables ========== //
//=================================================== //
$_SERVER["DOCUMENT_ROOT"]  🡺 /home/user/public_html
$_SERVER["SERVER_ADDR"]    🡺 143.34.112.23
$_SERVER["SERVER_PORT"]    🡺 80(or 443 etc..)
$_SERVER["REQUEST_SCHEME"] 🡺 https                                         //similar: $_SERVER["SERVER_PROTOCOL"] 
$_SERVER['HTTP_HOST']      🡺         example.com (or with WWW)             //similar: $_SERVER["ERVER_NAME"]
$_SERVER["REQUEST_URI"]    🡺                       /subFolder/myfile.php?k=blaa
$_SERVER["QUERY_STRING"]   🡺                                             k=blaa
__FILE__                   🡺 /home/user/public_html/subFolder/myfile.php
__DIR__                    🡺 /home/user/public_html/subFolder              //same: dirname(__FILE__)
$_SERVER["REQUEST_URI"]    🡺                       /subFolder/myfile.php?k=blaa
parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH)🡺  /subFolder/myfile.php 
$_SERVER["PHP_SELF"]       🡺                       /subFolder/myfile.php

// ==================================================================//
//if "myfile.php" is included in "PARENTFILE.php" , and you visit  "PARENTFILE.PHP?abc":
$_SERVER["SCRIPT_FILENAME"]🡺 /home/user/public_html/parentfile.php
$_SERVER["PHP_SELF"]       🡺                       /parentfile.php
$_SERVER["REQUEST_URI"]    🡺                       /parentfile.php?abc
__FILE__                   🡺 /home/user/public_html/subFolder/myfile.php

// =================================================== //
// ================= handy variables ================= //
// =================================================== //
//If site uses HTTPS:
$HTTP_or_HTTPS = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS']!=='off') || $_SERVER['SERVER_PORT']==443) ? 'https://':'http://' );            //in some cases, you need to add this condition too: if ('https'==$_SERVER['HTTP_X_FORWARDED_PROTO'])  ...

//To trim values to filename, i.e. 
basename($url)             🡺 myfile.php

//excellent solution to find origin
$debug_files = debug_backtrace();       
$caller_file = count($debug_files) ? $debug_files[count($debug_files) - 1]['file'] : __FILE__;

Observa!:

  • hashtag (#...) URL părți nu poate fi detectat de PHP (server-side). Pentru asta, folosesc JavaScript.
  • DIRECTORY_SEPARATOR a se întoarce \ pentru Ferestre de tip hosting, în loc de /.



Pentru WordPress

//(let's say, if wordpress is installed in subdirectory:  http://example.com/wpdir/)
home_url()                      🡺 http://example.com/wpdir/        //if is_ssl() is true, then it will be "https"
get_stylesheet_directory_uri()  🡺 http://example.com/wpdir/wp-content/themes/THEME_NAME  [same: get_bloginfo('template_url') ]
get_stylesheet_directory()      🡺 /home/user/public_html/wpdir/wp-content/themes/THEME_NAME
plugin_dir_url(__FILE__)        🡺 http://example.com/wpdir/wp-content/themes/PLUGIN_NAME
plugin_dir_path(__FILE__)       🡺 /home/user/public_html/wpdir/wp-content/plugins/PLUGIN_NAME/  
Comentarii (2)
echo realpath(dirname(__FILE__));

Dacă plasați într-un incluse fișier, se imprimă calea aceasta include. Pentru a obține calea de părinte script, înlocuiți - __FILE__ " cu " $_SERVER['PHP_SELF']. Dar să fie conștienți de faptul că PHP_SELF este un risc de securitate!

Comentarii (12)
__DIR__

De la manual:

Directorul de fișier. Dacă este folosit în interiorul unui includ, directorul de inclus fișier este returnat. Acest lucru este echivalent cu dirname(__FILE__). Acest nume de director nu are un slash de final, cu excepția cazului în care este directorul rădăcină.
__FILE__ conține întotdeauna o cale absolută cu legături simbolice rezolvate în timp ce în versiunile mai vechi (decât 4.0.2) conținea cale relativă în anumite circumstanțe.

Notă: `DIR a fost adăugat în PHP 5.3.0.

Comentarii (1)
Soluția

Soluția corectă este de a utiliza get_included_files funcția:

list($scriptPath) = get_included_files();

Acest lucru vă va oferi calea absolută inițială script, chiar dacă:

  • Această funcție este plasat în interiorul unui fișier inclus
  • Directorul curent de lucru este diferit de la inițială de script's director
  • Script-ul este executat cu CLI, ca o cale relativă

Aici sunt două scripturi de testare; principalele script și un incluse fișier:

# 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;
}

Și rezultatul; notificare de la directorul curent:

C:\>php C:\Users\Redacted\Desktop\main.php
The script being executed is C:\Users\Redacted\Desktop\main.php
Comentarii (0)

Daca vrei sa ia director de lucru curent utilizarea getcwd()

http://php.net/manual/en/function.getcwd.php

__FILE__ va reveni cu calea fisierului, de exemplu, pe XAMPP C:\xampp\htdocs\index.php "în loc de" C:\xampp\htdocs\

Comentarii (0)
dirname(__FILE__) 

va dau absolută traseu din fișierul curent la care se cere traseu, ruta de directory server.

exemplu fișiere :

www/http/html/index.php ; dacă puneți acest cod în interiorul tău index.php se va reveni:

<?php echo dirname(__FILE__); // va returna: www/http/html/

www/http/html/class/myclass.php ; dacă puneți acest cod în interiorul tău myclass.php se va reveni:

<?php echo dirname(__FILE__); // va returna: www/http/html/clasa/

Comentarii (0)

Doar folosi mai jos :

echo __DIR__;
Comentarii (1)
`realpath(dirname(__FILE__))` 

acesta vă oferă curent script(script-ul interior care ai pus acest cod) director fără slash de final. acest lucru este important, dacă doriți să includeți alte fișiere cu rezultatul

Comentarii (1)

Daca're în căutarea pentru calea absolută relativă la server root, am'am constatat că acest lucru funcționează bine:

$_SERVER['DOCUMENT_ROOT'] . dirname($_SERVER['SCRIPT_NAME'])
Comentarii (1)

Aici's util funcția PHP-am scris pentru acest lucru cu precizie. Ca întrebarea inițială clarifică, se returnează calea de la care inițial script-ul a fost executat - nu fișierul suntem în prezent în.

/**
 * 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;
}
Comentarii (0)

Aceasta este ceea ce am folosi și funcționează în medii Linux. Eu nu't cred că acest lucru ar lucra pe un calculator cu 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']);
}
Comentarii (0)

încercați această pe script

echo getcwd() . "\n";
Comentarii (1)

Cel mai simplu mod de a prelua calea absolută de cel inițial executat script-ul de care "principal" script și orice script inclus cu includ, nevoie, require_once este prin stocarea într-o constantă la începutul script principal:

define( 'SCRIPT_ROOT', __FILE__ );

__FILE__ returnează calea de curent script. Folosit în interiorul unui inclus script se întoarce calea inclus fișier, nu scenariul inițial rula la fel de OP întreabă:

Clarificare: inițial executat script-ul, nu fișierul suntem în prezent în

Soluția de stocare a __FILE__ într-o constantă este mai ușor și mai rapid decât recuperarea calea folosinddebug_backtrace()`


Soluția de mai sus este potrivit atunci când există un singur "principal" script care includ fiecare alte nevoie de script-ul, la fel ca în cele mai multe aplicații web.

Dacă asta'nu e cazul și pot exista mai multe "intital scripturi" apoi, pentru a evita redefinitions și să aibă calea corectă stocate în interiorul constante fiecare scenariu poate începe cu:

if( ! defined( 'SCRIPT_ROOT' ) ) {
    define( 'SCRIPT_ROOT`, __FILE__ );
}
Comentarii (0)
realpath($_SERVER['SCRIPT_FILENAME'])

Pentru script-ul rula sub server web $_SERVER[&#39;SCRIPT_FILENAME&#39;] va conține calea completă a numit inițial script, deci probabil index.php. ului căilor() nu este necesară în acest caz.

Pentru script rulat din consola $_SERVER[&#39;SCRIPT_FILENAME&#39;] va conține calea relativă la inițial numit script de lucru curent dir. Deci, dacă nu s-a schimbat directorul de lucru în interiorul script-ul dvs. se va rezolva pe cale absolută.

Comentarii (0)