รับ Root Directory Path ของโครงการ PHP


115

ฉันมีโครงสร้างโฟลเดอร์นี้ในโครงการ PHP ของฉัน (ดังที่แสดงในสุริยุปราคา)

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

เมื่อลองใช้รหัสนี้

echo $_SERVER['DOCUMENT_ROOT']

เอาต์พุตคือ

D: / พื้นที่ทำงาน

ฉันจะรับเส้นทางไปยัง RootDirectory ของระบบ ( MySystem) โดยไม่เข้ารหัสชื่อโฟลเดอร์ได้อย่างไร

คำตอบ:


146

สำหรับPHP> = 5.3.0ลอง

PHP คงมายากล

__DIR__

และทำให้เส้นทางของคุณสัมพันธ์กัน

สำหรับPHP <5.3.0ลอง

dirname(__FILE__)

3
มันยอดเยี่ยมมากฉันลอง $ _SERVER ['DOCUMENT_ROOT'], dirname (), $ _SERVER ['SCRIPT_NAME'] ฯลฯ แต่มันก็ใช้ได้ดีมาก!
webblover

79
__DIR__ มันขึ้นอยู่ที่คุณใช้ มันสัมพันธ์กับไฟล์เองดังนั้นหากอยู่ใน include ภายในไดเร็กทอรีย่อยไฟล์จะไม่ส่งคืนเฉพาะไดเร็กทอรีรากของคุณ
Iris

11
จะไม่ให้ไดเรกทอรีราก
inrsaurabh

1
บันทึกย่อสำหรับทุกคนที่สะดุดในคำตอบนี้เพื่อค้นหาคำตอบของคำถามที่ถามDIRรับไดเร็กทอรีของไฟล์ปัจจุบันไม่ใช่รูทโปรเจ็กต์เว้นแต่คุณจะเรียกมันในไฟล์ที่อยู่ในรูทโปรเจ็กต์ แต่เนื่องจาก php ไม่ได้ มีแนวคิดของโครงการทุกเส้นทางต้องเป็นค่าสัมบูรณ์หรือสัมพันธ์กับตำแหน่งปัจจุบัน
MikeT

โปรดอย่าโหวตคำตอบที่ตอบคำถามไม่ถูกต้องเพียงเพราะคำตอบนั้นช่วยคุณได้
ElYeante

73

เมื่อคุณพูดอย่างนั้น

$_SERVER['DOCUMENT_ROOT']

มีเส้นทางนี้:

D:/workspace

แล้วD:คือสิ่งที่คุณกำลังมองหาใช่หรือไม่? ในกรณีนี้คุณสามารถระเบิดสตริงได้โดยเครื่องหมายทับและส่งกลับอันแรก:

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

สิ่งนี้จะส่งออกไดเร็กทอรีรูทของเซิร์ฟเวอร์

อัปเดต:เมื่อคุณใช้ค่าคงที่DIRECTORY_SEPARATORแทนเครื่องหมายทับ ( '/') รหัสนี้จะทำงานภายใต้ Windows ด้วย

การปรับปรุงที่ 2:$_SERVERตัวแปรทั่วโลกจะไม่สามารถใช้ได้เสมอ ในบรรทัดคำสั่ง (cli) เช่น ดังนั้นคุณควรใช้__DIR__แทน$_SERVER['DOCUMENT_ROOT']. __DIR__ส่งคืนเส้นทางของไฟล์ php เอง


2
และคุณสามารถใช้__DIR__แทน$_SERVER['DOCUMENT_ROOT'].
Armin

ขออภัยหากฉันอธิบายคำถามของฉันไม่ถูกต้องสิ่งที่ฉันต้องการจริงๆคือ 'D: / workspace / MySystem'
Nalaka526

1
หากพา ธ ไดเร็กทอรีรากของคุณอยู่ในรูปแบบ / var / public / www "จากนั้นใช้วิธีนี้สตริงแรกในอาร์เรย์จะว่างเปล่า (0) / (1) / (2) / (3) รูทจะเป็น สตริงที่สอง $ pathInPieces [1]
tbradley22

36

ใช้ฟังก์ชัน PHP:

getcwd()

รับไดเร็กทอรีการทำงานปัจจุบัน


