কীভাবে পিএইচপি ফাইলগুলি অন্তর্ভুক্ত করবেন যেগুলির জন্য একটি পরম পথ প্রয়োজন?


96

আমার নীচের মত ডিরেক্টরি কাঠামো আছে;

স্ক্রিপ্ট.এফপি

inc / સમાવેશ1.php
inc / অন্তর্ভুক্ত 2.php

অবজেক্টস / অবজেক্ট 1.এফপি
অবজেক্টস / অবজেক্ট 2.এফপি

সাবান / সাবান.এফপি

এখন, আমি এই দুটি জিনিসই ব্যবহার করি script.phpএবং /soap/soap.php, আমি সেগুলি সরাতে পারি, তবে আমি একটি নির্দিষ্ট কারণে ডিরেক্টরি কাঠামো চাই। script.phpঅন্তর্ভুক্ত পথটি কার্যকর করার inc/include.phpসময় এবং /soap/soap.phpএটি সম্পাদন করার সময় ../incনিখুঁত পাথগুলি কাজ করে, /mnt/webdev/[project name]/inc/include1.php...তবে আমি কখনই ডিরেক্টরিটি অন্য কোনও জায়গায় সরিয়ে নিতে চাই তবে এটি একটি কুশ্রী সমাধান।

তাহলে কি আপেক্ষিক পাথগুলি ব্যবহার করার কোনও উপায় আছে, না প্রোগ্রামিকভাবে উত্পন্ন করার কোনও উপায় "/mnt/webdev/[project name]/"?

উত্তর:


150

এই কাজ করা উচিত

$root = realpath($_SERVER["DOCUMENT_ROOT"]);

include "$root/inc/include1.php";

সম্পাদনা করুন: অ্যাসিভিওকিংয়ের মাধ্যমে ইমপ্রোভমেন্ট যুক্ত হয়েছে


4
সতর্কতা অবলম্বন করুন, আপনি যদি এমন একটি ওয়েব সার্ভারের মাধ্যমে স্ক্রিপ্টটি কার্যকর করেন যা কেবল কার্যকর হয়DOCUMENT_ROOT
ফিল

কেবল একটি প্রশ্ন, কেন real _SERVER ["DOCUMENT_ROOT"] এর জন্য রিয়েলপথ ()? এটি কি সর্বদা আধ্যাত্মিক পথে আউটপুট দেয় না?
জোয়াও মধ্যে Pimentel ফেরেইরা

44

আপনি আপেক্ষিক পাথ ব্যবহার করতে পারেন। ব্যবহার করে দেখুন __FILE__। এটি একটি পিএইচপি ধ্রুবক যা সর্বদা এতে থাকা স্ক্রিপ্টের পথ / ফাইলের নাম দেয় returns সুতরাং, ইন soap.php, আপনি এটি করতে পারেন:

include dirname(__FILE__).'/../inc/include.php';

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

আর একটি সমাধান হ'ল আপনার httpd.conf বা একটি .htaccess ফাইলটিতে অন্তর্ভুক্ত পথ সেট করা ।


8
আমার মনে /হয় উদ্ধৃত অভিব্যক্তিটির শুরুতে ..আপনার ফাইলের নাম থেকে আলাদা করতে হবে ।
ডুনারিল

9
নোট করুন যে পিএইচপি 5.3.0 থেকে আপনি যাদু স্থির ব্যবহারের __DIR__পরিবর্তে ব্যবহার করতে পারেন dirname(__FILE__)(পিএইচপি ডক্স)
এরউইন ওয়েসেলস

4
include dirname(__FILE__).'/../inc/include.php';আপেক্ষিক পথের আগে "/" ভুলবেন না।
স্টিভেন লিমবার্গ

6

