প্রাথমিকভাবে চালিত স্ক্রিপ্টের পরম পাথ পান


247

আমি নিচু এবং নিম্ন সন্ধান করেছি এবং পরম পথটি পেতে তথ্য সহ প্রচুর বিভিন্ন সমাধান এবং ভেরিয়েবল পেয়েছি। তবে তারা অন্যের অধীনে নয় বরং কিছু শর্তে কাজ করছে বলে মনে হয়। পিএইচপি-তে মৃত্যুদন্ড কার্যকর হওয়া স্ক্রিপ্টের নিখুঁত পথ পাওয়ার জন্য কি একটি রূপালী বুলেট উপায় রয়েছে? আমার জন্য, স্ক্রিপ্টটি কমান্ড লাইন থেকে চলবে, তবে অ্যাপাচি ইত্যাদির মধ্যে যদি চালানো হয় তবে কোনও সমাধান ঠিক একইভাবে কাজ করা উচিত etc.

স্পেসিফিকেশন: প্রাথমিকভাবে সম্পাদিত স্ক্রিপ্ট, প্রয়োজনীয় কোডটি যেখানে কোড কোড করা হয়েছে তা নয়।


সত্যই ম্যাথহেথ ইনক্লাউডস। আমি এটি অনেক আগে গ্রহণ করেছি যখন আমার কাছে কেবল একটি স্ক্রিপ্ট ছিল এবং এটি আমার জন্য কাজ করেছিল। এটি প্রাথমিক সমস্যার সমাধান করে না এটি পরিষ্কার করার জন্য আমি গৃহীত উত্তরটি সরিয়েছি। স্ক্রিপ্টে যখন এক্সিকিউশন শুরু হয় তখন ফাইলের ধ্রুবকটি সংরক্ষণ করা একদিকই পথ, তবে আদর্শের থেকে অনেক দূরে।
জিজ্ঞাসা

অনুরোধ করা স্ক্রিপ্টটি আপনি যা চান তা হ'ল, বর্তমান স্ক্রিপ্ট = এই সমাধান কোড সহ
বিটারব্লু

উত্তর:


33

সঠিক সমাধানটি হ'ল get_included_filesফাংশনটি ব্যবহার করা :

list($scriptPath) = get_included_files();

এটি আপনাকে প্রাথমিক স্ক্রিপ্টের পরম পথ দেয় এমনকি যদি:

  • এই ফাংশনটি একটি অন্তর্ভুক্ত ফাইলের ভিতরে স্থাপন করা হয়
  • বর্তমান ওয়ার্কিং ডিরেক্টরি প্রাথমিক স্ক্রিপ্টের ডিরেক্টরি থেকে পৃথক
  • স্ক্রিপ্টটি সি এল এলির সাথে আপেক্ষিক পথ হিসাবে কার্যকর করা হয়

এখানে দুটি পরীক্ষার স্ক্রিপ্ট রয়েছে; মূল স্ক্রিপ্ট এবং একটি অন্তর্ভুক্ত ফাইল:

# 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

এই সমাধানটি কাজ করে তবে এটি উল্লেখযোগ্য যে ডকুমেন্টেশনগুলি পড়ে , প্রাথমিকভাবে চালিত স্ক্রিপ্টের পথটি অ্যারের প্রথম আইটেমটি দ্বারা ফিরে আসে get_included_files()। আমি স্ক্রিপ্টের শুরুতে একটি ধ্রুবক সঞ্চয় করার পরামর্শ দিই __FILE__যা প্রাথমিকভাবে চালানো উচিত।
পাওলো

270

__FILE__ ধ্রুবক আপনাকে বর্তমান ফাইলটিতে পরম পথ দেবে।

আপডেট :

বর্তমানে চলমান স্ক্রিপ্টের পরিবর্তে প্রাথমিকভাবে সম্পাদিত স্ক্রিপ্টটি কীভাবে পুনরুদ্ধার করবেন জিজ্ঞাসা করার জন্য প্রশ্নটি পরিবর্তন করা হয়েছিল। এটি করার একমাত্র (??) নির্ভরযোগ্য উপায় হ'ল debug_backtraceফাংশনটি ব্যবহার করা ।

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

আমি যদি ফ্রন্ট কন্ট্রোলার প্যাটার্ন ব্যবহার করি। __FILE__সূচি.পি.পি.পি. এর অবস্থান বা অন্তর্ভুক্ত ফাইলের অবস্থান কি ফিরে আসবে? আমি কীভাবে সূচক.পিএফ এর অবস্থান পেতে পারি?
CMCDragonkai

