একটি পিএইচপি প্রকল্পের রুট ডিরেক্টরি পাথ পান


115

আমার পিএইচপি প্রকল্পে আমার এই ফোল্ডারটির কাঠামো রয়েছে। (এটি গ্রহণের মতো দেখানো হয়েছে)

-MySystem
    +Code
    +Data_Access
    -Public_HTML
        +css
        +js
        +Templates
    -resources

যখন আমি এই কোডটি চেষ্টা করি

echo $_SERVER['DOCUMENT_ROOT']

আউটপুট হয়

ডি: / কর্মক্ষেত্র

MySystemফোল্ডারের নাম হার্ডকডিং না করে আমি কীভাবে সিস্টেমের রুট ডিরেক্টরী ( ) এর পথ পেতে পারি ?

উত্তর:


146

জন্য পিএইচপি> = 5.3.0 ব্যবহার করে দেখুন

পিএইচপি যাদু স্থির

__DIR__

এবং আপনার পথ আপেক্ষিক করুন।

জন্য পিএইচপি <5.3.0 ব্যবহার করে দেখুন

dirname(__FILE__)

3
এটি কেবল দুর্দান্ত I
ওয়েবলবার

78
এটি আপনি কোথায় ব্যবহার করবেন তা নির্ভর করে __DIR__ । এটি ফাইলের সাথে সম্পর্কিত, সুতরাং কোনও সাব ডিরেক্টরিতে যদি এটি অন্তর্ভুক্ত করা হয় তবে এটি কেবল আপনার মূল ডিরেক্টরিটি ফেরত দেবে না।
আইরিস

10
এটি রুট ডিরেক্টরিটি দেবে না
inrsaurabh

1
এই প্রশ্নের উত্তরের জন্য যে কেউ হোঁচট খায় তার জন্য দ্রুত দ্রষ্টব্য, জিজ্ঞাসিত প্রশ্নের উত্তর খুঁজছেন, ডিআইআর বর্তমান ফাইলের ডিরেক্টরিটি প্রকল্পের রুট নয়, যদি না আপনি প্রজেক্টের রুটে থাকা কোনও ফাইলে কল না করেন তবে পিএইচপি না করে একটি প্রকল্পের ধারণাটি রয়েছে যে সমস্ত পাথের বর্তমান অবস্থানের সাথে নিখুঁত বা আপেক্ষিক হতে হবে
মাইকটি

দয়া করে এমন কোনও উত্তর উত্সাহিত করবেন না যা সঠিকভাবে প্রশ্নের সমাধান করে না, কেবল কারণ এটি আপনাকে সহায়তা করেছিল।
এলায়ানটে

73

আপনি যখন বলবেন

$_SERVER['DOCUMENT_ROOT']

এই পথ রয়েছে:

D:/workspace

তাহলে D:আপনি যা খুঁজছেন, তাই না? সেক্ষেত্রে আপনি স্ট্র্যাশগুলি স্ল্যাশ করে বিস্ফোরিত করতে পারেন এবং প্রথমটি ফিরে আসতে পারেন:

$pathInPieces = explode('/', $_SERVER['DOCUMENT_ROOT']);
echo $pathInPieces[0];

এটি সার্ভারের রুট ডিরেক্টরিটি আউটপুট দেবে।

আপডেট: আপনি যখন DIRECTORY_SEPARATORহার্ডকডযুক্ত স্ল্যাশের পরিবর্তে ধ্রুবক ব্যবহার করেন ( '/') তখন এই কোডটি উইন্ডোজের অধীনেও কাজ করে।

আপডেট করুন 2:$_SERVER বিশ্বব্যাপী পরিবর্তনশীল সবসময় পাওয়া যায় না। উদাহরণস্বরূপ কমান্ড লাইনে (ক্লিপ)। সুতরাং আপনার __DIR__পরিবর্তে ব্যবহার করা উচিত $_SERVER['DOCUMENT_ROOT']__DIR__পিএইচপি ফাইলের পথ নিজেই ফেরত দেয়।


2
এবং আপনি __DIR__পরিবর্তে ব্যবহার করতে পারে $_SERVER['DOCUMENT_ROOT']
আরমিন

দুঃখিত আমি যদি আমার প্রশ্নটি সঠিকভাবে ব্যাখ্যা না করি তবে আমার আসলে যা দরকার তা হ'ল 'ডি: / ওয়ার্কস্পেস / মাইসিস্টেম'
নালাকা 526

1
যদি আপনার মূল ডিরেক্টরি পথটি / var / public / www "আকারে থাকে তবে এই পদ্ধতিটি ব্যবহার করে অ্যারেতে প্রথম স্ট্রিং ফাঁকা (0) / (1) / (2) / (3) হবে মূলটি হবে। দ্বিতীয় স্ট্রিং $ pathInPieces [1]
tbradley22

36

পিএইচপি ফাংশন ব্যবহার করুন:

getcwd()

বর্তমান ওয়ার্কিং ডিরেক্টরিটি পায়।


1
এটি CURRENT এক্সিকিউটিভ ফাইলের পাথ প্রদান করে। মূলের পথ নয়
ইউসাহ আলেয়াউব

9

ওয়ার্ডপ্রেস এটি যেভাবে পরিচালনা করে তা আমি উল্লেখ করতে চাই:

define( 'ABSPATH', dirname(dirname(__FILE__)) . '/' );

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


1
আমার ধারণা এটি কেবল তখনই কাজ করে যখন আপনার কাছে দুটি স্তরের ডিরেক্টরি থাকে। রাইট? আমি বলতে চাইছি যখন বেস_প্রজেক্ট_ডাইরেক্টরি / ফোল্ডার 1 / ফোল্ডার 2 / ফোল্ডার 3 / file.php থেকে কল করুন এটি বেস_প্রজেক্ট_ডাইরেক্টরিটি ফিরিয়ে দেয় না।
আলী খলিলি

"যেহেতু ওয়ার্ডপ্রেসটি পুরো ওয়েব জুড়ে খুব ভারী ব্যবহৃত হয় এবং স্থানীয়ভাবে এটিও কার্যকরভাবে কাজ করে আমার এই পদ্ধতির উপর অনেক আস্থা আছে।" আমি বিশ্বাস করি না যে এটি ডাব্লুপি কোডের গুণমান এবং সুরক্ষা ট্র্যাক রেকর্ডের কারণে একটি বিশেষ যুক্তি particularly
অ্যালেক্স বার্কার 21

1
@ অ্যালেক্সবার্কার আমি আপনার প্রতিদ্বন্দ্বিতা করে বলব যে ডাব্লুপি-র একটি খারাপ সুরক্ষা ট্র্যাক রেকর্ড রয়েছে। এটি প্রকৃতপক্ষে সুরক্ষিত এবং সুরক্ষার দিকে মনোনিবেশকারী একটি রেসিসিনিটিভ দল রয়েছে - সাম্প্রতিক বছরগুলিতে কোরটির খুব কম শোষিত সুরক্ষা সমস্যা ছিল (আপনি যখন মন্তব্য করেছিলেন তখন পর্যন্ত)।
উইলিয়াম প্যাটন

3

আপনি চেষ্টা করতে পারেন: $_SERVER['PATH_TRANSLATED']

উদ্ধৃতি:

সার্ভার কোনও ভার্চুয়াল-টু-রিয়েল ম্যাপিংয়ের পরে বর্তমান সিস্টেমের স্ক্রিপ্টটিতে ফাইল সিস্টেম - (ডকুমেন্ট রুট নয়) ভিত্তিক পাথ। দ্রষ্টব্য: পিএইচপি ৪.৩.২ PATH_TRANSLATEDঅনুসারে, অ্যাপাচি ১-এর পরিস্থিতিটির বিপরীতে অ্যাপাচি 2 এসএপিআইয়ের অধীনে সুস্পষ্টভাবে আর সেট করা নেই, যেখানে এটি SCRIPT_FILENAMEঅ্যাপাচি দ্বারা জনবসতিপূর্ণ না হলে সার্ভারের পরিবর্তনশীল হিসাবে একই মান হিসাবে সেট করা থাকে ।
এই পরিবর্তনটি সিজিআই নির্দিষ্টকরণের সাথে মেনে চলার জন্য তৈরি করা হয়েছিল যে PATH_INFOসংজ্ঞায়িত হলে PATH_TRANSLATED কেবল উপস্থিত থাকতে পারে । অ্যাপাচি 2 ব্যবহারকারীরা সংজ্ঞায়িত করতে AcceptPathInfo = Onভিতরে ব্যবহার httpd.confকরতে পারেPATH_INFO

উত্স: php.net/manual



0

সারসংক্ষেপ

এই উদাহরণটি ধরে নিয়েছে যে আপনি সর্বদা জানেন যে অ্যাপাচি রুট ফোল্ডারটি '/ var / www /' এবং আপনি পরবর্তী ফোল্ডারের পাথ (যেমন '/ var / www / my_website_folder') সন্ধান করার চেষ্টা করছেন। এছাড়াও এটি কোনও স্ক্রিপ্ট বা ওয়েব ব্রাউজার থেকে কাজ করে যার জন্য অতিরিক্ত কোড রয়েছে।

কোড পিএইচপি 7

function getHtmlRootFolder(string $root = '/var/www/') {

    // -- try to use DOCUMENT_ROOT first --
    $ret = str_replace(' ', '', $_SERVER['DOCUMENT_ROOT']);
    $ret = rtrim($ret, '/') . '/';

    // -- if doesn't contain root path, find using this file's loc. path --
    if (!preg_match("#".$root."#", $ret)) {
      $root = rtrim($root, '/') . '/';
      $root_arr = explode("/", $root);
      $pwd_arr = explode("/", getcwd());
      $ret = $root . $pwd_arr[count($root_arr) - 1];
    }

    return (preg_match("#".$root."#", $ret)) ? rtrim($ret, '/') . '/' : null;
}

উদাহরণ

echo getHtmlRootFolder();

আউটপুট:

/var/www/somedir/

বিবরণ:

মূলত প্রথমে DOCUMENT_ROOT পাওয়ার চেষ্টা করে যদি এতে '/ var / www /' থাকে তবে এটি ব্যবহার করুন, অন্যথায় বর্তমান দির (যা প্রকল্পের অভ্যন্তরে অনেক বেশি বিদ্যমান) পান এবং $ মূল পাথের গণনার উপর ভিত্তি করে পরবর্তী পাথের মান পান। দ্রষ্টব্য: সমস্ত ক্ষেত্রে একটি '/' দিয়ে শেষ হওয়া পথটি নিশ্চিত করতে rtrim বিবৃতি যুক্ত করা হয়েছে। এটি / var / www এর চেয়ে বড় হতে হবে কিনা এটি পরীক্ষা করে না / এটি সম্ভাব্য প্রতিক্রিয়া হিসাবে / var / www / প্রদান করতে পারে।

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