8 ปีที่แล้ว
หากคุณต้องการหลีกเลี่ยงการเรียก exit() ใน FastCGI ตามความคิดเห็นด้านล่าง แต่จริงๆ แล้วต้องการออกจากการเรียกใช้ฟังก์ชันที่ซ้อนกันหรือรวมไว้ในเชิงบวก ให้ลองพิจารณาใช้วิธี Python:
กำหนดข้อยกเว้นชื่อ `SystemExit" โยนมันแทนการเรียก exit() และจับมันใน index.php ด้วยตัวจัดการว่างเพื่อสิ้นสุดการเรียกใช้สคริปต์อย่างหมดจด
// ไฟล์: index.php
คลาส SystemExit ขยายข้อยกเว้น ()
พยายาม (
/* รหัส รหัส */
}
catch (SystemExit $e ) ( /* ไม่ทำอะไรเลย */ )
// สิ้นสุดไฟล์: index.php
// ฟังก์ชันที่ซ้อนกันอย่างล้ำลึกหรือไฟล์ .php
ถ้า(SOME_EXIT_CONDITION)
โยน SystemExit ใหม่ (); // แทน exit()
?>
10 ปีที่แล้ว
Jbezorg ที่ gmail เสนอสิ่งต่อไปนี้:
header("ตำแหน่ง: /");
?>
หลังจากส่งส่วนหัว `Location:" PHP _will_ ทำการแยกวิเคราะห์ต่อไป และโค้ดทั้งหมดที่อยู่ใต้การเรียก header() จะยังคงดำเนินการอยู่ ดังนั้นให้ใช้:
ถ้า($_SERVER [ "SCRIPT_FILENAME" ] == __FILE__ )
{
header("ตำแหน่ง: /");
ออก;
}
?>
10 ปีที่แล้ว
สู่ความร่ำรวย dot Lovely ที่ klikzltd dot co dot uk:
การใช้ "@" ก่อนหน้า header() เพื่อระงับข้อผิดพลาด และการอาศัยข้อผิดพลาด "ส่วนหัวที่ส่งไปแล้ว" ดูเหมือนเป็นความคิดที่แย่มากสำหรับฉันในขณะที่สร้างเว็บไซต์ที่จริงจัง
นี่ไม่ใช่ *ไม่ใช่* วิธีที่สะอาดในการป้องกันไม่ให้ไฟล์ถูกเรียกโดยตรง อย่างน้อยนี่ก็ไม่ใช่วิธีที่ปลอดภัย เนื่องจากคุณต้องอาศัยข้อยกเว้นที่ส่งโดย parser ณ รันไทม์
ฉันแนะนำให้ใช้วิธีทั่วไปในการกำหนดค่าคงที่หรือกำหนดตัวแปรด้วยค่าใดก็ได้ และตรวจสอบการมีอยู่ของตัวแปรในสคริปต์ที่รวมไว้ เช่น:
ใน index.php:
ในไฟล์ที่คุณรวมไว้:
บีอาร์.
4 ปีที่แล้ว
หมายเหตุด้านข้างสำหรับการใช้ exit ด้วยในที่สุด: หากคุณออกจากที่ไหนสักแห่งในบล็อก try บล็อกสุดท้ายจะไม่ถูกดำเนินการ ฟังดูไม่ชัดเจน: ตัวอย่างเช่นใน Java คุณไม่เคยออกทางออก อย่างน้อยก็ส่งคืนในของคุณ controller; ใน PHP คุณจะพบว่าตัวเองกำลังออกจากวิธีการควบคุม (เช่น ในกรณีที่คุณเปลี่ยนเส้นทาง)
ต่อไปนี้เป็น POC:
สิ่งนี้จะพิมพ์:
ทดสอบในที่สุดด้วยทางออก
ในการลองออก
1 ปีที่ผ่านมา
>> ฟังก์ชันการปิดเครื่องและตัวทำลายวัตถุจะถูกดำเนินการเสมอแม้ว่าจะเรียกทางออกก็ตาม
มันเป็นเท็จถ้าคุณเรียก exit เข้าสู่ desctructor
ทางออกปกติ:
// ออกจาก desctructor:
17 ปีที่แล้ว
หากคุณใช้เทมเพลตที่มีการรวมจำนวนมาก exit() จะสิ้นสุดสคริปต์ของคุณและเทมเพลตของคุณจะไม่สมบูรณ์ (ไม่ใช่, , ฯลฯ...) แทนที่จะมีตรรกะเชิงเงื่อนไขที่ซับซ้อนภายในเนื้อหาของคุณ เพียงสร้างไฟล์ "footer.php" ที่ปิด HTML ทั้งหมดของคุณ และหากคุณต้องการออกจากสคริปต์ ให้ใส่() ส่วนท้ายก่อนที่คุณจะออก()
รวม("header.php");
บลา บลา บลา
ถ้า (!$mysql_connect) (
echo "ไม่สามารถเชื่อมต่อได้";
รวม("footer.php");
ออก;
}
บลา บลา บลา
รวม("footer.php");
16 ปีที่แล้ว
Return อาจดีกว่าที่จะออกในบางสถานการณ์ โดยเฉพาะอย่างยิ่งเมื่อต้องจัดการกับไบนารี PHP และเชลล์
ฉันมีสคริปต์ที่เป็นผู้รับอีเมลแทน เช่น เมลที่ส่งไปยังนามแฝงนั้นจะถูกส่งไปที่สคริปต์แทนที่จะถูกส่งไปยังกล่องจดหมาย การใช้ exit ในสคริปต์นี้ส่งผลให้ผู้ส่งอีเมลได้รับการแจ้งเตือนความล้มเหลวในการจัดส่ง นี่ไม่ใช่พฤติกรรมที่ต้องการ ฉันต้องการทิ้งข้อความที่ไม่เป็นไปตามข้อกำหนดของสคริปต์อย่างเงียบๆ
หลังจากพยายามหาค่าจำนวนเต็มที่ฉันควรส่งผ่านไปหลายชั่วโมงเพื่อ exit() เพื่อตอบสนอง sendmail ฉันลองใช้ return แทน exit ทำงานเหมือนมีเสน่ห์ Sendmail ไม่ชอบการออก แต่พอใจกับการส่งคืนอย่างยิ่ง ดังนั้น หากคุณประสบปัญหาเกี่ยวกับการออกและไบนารีของระบบอื่นๆ ให้ลองใช้ return แทน
3 ปีที่ผ่านมา
นอกเหนือจาก "void a t information d o t info" แล้ว นี่เป็นบรรทัดเดียวที่ไม่ต้องมีค่าคงที่:
การวางไว้ที่จุดเริ่มต้นของไฟล์ PHP จะป้องกันการเข้าถึงสคริปต์โดยตรง
หากต้องการเปลี่ยนเส้นทางไปยัง / แทนที่จะตาย:
ทำเช่นเดียวกันในซับเดียว:
หมายเหตุเพื่อความปลอดภัย: แม้ว่า $_SERVER["PHP_SELF"] จะมาจากผู้ใช้ แต่ก็ปลอดภัยที่จะถือว่าความถูกต้องของมัน เนื่องจาก "การจัดการ" เกิดขึ้น _before_ การดำเนินการไฟล์จริง ซึ่งหมายความว่าสตริง _must_ นั้นถูกต้องเพียงพอ เพื่อรันไฟล์ นอกจากนี้ basename() ยังเป็นไบนารี่ที่ปลอดภัย ดังนั้นคุณจึงสามารถไว้วางใจฟังก์ชันนี้ได้อย่างปลอดภัย
7 ปีที่แล้ว
เมื่อใช้ php-fpm ควรใช้ fastcgi_finish_request() แทน register_shutdown_function() และ exit()
ตัวอย่างเช่น ภายใต้ nginx และ php-fpm 5.3+ จะทำให้เบราว์เซอร์รอ 10 วินาทีเพื่อแสดงเอาต์พุต: