পিএইচপি কি ফাইল বা কলিং কোডের সাথে সম্পর্কিত পাথ অন্তর্ভুক্ত করে?


110

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


আমার মতে গৃহীত উত্তরের চেয়ে আরও সঠিক: stackoverflow.com/a/23902890/1636522
পাতা

উত্তর:


132

এটি মূল স্ক্রিপ্টের সাথে সম্পর্কিত, এ ক্ষেত্রে এএফপি। মনে রাখবেন যে include()বর্তমানে চলমান স্ক্রিপ্টে কোড সন্নিবেশ করানো হয়েছে।

এটি হ'ল কোন ফাইলটি অন্তর্ভুক্ত অন্তর্ভুক্ত থেকে ডাকে

না।

আপনি যদি এটিকে গুরুত্বপূর্ণ করে তুলতে চান এবং বিএইচপিপি সম্পর্কিত কোনও কাজ করতে চান তবে __FILE__ধ্রুবক (বা __DIR__পিএইচপি 5.2 আইআইআরসি থেকে) ব্যবহার করুন যা সর্বদা আক্ষরিক বর্তমান ফাইলের দিকে নির্দেশ করবে যে কোডের লাইনটি অবস্থিত।

include(dirname(__FILE__)."/C.PHP");

@ পেক্কা- দুর্দান্ত - আমি যা খুজছিলাম। আরও তথ্যের জন্য, দেখুন stackoverflow.com/questions/2184810/...
Yarin

7
আপনি __DIR__যে সঠিক উদ্দেশ্যে ব্যবহার করতে পারেন ।
নিক বেডফোর্ড

1
এই উত্তরটি কিছুটা ওভারকিল: কোনও প্রয়োজন নেই include(dirname(__FILE__)."/C.PHP");, কারণ include("C.PHP");যথেষ্ট (হ্যাঁ! সিপিএইচপি বি। পিএইচপি হিসাবে একই ডিরেক্টরিতে হতে পারে) এটি কেবলমাত্র ব্যর্থ হতে পারে যখন আপনার প্রকল্পে দুটি সিপিএইচপি ফাইল থাকবে।
জনি ওয়াং

এটি আরও স্পষ্ট করার জন্য: অন্তর্ভুক্ত পাথের "./" বা "../" উপসর্গ ব্যতীত এটি B.php এবং A.php উভয়ের সাথেই সম্পর্কিত। আমার উত্তর নীচে দেখুন।
জনি ওয়াং

21

@ পেপকা আমাকে সেখানে পেয়েছে তবে আমি যা শিখেছি তা কেবল ভাগ করে নিতে চাই:

getcwd() আপনি যে ফাইলটি কার্যকর করতে শুরু করেছিলেন সেই ফাইলটি সেখানে থাকে সেই ডিরেক্টরিটি ফিরিয়ে দেয়।

dirname(__FILE__) বর্তমানে সম্পাদনকারী কোডযুক্ত ফাইলের ডিরেক্টরিটি ফিরিয়ে দেয়।

এই দুটি ফাংশন ব্যবহার করে, আপনি যা প্রয়োজন তার তুলনায় আপনি সর্বদা একটি অন্তর্ভুক্ত পথ তৈরি করতে পারেন।

উদাহরণস্বরূপ, যদি b.php এবং c.php একটি ডিরেক্টরি ভাগ করে দেয়, b.php এর মধ্যে সি.এফপি অন্তর্ভুক্ত থাকতে পারে:

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

b.php কোথা থেকে কল করা হয়েছিল তা বিবেচ্য নয়।

প্রকৃতপক্ষে, এটি আপেক্ষিক পাথ স্থাপনের পছন্দের উপায়, কারণ অতিরিক্ত কোডটি পিএইচপি থেকে লক্ষ্য ফাইলটি সনাক্ত করার চেষ্টায় অন্তর্ভুক্ত_পথ দিয়ে পুনরাবৃত্তি করা থেকে মুক্তি দেয়।

সূত্র:

Getcwd () এবং dirname (__ ফাইল__) এর মধ্যে পার্থক্য? আমার কোনটি ব্যবহার করা উচিত?

আপনার কেন নাম ব্যবহার করা উচিত (__ ফাইল__)


আমি কিছু যুক্ত করতে চাই, আমার কাছে সিএসবি.এফপি নামে একটি ফাইল ছিল, একটি ফোল্ডার থেকে একটি ফাংশন ফাইল অন্তর্ভুক্ত ছিল, এবং ফাংশনগুলির ফাইলটিতে ফাংশন ফাইল হিসাবে একই ফোল্ডার থেকে t.php নামের একটি ফাইল অন্তর্ভুক্ত ছিল, যখন আমি একটি অন্তর্ভুক্ত করার চেষ্টা করেছি t.php ফোল্ডার থেকে csb.php নামক ফাইলটি ছিল, এটি একই csb.php সহ ফাংশন ফাইল নামে পরিচিত শুরু করেছিল, কিন্তু আমি যখন দ্বিতীয় csb.php পরিবর্তিত করে সিএসবি.পিপিতে ঠিক তখনই এটি কাজ শুরু করে। সুতরাং, দেখে মনে হচ্ছে এটি প্রথম ফোল্ডারে অগ্রাধিকার দেয়, তারপরে দ্বিতীয়টি ফোল্ডার অন্তর্ভুক্ত করে!
মিগুয়েল ভিয়েরা

17
  1. যদি অন্তর্ভুক্ত পথটি শুরু হয় না ./বা ../, উদাহরণস্বরূপ:

    include 'C.php'; // precedence: include_path (which include '.' at first),
                     // then path of current `.php` file (i.e. `B.php`), then `.`.
  2. যদি অন্তর্ভুক্ত পথটি দিয়ে শুরু হয় ./বা ../, উদাহরণস্বরূপ:

    include './C.php';  // relative to '.'
    
    include '../C.php'; // also relative to '.'

উপরেরটি .বা ..তার উপরেরটি সম্পর্কিত getcwd(), যা এন্ট্রি .phpফাইলের (যেমন A.php) পাথের ডিফল্ট হয় ।

পিএইচপি 5.4.3 এ পরীক্ষিত (বিল্ডের তারিখ: 8 ই মে 2012 00:47:34)।

(এছাড়াও লক্ষ্য করুন যে chdir()এর আউটপুট পরিবর্তন করতে পারে getcwd()।)


