PHP ยกเลิกการเรียกใช้สคริปต์ การดำเนินการเบื้องหลังของสคริปต์ PHP โดยไม่มี crontab #1. สาธิตการใช้งาน

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 วินาทีเพื่อแสดงเอาต์พุต: