กำลังตรวจสอบการมีอยู่ของไฟล์ วิธีตรวจสอบการมีอยู่ของไฟล์ใน PHP

มีบางครั้งที่คุณต้องตรวจสอบว่ามีหรือไม่ ไฟล์ที่ระบุหรือไม่ เช่น เพื่อดำเนินการบางอย่างกับไฟล์ในภายหลัง

ฉันยังพบปัญหานี้เมื่อพัฒนาโมดูล และฉันพบสองทางเลือกในการแก้ปัญหา

การตรวจสอบการมีอยู่ของไฟล์โดยใช้ลิงก์ URL

ใน PHP มีฟังก์ชั่น " โฟเพน" ซึ่งสามารถใช้เพื่อเปิด URL ที่ระบุได้

เรากำลังทำอะไรอยู่? เราพยายามเปิดไฟล์ และหากเราทำสำเร็จ ไฟล์นั้นก็จะมีอยู่ มิฉะนั้น ไฟล์นั้นก็จะไม่มีอยู่จริง

การนำไปปฏิบัติ:

แต่จะเกิดอะไรขึ้นถ้าเราไม่มีไฟล์เดียว แต่มีลิงก์หลายชุดล่ะ? นี่เป็นงานที่ยืนอยู่ตรงหน้าฉันตั้งแต่แรกเริ่ม และวิธีการแก้ไขปัญหานี้มีดังนี้:

ในกรณีนี้ เราได้รับรายการเฉพาะไฟล์ที่มีอยู่เท่านั้น

การตรวจสอบการมีอยู่ของไฟล์ในเครื่อง

คำว่า "ท้องถิ่น" หมายความว่าสคริปต์และไฟล์สำหรับการตรวจสอบอยู่บนเซิร์ฟเวอร์เดียวกัน ถ้าคุณมีเพียงพอ อาร์เรย์ขนาดใหญ่ลิงก์ - ตัวเลือกนี้ดีที่สุดสำหรับการแก้ปัญหา เนื่องจากเราไม่ได้ทำการร้องขอ เซิร์ฟเวอร์ของบุคคลที่สามแต่กำลังสแกนไดเร็กทอรีที่ระบุ

วิธีการนี้ใช้ฟังก์ชัน "file_exists" และคล้ายกับ รุ่นก่อนหน้าเพียงแทนที่ส่วนหนึ่งของสคริปต์:

และเช่นเดียวกันสำหรับอาร์เรย์ลิงก์:

มันคุ้มค่าอะไร บันทึก- ความจริงที่ว่าวิธีนี้สะดวกสำหรับการเรียกใช้ไฟล์ที่อยู่ในของเรา ระบบไฟล์- ดังนั้นจึงแนะนำให้ระบุลิงก์ทั้งหมดเป็นลิงก์ที่เกี่ยวข้อง

อย่างไรก็ตาม เมื่อทำการสั่งซื้อรายการใดรายการหนึ่ง ด้วยวิธีนี้ฉันสามารถสแกนไฟล์ได้ประมาณ 135,000 ไฟล์ในเวลาเพียงไม่กี่วินาที

พารามิเตอร์ที่จำเป็นสำหรับฟังก์ชันนี้คือชื่อพาธ ซึ่งระบุเส้นทางไปยังไดเร็กทอรีที่จะสร้าง

เอ็มเคดิร์( "แฟ้มใหม่" );

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

เอ็มเคดิร์( "../แฟ้มใหม่" ); // ลงไปหนึ่งระดับ

mkdir("/folder1/folder2/newfolder" ); //เส้นทางเต็ม

ในตัวอย่างสุดท้าย ข้อกำหนดเบื้องต้นจะมีการมีอยู่ของไดเรกทอรีย่อย "folder1" และ "folder2" หากไม่มีอยู่ ฟังก์ชันในแบบฟอร์มนี้จะไม่สามารถสร้างโฟลเดอร์ได้และจะส่งคืนข้อผิดพลาด:

คำเตือน: mkdir() : ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าวใน ...

หากสำเร็จ ฟังก์ชันจะส่งคืน คุณค่าที่แท้จริง- หากไม่ได้สร้างแพ็ก จะส่งกลับค่าเท็จ

ถ้า (mkdir("โฟลเดอร์ใหม่"))
เสียงสะท้อน "สร้างโฟลเดอร์สำเร็จแล้ว";
อื่น
เสียงสะท้อน "ไม่ได้สร้างโฟลเดอร์";