উপসংহারে, A.php এর পাথ প্রথমে C.php এর জন্য অনুসন্ধান করা হয়, তারপরে বি.এফ.পি. এর পথটি './' বা '../' উপস্থাপিত না থাকলে অনুসন্ধান করা হয়। (ধরুন ডিফল্ট পিএইচপি'র সেটিং)
জনি ওয়াং

chdir(__DIR__)সমস্যা সমাধানের জন্য আমাকে আঁকড়ে ধরার জন্য ধন্যবাদ ।
হার্টলেসান

[...] getcwd(), যা এন্ট্রি। পিএফপি ফাইলের পথে ডিফল্ট হয় [...] - অগত্যা সত্য নয়। আমি যদি কমান্ড লাইনে পিএইচপি চালাই getcwd()তবে শেলটির বর্তমান ওয়ার্কিং ডিরেক্টরিটি উল্লেখ করা হয়, .phpআমি কোন ফাইলের আবেদন করি না কেন । আমি কল্পনা করতে পারি, যদিও, পিএইচপি যদি কোনও ওয়েব সার্ভার পরিবেশে চালিত হয় যে পরিবেশটি চলতি ডিরেক্টরিটি প্রবেশের .phpফাইলটিতে সূচনা করে । হোমব্রাবির মাধ্যমে পিএইচপি 7.2.2 ইনস্টল করে ম্যাকোএসে পরীক্ষিত।
হার্জবউব

16

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

প্রথমত, এটি পরিবেশ পরিবর্তনশীলের পথগুলি দিয়ে include_pathযাবে, যা দিয়ে সেট করা যেতে পারে ini_set। যদি এটি ব্যর্থ হয়, এটি কলিং স্ক্রিপ্টের নিজস্ব ডিরেক্টরিতে অনুসন্ধান করবে dirname(__FILE__)( __DIR__পিএইচপি> = 5.3 দিয়ে।) এটিও যদি ব্যর্থ হয় তবে কেবলমাত্র এটি ওয়ার্কিং ডিরেক্টরিতে অনুসন্ধান করবে! এটি ঠিক আছে যে, ডিফল্টরূপে, পরিবেশের পরিবর্তনশীল include_pathশুরু হয় ., যা বর্তমান ওয়ার্কিং ডিরেক্টরি। এটিই বর্তমান কারণের ডিরেক্টরি ডিরেক্টরিতে অনুসন্ধান করার একমাত্র কারণ। Http://php.net/manual/en/function.incolve.php দেখুন ।

প্রদত্ত ফাইল পাথের উপর ভিত্তি করে ফাইলগুলি অন্তর্ভুক্ত করা হয় বা যদি কোনওটি না দেওয়া হয় তবে অন্তর্ভুক্ত_পথটি নির্দিষ্ট করা হয়। যদি ফাইলটি_প্যাথটিতে খুঁজে পাওয়া যায় না, অন্তর্ভুক্তটি ব্যর্থ হওয়ার আগে কলিং স্ক্রিপ্টের নিজস্ব ডিরেক্টরি এবং বর্তমান কার্যনির্বাহী ডিরেক্টরিতে পরীক্ষা করবে।

সুতরাং, প্রশ্নের প্রথম অংশের সঠিক উত্তর হ'ল অন্তর্ভুক্ত কলিং স্ক্রিপ্টটি কোথায় রয়েছে তা বিবেচনা করে। প্রশ্নের শেষ অংশের উত্তর হ'ল ওয়েব সার্ভারের প্রসঙ্গে প্রাথমিক কার্যনির্বাহী ডিরেক্টরিটি হ'ল স্ক্রিপ্টের ডিরেক্টরি, স্ক্রিপ্ট যা পিএইচপি দ্বারা পরিচালিত হওয়ার সময় অন্য সমস্তগুলিকে অন্তর্ভুক্ত করে। একটি কমান্ড লাইনের প্রসঙ্গে, প্রম্পটে পিএইচপি আহ্বান করা হয় তখন প্রাথমিক ওয়ার্কিং ডিরেক্টরিটি যা হয় তা নয়, প্রয়োজনীয় স্ক্রিপ্ট যেখানে অবস্থিত সেই ডিরেক্টরিটি নয়। বর্তমান পরিশ্রমী ডিরেক্টরি তবে, পিএইচপি ফাংশন চালানোর সময়ে পরিবর্তন করা যাবে chdirHttp://php.net/manual/en/function.chdir.php দেখুন ।

এই অনুচ্ছেদটি অন্যান্য উত্তরে মন্তব্য করার জন্য যুক্ত করা হয়েছে। কেউ কেউ উল্লেখ করেছেন যে নির্ভর করা include_pathকম শক্তিশালী এবং সুতরাং পুরো পথ যেমন যেমন ./pathবা ব্যবহার করা ভাল __DIR__ . /path। কেউ কেউ এ পর্যন্ত বলেছিলেন যে ওয়ার্কিং ডিরেক্টরিতে নির্ভর করা .নিজেই নিরাপদ নয়, কারণ এটি পরিবর্তন করা যেতে পারে। তবে কিছু সময় আপনাকে পরিবেশের মূল্যবোধের উপর নির্ভর করতে হবে। উদাহরণস্বরূপ, আপনি include_pathখালি সেটটি পেতে চাইবেন , যাতে কলিং স্ক্রিপ্টের ডিরেক্টরিটি বর্তমান কার্যনির্বাহী ডিরেক্টরিটির আগেও এটি অনুসন্ধান করবে এমন প্রথম স্থান। কোডটি ইতিমধ্যে বাহ্যিক উত্স থেকে নিয়মিত লিখিত এবং আপডেট করা হতে পারে এবং কোডটি আপডেট হওয়ার সাথে সাথে আপনি উপসর্গটি পুনরায় সন্নিবেশ করতে চান না __DIR__


"যদি এটি ব্যর্থ হয়, এটি dirname(__FILE__) (__DIR__)php> = 5.3 দিয়ে কলিং স্ক্রিপ্টের নিজস্ব ডিরেক্টরিতে অনুসন্ধান করবে ))" আপনি কি নিশ্চিত? এটি কোথায় নথিবদ্ধ? আমি আশা করি আপনি ভুল হয়, এবং পিএইচপি নেই না ব্যবহার __FILE__এবং __DIR__জন্য এই উদ্দেশ্য, যে হিসাবে অবিলম্বে থেকে "সহোদর" স্ক্রিপ্ট সহ বিরতি দেবে সিমলিঙ্ক বেশী! : -ও (যা ভাগ্যক্রমে, এখানে আমার 7.1 সেটআপে সূক্ষ্মভাবে কাজ করতে দেখা যায়))
এসজেড।