ভাল __FILE__বর্তমান স্ক্রিপ্টের পথ নির্দেশ করে। তবে আমি বর্তমান সূচকটি দেখতে পাই না।
সিএমসিডিগ্রাগনকাই

1
@ সিএমসিডিগ্রাগনকাই: তারপরে একটি পৃথক প্রশ্ন জিজ্ঞাসা করুন
জের্কামস

2
সতর্কতা: স্ক্রিপ্টটি যদি Apache2 ভার্চুয়াল ডিরেক্টরিতে থাকে তবে ফিরিয়ে দেওয়া তথ্যটি প্রকৃত সার্ভারে প্রকৃত পথের অবস্থান সরবরাহ করে না। আমি এটি ডিবাগ উদ্দেশ্যে চেয়েছিলাম এবং এমনকি _S _SERVER ভেরিয়েবলগুলি এটি সরবরাহ করে না। উদাহরণস্বরূপ, যদি index.php / var / www / vpath1 / html এবং / var / www / html / এবং / var / www / vpath2 / html তে বিদ্যমান থাকে এবং এর প্রত্যেকটি কার্যত / var / www / html তে ম্যাপ করা থাকে, তারপরে / var / www / html আপনি যা দেখতে পাবেন তা কোন ভার্চুয়াল সার্ভার ব্যবহার করা যায় না।
মার্ক রিচার্ডস

1
@ ক্রিসটফারবাবাচ আপনার এমনকি এটি নিক্ষেপ করার প্রয়োজন নেই: একটি ব্যতিক্রম বস্তু নির্মাণের সময় স্ট্যাক ট্রেস সংগ্রহ করে।
zerkms

262

উত্তর এখানে সরানো হয়েছে - https://stackoverflow.com/a/26944636/2377343


1
স্ক্রিপ্টের বর্তমান ফোল্ডারটি পেতেstr_replace( basename(__FILE__) , '',str_replace($_SERVER["DOCUMENT_ROOT"],'',str_replace('\\','/',__FILE__ ) ) ) === /folder1/folder2/
সালেম

2
অংশ বা অংশ নেওয়ার উপায়গুলির সমস্ত উদাহরণগুলির মধ্যে এটি সম্পূর্ণ বিস্তৃত তালিকা যা আমি পুরো ইন্টারনেটে দেখেছি।
বিয়ান

241
echo realpath(dirname(__FILE__));

যদি আপনি এটি কোনও অন্তর্ভুক্ত ফাইলে রাখেন তবে এটি এতে অন্তর্ভুক্ত করার পথটি মুদ্রণ করে। পিতা বা মাতা স্ক্রিপ্ট পথ পেতে, প্রতিস্থাপন __FILE__সঙ্গে $_SERVER['PHP_SELF']। তবে সচেতন হন যে পিএইচপি_সেলএফ একটি সুরক্ষা ঝুঁকি!


1
এটি আমি যা চেয়েছিলাম ঠিক
সেটাই

13
এখানে রিয়েলপথের ব্যবহার কী?
আপনার কমন সেন্স

11
@Col। Shrapnel: "যেহেতু পিএইচপি ৪.০.২.২, সিমলিংকের সাথে __FILE__সর্বদা নিরঙ্কুশ পথ থাকে যেখানে পুরানো সংস্করণগুলিতে এটি কিছু পরিস্থিতিতে আপেক্ষিক পথ ধারণ করে।" প্লাস "ডায়ারনাম () ইনপুট স্ট্রিংয়ে নির্লজ্জভাবে কাজ করে এবং প্রকৃত ফাইল সিস্টেম, বা '..' এর মতো পাথ উপাদানগুলি সম্পর্কে অবগত নয়
রিক

6
ওহ, ৪.০.২ গত শতাব্দীর?
আপনার সাধারণ জ্ঞান

2
@ রিক: এছাড়াও, কোন সুরক্ষা সমস্যা সৃষ্টি করতে পারে PHP_SELF??
zerkms

38
__DIR__

থেকে ম্যানুয়াল :

ফাইলের ডিরেক্টরি। যদি অন্তর্ভুক্ত ভিতরে ব্যবহার করা হয় তবে অন্তর্ভুক্ত ফাইলের ডিরেক্টরিটি ফিরে আসে। এটি সমান dirname(__FILE__)। মূল ডিরেক্টরি না থাকলে এই ডিরেক্টরিটির নামের পেছনে স্ল্যাশ নেই।
__FILE__ পুরানো সংস্করণগুলিতে (৪.০.২ এর চেয়ে বেশি) কিছু পরিস্থিতিতে পরিস্থিতিতে আপেক্ষিক পথটি রয়েছে এমন সমাধানগুলির সাথে সর্বদা সমাধানের সাথে একটি নিখুঁত পথ থাকে।