แต่คุณไม่ควรใช้ฟังก์ชันนี้โดยไม่ตรวจสอบว่ามีโฟลเดอร์อยู่หรือไม่ เนื่องจากเซิร์ฟเวอร์จะยังคงแสดงข้อผิดพลาดว่าไม่สามารถสร้างโฟลเดอร์ได้

การกำหนดสิทธิ์เมื่อสร้างโฟลเดอร์

พารามิเตอร์ทางเลือกตัวที่สองของฟังก์ชัน mkdir มีหน้าที่รับผิดชอบในการกำหนดสิทธิ์ให้กับโฟลเดอร์ที่สร้างขึ้น ตามค่าเริ่มต้น สิทธิ์สูงสุดจะถูกกำหนด – 0777

สิทธิ์ถูกกำหนดเป็นค่าฐานแปดโดยมีศูนย์นำหน้าบังคับ นอกเหนือจากศูนย์ตัวแรกแล้ว ตัวเลขยังแสดงถึงระดับการเข้าถึงสำหรับเจ้าของ สำหรับกลุ่มของเจ้าของ และสำหรับคนอื่นๆ ทั้งหมด

0 – การเข้าถึงถูกปฏิเสธ;

1 – การเข้าถึงเพื่ออ่าน;

2 – การเข้าถึงการเขียน;

4 – การเข้าถึงการดำเนินการ

ส่วนใหญ่แล้ว สิทธิ์จะถูกระบุเป็นจำนวนรวม เช่น:

7 – เข้าถึงได้เต็มรูปแบบ (1+2+4);

5 – การอ่านและการดำเนินการ (1+4)

เอ็มเคดิร์( "โฟลเดอร์ใหม่" , 0777); // เข้าถึงได้อย่างเต็มที่สำหรับทุกคน

การสร้างไดเร็กทอรีย่อยที่ซ้อนกันหลายรายการ

คุณสามารถสร้างโฟลเดอร์ย่อยได้หลายโฟลเดอร์พร้อมกันโดยเพียงระบุพารามิเตอร์บูลีนเสริมอื่น – แบบเรียกซ้ำ

mkdir("folder1/folder2/newfolder" , 0777, จริง ); // เข้าถึงได้อย่างเต็มที่สำหรับทุกคน

ในกรณีนี้ หากไม่มีโฟลเดอร์ "folder1" และ "folder2" ฟังก์ชันจะสร้างทั้งโฟลเดอร์เหล่านั้นและโฟลเดอร์ "newfolder" หากไม่มีปัญหาอื่นๆ เกิดขึ้น จะไม่มีข้อความแสดงข้อผิดพลาดปรากฏขึ้น และฟังก์ชันจะส่งกลับค่า True

กำลังลบโฟลเดอร์

โฟลเดอร์ว่างใน PHP สามารถลบได้โดยใช้ฟังก์ชัน rmdir พารามิเตอร์ dirname ยังระบุพาธแบบเต็มหรือพาธสัมพันธ์ไปยังไดเร็กทอรีที่ต้องการลบ:

rmdir( "โฟลเดอร์ของฉัน" );

rmdir("folder1/folder2/myfolder" );

ในแต่ละกรณี เฉพาะโฟลเดอร์ "myfolder" เท่านั้นที่ถูกลบ หากไม่มีโฟลเดอร์หรือระบุเส้นทางไม่ถูกต้อง ข้อผิดพลาดจะปรากฏขึ้น:

คำเตือน: rmdir(myfolder) : ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าวใน ...

การลบโฟลเดอร์ที่ไม่ว่างเปล่า

การลบไดเร็กทอรีที่ไม่ว่างเปล่าทำได้โดยการลบไฟล์ย่อยในโฟลเดอร์ตามลำดับด้วยฟังก์ชัน unlink จากนั้นจึงลบ โฟลเดอร์เปล่าฟังก์ชัน rmdir คุณสามารถใช้ฟังก์ชันเช่นนี้เพื่อทำสิ่งนี้:

ฟังก์ชั่น my_delete_dir($mypath)(
$dir = opendir($mypath);
ในขณะที่ (($file = readdir($dir)))(
ถ้า (is_file($mypath."/" .$file))
ยกเลิกการเชื่อมโยง($mypath. "/" .$ไฟล์);
elseif (is_dir($mypath"/" .$file) && ($file != "." ) && ($file != ".." ))
my_delete_dir($mypath"/" .$file);
}
ปิด($dir);
rmdir($mypath);
}