6

সংক্ষিপ্ত উত্তর: এটি স্ক্রিপ্ট সহ সম্পর্কিত।

টিএফএম এটি সঠিকভাবে ব্যাখ্যা করে:

যদি ফাইলটি_পথে পাওয়া যায় না, অন্তর্ভুক্ত কলিং স্ক্রিপ্টের ডিরেক্টরি এবং বর্তমান কার্যনির্বাহী ডিরেক্টরিতে পরীক্ষা করবে

সুতরাং, যদি /app/main.php বলে include("./inc.php")যে এটি /app/inc.php খুঁজে পাবে

./ কঠোরভাবে প্রয়োজন নেই কিন্তু include_path কোন নির্ভরতা সরিয়ে ফেলা হয়।

কেউ কারও সাথে এটি পরিবর্তন করে সে ক্ষেত্রে আমি বর্তমান ওয়ার্কিং ডিরেক্টরিতে ফাইলগুলি অন্তর্ভুক্ত করার সন্ধানের উপর নির্ভর করব না chdir()


সুতরাং আপনি যদি স্ট্রিংটি শুরু করেন ./, এটি কলিং স্ক্রিপ্টের ডিরেক্টরিটি প্রথমে বা বর্তমান ওয়ার্কিং ডিরেক্টরিটি আগে পরীক্ষা করে?
পেসিয়ার

2
@ ডেনিস হাও না, আপনার অন্তর্ভুক্তির পথটি যদি শুরু হয় তবে আপনি ইতিমধ্যে বর্তমান ওয়ার্কিং ডিরেক্টরিের উপর নির্ভরশীল ./। যেমন chdir ("/ অ্যাপ্লিকেশন / অন্যান্য") include("./inc.php")ব্যর্থ হবে make সুতরাং, include("inc.php")এই ক্ষেত্রে নিরাপদ হতে ব্যবহার করুন ।
জনি ওয়াং

@ পেসারিয়ার যদি স্ট্রিংটি। / অথবা ../ দিয়ে শুরু হয় তবে এটি কেবল বর্তমান কার্যক্ষম ডিরেক্টরিটি পরীক্ষা করে। (অন্তর্ভুক্ত_পথ এবং কলিং স্ক্রিপ্টের ডিরেক্টরি (বিএফপি) উভয়ই উপেক্ষা করা হবে)। আরও বিস্তারিত জানার জন্য আমার উত্তর দেখুন।
জনি ওয়াং

-2
dir
-> a.php
-> c.php

- dir2 
-> b.php

অন্তর্ভুক্ত করার জন্য abআপনি প্রয়োজনinclude("../a.php");

অন্তর্ভুক্ত করার জন্য bcআপনি প্রয়োজনinclude("dir2/b.php");


4
@ অলি- আপনি প্রশ্নের বিন্দুটি মিস করছেন- আমি যখন জিজ্ঞাসা করছিলাম যে অন্তর্ভুক্ত রয়েছে যখন শৃঙ্খলিত হয় তখন কীভাবে আপেক্ষিক পথ নির্ধারণ করা হয়।
ইয়ারিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.