দ্রষ্টব্য : __DIR__পিএইচপি 5.3.0 এ যুক্ত হয়েছিল।


21

আপনি যদি বর্তমান ওয়ার্কিং ডিরেক্টরি ব্যবহার পেতে চানgetcwd()

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

__FILE__ফাইলের নাম সহ XAMPP এর C:\xampp\htdocs\index.phpপরিবর্তে পাথ ফিরে আসবেC:\xampp\htdocs\


8
dirname(__FILE__) 

পরম রুট দিতে হবে বর্তমান ফাইলের যেখান থেকে আপনি রুট দাবিতে হয়, আপনার সার্ভার ডিরেক্টরি রুট।

উদাহরণস্বরূপ ফাইল:

www / http / html / index.php; আপনি যদি এই কোডটি আপনার সূচকের ভিতরে রাখেন ph পিএফপি এটি ফিরে আসবে:

<?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/


7

কেবল নীচে ব্যবহার করুন:

echo __DIR__;

1
হ্যাঁ, ধারণাটি হ'ল প্রথম বরখাস্ত স্ক্রিপ্টটি পাওয়া ... আপনি এখন যা করছেন তা নয়। সুতরাং একজন অন্তর্ভুক্তি গাছ a.php->b.php->c.phpপথ হওয়া উচিত a.php চেক ইন যদি c.php । নির্ভরযোগ্য বলে মনে হচ্ছে একমাত্র উপায় হ'ল ডিবাগ_ব্যাকট্রেস () ফাংশনটি ব্যবহার করা।
জিজ্ঞাসা

5
`realpath(dirname(__FILE__))` 

এটি আপনাকে বর্তমান স্ক্রিপ্ট দেয় (যে স্ক্রিপ্টটির মধ্যে আপনি এই কোডটি রেখেছিলেন) স্ল্যাশ ছাড়াই ডিরেক্টরিটি দেয়। আপনি যদি ফলাফল সহ অন্যান্য ফাইলগুলি অন্তর্ভুক্ত করতে চান তবে এটি গুরুত্বপূর্ণ


হ্যাঁ, তবে ধারণাটি এএফপি দ্বারা অন্তর্ভুক্ত করা থাকলে বি.এফ.পি. এর মধ্যেও "ফায়ারিং স্ক্রিপ্ট" এ.এফ.পি. এর নিখুঁত পথ পেতে সক্ষম হবেন। এটি পরে বা অ্যাক্সেসের জন্য প্রাথমিক স্ক্রিপ্ট সংরক্ষণ করেই করা যেতে পারে বা অবশ্যই করা যেতে পারে, তবে প্রশ্নটি ছিল যে এটি না করে এটি পাওয়া সম্ভব কিনা।
জিজ্ঞাসা

4

আপনি যদি সার্ভারের মূলের তুলনায় নিখুঁত পথের সন্ধান করেন তবে আমি খুঁজে পেয়েছি যে এটি ভালভাবে কাজ করে:

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

আমি যখন বিভিন্ন সার্ভারের বিরুদ্ধে এই সমাধানটি যাচাই করছিলাম তখন এটি সর্বদা আমাকে লিনাক্সের সাথে ডায়ার বিভাজকের মতো পথ দিয়েছিল হোস্টের ওএস (উইন্ডোজ এবং লিনাক্স) নির্বিশেষে। আমার কাছে এটি একটি সুবিধা।
ব্রোনেক

3

এই জন্য আমি একটি দরকারী পিএইচপি ফাংশন এখানে লিখেছিলাম। মূল প্রশ্নটি যেমন স্পষ্ট করে, এটি প্রাথমিক স্ক্রিপ্টটি কার্যকর করা হয়েছিল এমন পথে ফিরে আসে - আমরা বর্তমানে যে ফাইলটিতে আছি তা নয়।