এটি হ্যান্ডেল করার আরেকটি উপায় যা এর জন্য যে কোনও প্রয়োজনও সরিয়ে দেয় অটোল্যাড বৈশিষ্ট্যটি ব্যবহার করা । "জাস্ট ইন কেস" আপনার স্ক্রিপ্টের যাবতীয় সবকিছু অন্তর্ভুক্ত করা কার্য সম্পাদনকে বাধা দিতে পারে। যদি আপনার অন্তর্ভুক্তগুলি সমস্ত শ্রেণি বা ইন্টারফেস সংজ্ঞা হয় এবং আপনি কেবল যখন প্রয়োজন তখন সেগুলি লোড করতে চান, আপনি __autoload()উপযুক্ত শ্রেণীর ফাইল খুঁজে পেতে আপনার নিজের কোড দিয়ে ফাংশনটি ওভারলোড করতে পারেন এবং যখনই ডাকা হবে তখনই এটি লোড করতে পারেন। ম্যানুয়াল থেকে উদাহরণ এখানে:

function __autoload($class_name) {
    require_once $class_name . '.php';
}

$obj  = new MyClass1();
$obj2 = new MyClass2(); 

যতক্ষণ আপনি সেই অনুসারে আপনার অন্তর্ভুক্ত_পথ ভেরিয়েবল সেট করবেন ততক্ষণ আপনার আর কোনও ক্লাস ফাইল অন্তর্ভুক্ত করার দরকার নেই।



5

আপনি আপনার প্রকল্পের মূল ডিরেক্টরিতে যাওয়ার পথটির সাথে একটি ধ্রুবককে সংজ্ঞায়িত করতে পারেন এবং তারপথটি পথের শুরুতে রেখে দিতে পারেন।


2

কেভিনের সাথে সম্পর্কিত অন্য একটি বিকল্পটি ব্যবহার করা হচ্ছে __FILE__, তবে পরিবর্তে পিএইচপি ফাইলের নামটি এর মধ্যে থেকে প্রতিস্থাপন করুন:

<?php

$docRoot = str_replace($_SERVER['SCRIPT_NAME'], '', __FILE__);
require_once($docRoot . '/lib/include.php');

?>

আমি এটি কিছুক্ষণ ব্যবহার করছি। একমাত্র সমস্যাটি কখনও কখনও আপনার না থাকে $_SERVER['SCRIPT_NAME']তবে কখনও কখনও একই রকম আরেকটি পরিবর্তনশীল থাকে।


2

আমি এটি খুব ভাল কাজ খুঁজে পেয়েছি!

function findRoot() { 
    return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1)));
}

ব্যবহার:

<?php

function findRoot() {
    return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1)));
}

include(findRoot() . 'Post.php');
$posts = getPosts(findRoot() . 'posts_content');

include(findRoot() . 'includes/head.php');

for ($i=(sizeof($posts)-1); 0 <= $i; $i--) {
    $posts[$i]->displayArticle();
}

include(findRoot() . 'includes/footer.php');

?>

1

আমি মনে করি সর্বোত্তম উপায় হ'ল আপনার পিএইচপিগুলিতে আপনার অন্তর্ভুক্তগুলি অন্তর্ভুক্ত রাখার পথ। আপনার সেটআপের উপর নির্ভর করে এটি করার বিভিন্ন উপায় রয়েছে।

তারপরে আপনি কেবল উল্লেখ করতে পারেন

require_once 'inc1.php';

আপনার অন্তর্ভুক্ত বা আপনার ওয়েব অ্যাক্সেসযোগ্য ফাইলগুলিতে বা নেস্টেড সাব-ডিরেক্টরিগুলির যে কোনও স্তরের তা নির্বিশেষে কোনও ফাইলের অভ্যন্তর থেকে।

এটি আপনাকে ওয়েব সার্ভারের মূলের বাইরে আপনার অন্তর্ভুক্ত ফাইলগুলি রাখতে দেয় যা একটি সেরা অনুশীলন।

যেমন

site directory
    html (web root)
        your web-accessible files
    includes
        your include files

এছাড়াও, ক্লাস ফাইলগুলির অলস লোডিংয়ের জন্য __আউটোলয়েড পরীক্ষা করে দেখুন

http://www.google.com/search?q=setting+php+inc++ पथ

http://www.google.com/search?q=__autoload


1
require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/path/to/file.php");

আমি কোড এই লাইন ব্যবহার। এটি সাইট গাছের "শীর্ষে" ফিরে যায়, তারপরে পছন্দসই ফাইলটিতে যায়।