1
สิ่งนี้ส่งคืนเส้นทางไฟล์ที่เรียกใช้ CURRENT ไม่ใช่เส้นทางรูท
Yousha Aleayoub

9

ฉันต้องการชี้ไปที่วิธีที่ Wordpress จัดการสิ่งนี้:

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

เนื่องจาก Wordpress มีการใช้งานหนักมากทั่วทั้งเว็บและยังทำงานได้ดีในพื้นที่ฉันจึงเชื่อมั่นในวิธีนี้มาก


1
ฉันเดาว่าสิ่งนี้ใช้ได้เฉพาะเมื่อคุณมีไดเรกทอรีสองระดับ ขวา? ฉันหมายถึงเมื่อเรียกมันจาก base_project_directory / folder1 / folder2 / folder3 / file.php มันจะไม่ส่งคืน base_project_directory
Ali Khalili

"เนื่องจาก Wordpress มีการใช้งานหนักมากทั่วทั้งเว็บและยังทำงานได้ดีในพื้นที่ฉันจึงเชื่อมั่นในวิธีนี้มาก" ฉันไม่เชื่อว่านี่เป็นข้อโต้แย้งที่ดีโดยเฉพาะอย่างยิ่งเนื่องจากคุณภาพรหัส WP และบันทึกการติดตามความปลอดภัย
Alex Barker

1
@AlexBarker ฉันจะโต้แย้งความจริงที่คุณบอกว่า WP มีประวัติการรักษาความปลอดภัยที่ไม่ดี มันค่อนข้างปลอดภัยและมีทีมตอบสนองที่มุ่งเน้นไปที่ความปลอดภัย - คอร์มีปัญหาด้านความปลอดภัยที่ถูกใช้ประโยชน์น้อยมากในช่วงไม่กี่ปีที่ผ่านมา (รวมถึงเมื่อคุณแสดงความคิดเห็น)
William Patton

3

คุณสามารถลอง: $_SERVER['PATH_TRANSLATED']

พูด:

Filesystem- (ไม่ใช่เอกสาร root-) พา ธ ไปยังสคริปต์ปัจจุบันหลังจากที่เซิร์ฟเวอร์ทำการแมปเสมือนจริงใด ๆ หมายเหตุ: ในขณะที่ PHP 4.3.2 PATH_TRANSLATEDไม่ได้ตั้งค่าโดยปริยายภายใต้ Apache 2 SAPI อีกต่อไปในทางตรงกันข้ามกับสถานการณ์ใน Apache 1 ซึ่งตั้งค่าเป็นค่าเดียวกับSCRIPT_FILENAMEตัวแปรเซิร์ฟเวอร์เมื่อไม่ได้เติมข้อมูลโดย Apache
การเปลี่ยนแปลงนี้ทำขึ้นเพื่อให้สอดคล้องกับข้อกำหนด CGI ที่ PATH_TRANSLATED ควรมีอยู่PATH_INFOก็ต่อเมื่อมีการกำหนดไว้ ผู้ใช้ Apache 2 อาจใช้AcceptPathInfo = Onภายในhttpd.confเพื่อกำหนดPATH_INFO

ที่มา: php.net/manual



0

สรุป

ตัวอย่างนี้สมมติว่าคุณรู้อยู่เสมอว่าโฟลเดอร์รูทของ apache อยู่ที่ '/ var / www /' และคุณกำลังพยายามค้นหาเส้นทางโฟลเดอร์ถัดไป (เช่น '/ var / www / my_website_folder') นอกจากนี้ยังใช้งานได้จากสคริปต์หรือเว็บเบราว์เซอร์ซึ่งเป็นสาเหตุที่มีรหัสเพิ่มเติม

รหัส PHP7

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 /' จากนั้นให้ใช้อีกวิธีหนึ่งรับ dir ปัจจุบัน (ซึ่งมีอยู่มากในโครงการ) และรับค่าพา ธ ถัดไปตามจำนวนพา ธ $ รูท หมายเหตุ: เพิ่มคำสั่ง rtrim เพื่อให้แน่ใจว่าพา ธ ส่งคืนที่ลงท้ายด้วย '/' ในทุกกรณี ไม่ได้ตรวจสอบว่าต้องมีขนาดใหญ่กว่า / var / www / แต่ยังสามารถส่งคืน / var / www / เป็นการตอบสนองที่เป็นไปได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.