/**
 * 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;
}


1
realpath($_SERVER['SCRIPT_FILENAME'])

ওয়েব সার্ভারের অধীনে স্ক্রিপ্ট চলার জন্য $_SERVER['SCRIPT_FILENAME']প্রাথমিকভাবে বলা স্ক্রিপ্টের পুরো পথটি থাকবে, তাই সম্ভবত আপনার সূচি.পি.পি.পি. realpath()এই ক্ষেত্রে প্রয়োজন হয় না।

কনসোল থেকে চালিত স্ক্রিপ্টের জন্য $_SERVER['SCRIPT_FILENAME']আপনার বর্তমান কার্যকারিতা থেকে শুরুতে ডাকা স্ক্রিপ্টের আপেক্ষিক পাথ থাকবে। সুতরাং আপনি যদি আপনার স্ক্রিপ্টের অভ্যন্তরে কাজ করার ডিরেক্টরিটি পরিবর্তন না করেন তবে এটি নিখুঁত পথে সমাধান করবে resolve


1

এটি আমি ব্যবহার করি এবং এটি লিনাক্স পরিবেশে কাজ করে। আমি মনে করি না এটি উইন্ডোজ মেশিনে কাজ করবে ...

//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']);
}

1

একটি সহজ উপায় নিয়ে সুনির্দিষ্ট পাথ আছে প্রাথমিকভাবে মৃত্যুদন্ড কার্যকর স্ক্রিপ্ট যে স্ক্রিপ্ট, এবং অন্য কোন স্ক্রিপ্ট সঙ্গে অন্তর্ভুক্ত include, require, require_onceএকটি ব্যবহার করা ধ্রুবক এবং শুরুতে সেখানে বর্তমান স্ক্রিপ্ট পথ সংরক্ষণকারী প্রধান স্ক্রিপ্ট :

define( 'SCRIPT_ROOT', __FILE__ );

includeবেশিরভাগ ওয়েব অ্যাপ্লিকেশনগুলির মতো, প্রতিটি প্রয়োজনীয় স্ক্রিপ্টের জন্য যখন একটি একক "মূল" স্ক্রিপ্ট থাকে তখন উপরের সমাধানটি উপযুক্ত ।

যদি এটি না হয় এবং বেশ কয়েকটি "অন্তর্নিহিত স্ক্রিপ্টগুলি" থাকতে পারে তবে পুনরায় সংজ্ঞাগুলি এড়াতে এবং ধীরে ধীরে সঠিক স্ক্র্যাপটি সংরক্ষণ করার জন্য প্রতিটি স্ক্রিপ্টটি শুরু হতে পারে:

if( ! defined( 'SCRIPT_ROOT' ) ) {
    define( 'SCRIPT_ROOT`, __FILE__ );
}

(বর্তমানে) গৃহীত উত্তর সম্পর্কে একটি নোট :

উত্তরে বলা হয়েছে যে প্রাথমিকভাবে সম্পাদিত স্ক্রিপ্ট পাথটি অ্যারের প্রথম উপাদান দ্বারা ফিরে আসে get_included_files()

এটি একটি চতুর এবং সহজ সমাধান এবং - লেখার সময় - (আমরা প্রায় পিএইচপি 7.4.0 এ রয়েছি) এটি কাজ করে

তবে ডকুমেন্টেশনটি দেখে এখানে উল্লেখ করা যায় না যে প্রাথমিকভাবে সম্পাদিত স্ক্রিপ্টটি অ্যারের প্রথম আইটেমটি দিয়ে এসেছেget_included_files()

আমরা কেবল পড়ি

মূলত লিখিত স্ক্রিপ্টটিকে "অন্তর্ভুক্ত ফাইল" হিসাবে বিবেচনা করা হয়, সুতরাং এটি অন্তর্ভুক্ত এবং পরিবার দ্বারা উল্লিখিত ফাইলগুলির সাথে একসাথে তালিকাভুক্ত হবে।

" মূলত বলা হয় স্ক্রিপ্ট " লেখার সময় অ্যারেতে প্রথমটি হয় তবে - প্রযুক্তিগতভাবে - ভবিষ্যতে এটি পরিবর্তিত হবে না এমন কোনও গ্যারান্টি নেই।


একটি নোট সম্পর্কে realpath(), __FILE__এবং __DIR__:

অন্যরা তাদের উত্তর ব্যবহারের পরামর্শ দিয়েছেন __FILE__, __DIR__, dirname(__FILE__), realpath(__DIR__)...

dirname(__FILE__)এর সমান __DIR__(পিএইচপি 5.3.0 এ প্রবর্তিত), তাই কেবল ব্যবহার করুন __DIR__

উভয় __FILE__এবং __DIR__সর্বদা পরম পাথ তাই realpath()অপ্রয়োজনীয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.