উদাহরণস্বরূপ, আসুন আমি বলি যে আমার কাছে এই ফাইল ট্রি রয়েছে:

ডোমেইন.com/
aaa/ index.php ডোমেইন. com/
bbb/ ccc/ ddd/ index.php ডোমেইন. com/ _resources/ funitions.php

আমি যেখানেই থাকি না কেন ফাংশন.এফপি ফাইল অন্তর্ভুক্ত করতে পারি, কেবল অনুলিপি কপি করে

require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/_resources/functions.php");

আপনার যদি এই কোডটি বহুবার ব্যবহারের প্রয়োজন হয় তবে আপনি একটি ফাংশন তৈরি করতে পারেন যা str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))অংশটি ফিরে দেয় । তারপরে আপনি অন্তর্ভুক্ত প্রথম ফাইলটিতে এই ফাংশনটি সন্নিবেশ করুন। আমার কাছে একটি "ইনিশিয়াল.এফপি" ফাইল রয়েছে যা আমি প্রতিটি পিএইচপি পৃষ্ঠার একেবারে শীর্ষে অন্তর্ভুক্ত করি এবং এতে এই ফাংশন রয়েছে। পরের বার যখন আমাকে ফাইলগুলি অন্তর্ভুক্ত করতে হবে, আমি আসলে ফাংশনটি ব্যবহার করি (নাম দেওয়া path_back):

require(path_back()."/_resources/another_php_file.php");

0

@ ফ্লুবা, এটি কি আমাকে আমার অন্তর্ভুক্ত ডিরেক্টরিতে ফোল্ডার রাখতে দেয়? ফ্ল্যাট অন্তর্ভুক্ত ডিরেক্টরি আমাকে দুঃস্বপ্ন দেয়। পুরো অবজেক্ট ডিরেক্টরি হিসাবে Inc ডিরেক্টরিতে থাকা উচিত।

ওহ হ্যাঁ, একেবারে। সুতরাং উদাহরণস্বরূপ, আমরা সাবফোল্ডারগুলির একটি একক স্তর ব্যবহার করি, সাধারণত:

require_once('library/string.class.php')

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

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

'model/user.class'
'controllers/front.php'

বা যাই হোক না কেন.

তবে সাধারণভাবে বলতে গেলে, এটি আপনাকে কেবল আপনার পিএইচপি-তে খুব ছোট্ট পাথের সাথে কাজ করতে দেয় যা যে কোনও জায়গা থেকে কাজ করবে এবং এই সমস্ত রিয়েলপথ ডকুমেন্ট রুট ম্যালার্কির চেয়ে পড়তে অনেক সহজ।

এই স্ক্রিপ্ট-ভিত্তিক বিকল্পগুলির সুবিধা অন্যরা বলেছে যে তারা যে কোনও জায়গায়, এমনকি ভাগ করা বাক্সেও কাজ করে; অন্তর্ভুক্ত পথটি নির্ধারণের জন্য আরও কিছু চিন্তা ও প্রচেষ্টা দরকার তবে আমি যেমন উল্লেখ করেছি আপনাকে __autoload ব্যবহার শুরু করতে দেয় যা কেবলমাত্র দুর্দান্ত।


0

আপনি যদি নিজের অ্যাপ্লিকেশনটির বেশিরভাগ ফাইলের মধ্যে নির্দিষ্ট পাথ অন্তর্ভুক্ত করতে চলেছেন তবে আপনার মূল ফোল্ডারে একটি বৈশ্বিক পরিবর্তনশীল তৈরি করুন।

define("APPLICATION_PATH", realpath(dirname(__FILE__) . '/../app'));
or 
define("APPLICATION_PATH", realpath(DIR(__FILE__) . '/../app'));

এখন এই গ্লোবাল ভেরিয়েবল " APPLICATION_PATH " প্রতিবার নতুন ফাইল অন্তর্ভুক্ত করে রিয়েলপ্যাথ () কল করার পরিবর্তে সমস্ত ফাইল অন্তর্ভুক্ত করতে ব্যবহার করা যেতে পারে।

প্রাক্তন:

include(APPLICATION_PATH ."/config/config.ini";

আশা করি এটা সাহায্য করবে ;-)

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