my_delete_dir("โฟลเดอร์ของฉัน" ); // การเรียกใช้ฟังก์ชัน

การตรวจสอบการมีอยู่ของไดเร็กทอรี

ก่อนที่จะดำเนินการกับไดเร็กทอรีส่วนใหญ่ ควรตรวจสอบว่ามีอยู่หรือไม่ ฟังก์ชัน file_exists ใช้สำหรับสิ่งนี้

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

ถ้า (file_exists("myfolder"))
เสียงสะท้อน "มีโฟลเดอร์ที่ระบุอยู่";
อื่น
เสียงสะท้อน "ไม่มีโฟลเดอร์ที่ระบุ";

ถ้า (is_dir("myfolder"))
เสียงสะท้อน "วัตถุโฟลเดอร์ที่ระบุ";
อื่น
เสียงสะท้อน "วัตถุที่ระบุไม่ใช่โฟลเดอร์";

การใช้ฐานข้อมูลอย่างแพร่หลายไม่ได้ทำให้ระบบไฟล์ทั่วไปไม่เกี่ยวข้อง การเขียนและการอ่านไฟล์ยังคงต้องใช้เวลา สถานที่สำคัญในการเขียนโปรแกรม

อัลกอริทึมสำหรับตรวจสอบการมีอยู่ของไฟล์ช่วยให้คุณหลีกเลี่ยงข้อผิดพลาดเมื่อรันโค้ด ฟังก์ชัน PHP file_exists นำเสนอวิธีแก้ปัญหาง่ายๆ สำหรับการตรวจสอบการมีอยู่ของไฟล์หรือไดเร็กทอรี

ไวยากรณ์และการใช้ฟังก์ชัน file_exists

ผลลัพธ์ของฟังก์ชันเป็นจริงหรือเท็จ พารามิเตอร์เดียวคือชื่อไฟล์และเส้นทางไปยังไฟล์นั้น ผลลัพธ์ของฟังก์ชันถูกแคชไว้ เนื่องจากหาก PHP file_exists ไม่ทำงาน แต่มีไฟล์อยู่จริง แสดงว่านี่เป็นข้อผิดพลาดของอัลกอริทึม

ด้วยการใช้ฟังก์ชัน clearstatcache() คุณสามารถหลีกเลี่ยงข้อผิดพลาดมากมายในการตรวจสอบสถานะของระบบไฟล์ที่สามารถเข้าถึงได้ แต่ก็ควรจำไว้ว่าเมื่อไม่มีอยู่จริง ไฟล์ PHP file_exists จะส่งคืนค่า false จนกว่าไฟล์ดังกล่าวจะถูกสร้างขึ้น จากนั้นจะส่งคืนค่าจริงแม้ว่าจะถูกลบไปแล้วก็ตาม

การผสมผสานที่ถูกต้องของฟังก์ชัน clearstatcache() และฟังก์ชันที่เกี่ยวข้องกับระบบไฟล์ (เช่น is_writable(), is_readable(), is_executable(), is_file(), is_dir() และอื่น ๆ ) ช่วยให้คุณหลีกเลี่ยงการเรียกใช้สคริปต์ "ซ่อน" ข้อผิดพลาด

การแคชช่วยปรับปรุงประสิทธิภาพของระบบได้อย่างมาก แต่ในบางกรณี ไฟล์สำคัญสามารถสร้างผลลัพธ์ที่ไม่น่าเชื่อถืออย่างแท้จริง และทำให้เกิดข้อผิดพลาดรันไทม์ร้ายแรงและยากต่อการตรวจจับ

พารามิเตอร์ฟังก์ชัน PHP file_exists

PHP สามารถติดตั้งได้บนแพลตฟอร์มคอมพิวเตอร์ที่แตกต่างกัน ดังนั้นพาธและชื่อไฟล์จึงอาจแตกต่างกัน

เอกสารระบุว่าเมื่อใด ตรวจสอบ PHPมุ่งเน้นไปที่ UID/GID มากกว่าตัวระบุที่มีประสิทธิภาพ การพัฒนาอัลกอริทึม โดยใช้ PHP file_exists คุณควรใส่ใจไม่เพียง แต่เครื่องหมายทับที่ถูกต้อง (ไปข้างหน้าหรือข้างหลัง) การเข้ารหัสเส้นทางไปยังไฟล์และชื่อของไฟล์เท่านั้น แต่ยังตรวจสอบการมีอยู่ของตัวพิมพ์ที่ต้องการอักขระที่ถูกต้องสิทธิ์การเข้าถึง และสถานการณ์อื่นๆ

บน ผลลัพธ์เชิงลบการเข้ารหัสของไฟล์สคริปต์อาจได้รับผลกระทบ และอาจจำเป็นต้องแปลงสตริงอักขระที่ดึงมาจากฐานข้อมูล

การใช้ฟังก์ชันในทางปฏิบัติ

พื้นที่ใช้งาน สคริปต์ PHPแตกต่างกันอย่างมีนัยสำคัญ นี่ไม่ได้เป็นการบอกว่า PHP file_exists ใช้สำหรับการจัดเก็บเพียงอย่างเดียว ข้อมูลระบบไฟล์ข้อมูล วัตถุ หรือรูปภาพที่สร้างขึ้นแบบไดนามิก

มีกรณีการใช้กระแสน้ำเกิดขึ้นบ่อยครั้ง ปริมาณมากข้อมูลชั่วคราวที่ไม่มีประสิทธิภาพในการลงฐานข้อมูลทันที ข้อมูลจากผู้เยี่ยมชมหลายรายสามารถไหลไปยังไซต์ได้ และหลังจากการประมวลผลเบื้องต้นในช่วงระยะเวลาหนึ่งเท่านั้น ข้อมูลที่จำเป็นจะต้องวางไว้ในตารางฐานข้อมูล

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

มีบางครั้งที่คุณต้องตรวจสอบว่ามีไฟล์ที่ระบุอยู่หรือไม่ เช่น เพื่อดำเนินการบางอย่างกับไฟล์ในภายหลัง

ฉันยังพบปัญหานี้เมื่อพัฒนาโมดูล และฉันพบสองทางเลือกในการแก้ปัญหา

การตรวจสอบการมีอยู่ของไฟล์โดยใช้ลิงก์ URL

ใน PHP มีฟังก์ชั่น " โฟเพน" ซึ่งสามารถใช้เพื่อเปิด URL ที่ระบุได้

เรากำลังทำอะไรอยู่? เราพยายามเปิดไฟล์ และหากเราทำสำเร็จ ไฟล์นั้นก็จะมีอยู่ มิฉะนั้น ไฟล์นั้นก็จะไม่มีอยู่จริง

การนำไปปฏิบัติ:

แต่จะเกิดอะไรขึ้นถ้าเราไม่มีไฟล์เดียว แต่มีลิงก์หลายชุดล่ะ? นี่เป็นงานที่ยืนอยู่ตรงหน้าฉันตั้งแต่แรกเริ่ม และวิธีการแก้ไขปัญหานี้มีดังนี้:

ในกรณีนี้ เราได้รับรายการเฉพาะไฟล์ที่มีอยู่เท่านั้น

การตรวจสอบการมีอยู่ของไฟล์ในเครื่อง

คำว่า "ท้องถิ่น" หมายความว่าสคริปต์และไฟล์สำหรับการตรวจสอบอยู่บนเซิร์ฟเวอร์เดียวกัน หากคุณมีลิงก์จำนวนมาก ตัวเลือกนี้เหมาะที่สุดสำหรับการแก้ปัญหา เนื่องจากเราไม่ได้ส่งคำขอไปยังเซิร์ฟเวอร์บุคคลที่สาม แต่กำลังสแกนไดเรกทอรีที่ระบุ

วิธีการนี้ใช้ฟังก์ชัน "file_exists" และโดยการเปรียบเทียบกับตัวเลือกก่อนหน้า เพียงแทนที่ส่วนหนึ่งของสคริปต์:

และเช่นเดียวกันสำหรับอาร์เรย์ลิงก์:

มันคุ้มค่าอะไร บันทึก- ความจริงที่ว่าวิธีนี้สะดวกสำหรับการเรียกใช้ไฟล์ที่อยู่ในระบบไฟล์ของเรา ดังนั้นจึงแนะนำให้ระบุลิงก์ทั้งหมดเป็นลิงก์ที่เกี่ยวข้อง

อย่างไรก็ตาม เมื่อทำการสั่งซื้อรายการใดรายการหนึ่ง ด้วยวิธีนี้ฉันสามารถสแกนไฟล์ได้ประมาณ 135,000 ไฟล์ในเวลาเพียงไม่กี่วินาที