8 ឆ្នាំមុន
ប្រសិនបើអ្នកចង់ជៀសវាងការហៅចេញ () នៅក្នុង FastCGI ដូចទៅនឹងមតិយោបល់ខាងក្រោម ប៉ុន្តែពិតជាវិជ្ជមានចង់ចាកចេញពីការហៅមុខងារដែលបានដាក់ ឬរួមបញ្ចូល សូមពិចារណាធ្វើវាតាមវិធី Python៖
កំណត់ករណីលើកលែងមួយដែលមានឈ្មោះថា `SystemExit” បោះវាជំនួសឱ្យការហៅចេញ () ហើយចាប់វានៅក្នុង index.php ដោយប្រើឧបករណ៍ដោះស្រាយទទេដើម្បីបញ្ចប់ការប្រតិបត្តិស្គ្រីបយ៉ាងស្អាត។
// ឯកសារ៖ index.php
ថ្នាក់ SystemExit ពង្រីក Exception()
ព្យាយាម (
/* លេខកូដ*/
}
ចាប់ (SystemExit $e ) (/* do nothing */ )
// ចុងបញ្ចប់នៃឯកសារ៖ index.php
// មុខងារបង្កប់យ៉ាងជ្រៅមួយចំនួន ឬឯកសារ .php
ប្រសិនបើ (SOME_EXIT_CONDITION)
បោះ SystemExit(); // ជំនួសឱ្យការចាកចេញ ()
?>
10 ឆ្នាំមុន
Jbezorg នៅ gmail បានស្នើរដូចខាងក្រោមៈ
បឋមកថា ("ទីតាំង៖ /");
?>
បន្ទាប់ពីផ្ញើ `Location:" header PHP _will_ បន្តញែក ហើយកូដទាំងអស់ខាងក្រោម header() call នឹងនៅតែត្រូវបានប្រតិបត្តិ។ ដូច្នេះប្រើជំនួសវិញ៖
ប្រសិនបើ($_SERVER [ "SCRIPT_FILENAME" ] == __FILE__ )
{
បឋមកថា ("ទីតាំង៖ /");
ចេញ;
}
?>
10 ឆ្នាំមុន
To rich dot lovely at klikzltd dot co dot uk:
ការប្រើ "@" មុនពេលបឋមកថា () ដើម្បីទប់ស្កាត់កំហុសរបស់វា ហើយការពឹងផ្អែកលើកំហុស "បឋមកថាបានផ្ញើរួចហើយ" ហាក់ដូចជាខ្ញុំជាគំនិតអាក្រក់ណាស់ ខណៈពេលដែលបង្កើតគេហទំព័រធ្ងន់ធ្ងរណាមួយ។
នេះគឺជា *not* វិធីស្អាតដើម្បីការពារឯកសារមិនឱ្យត្រូវបានហៅដោយផ្ទាល់។ យ៉ាងហោចណាស់នេះមិនមែនជាវិធីសាស្ត្រសុវត្ថិភាពទេ ព្រោះអ្នកពឹងផ្អែកលើវត្តមាននៃករណីលើកលែងដែលផ្ញើដោយអ្នកញែកនៅពេលដំណើរការ។
ខ្ញុំសូមណែនាំឱ្យប្រើវិធីសាមញ្ញជាងនេះ ដូចជាការកំណត់ថេរ ឬកំណត់អថេរជាមួយនឹងតម្លៃណាមួយ ហើយពិនិត្យមើលវត្តមានរបស់វានៅក្នុងស្គ្រីបដែលបានរួមបញ្ចូលដូចជា៖
នៅក្នុង index.php:
នៅក្នុងឯកសាររួមបញ្ចូលរបស់អ្នក៖
BR.
4 ឆ្នាំមុន
ចំណាំចំហៀងសម្រាប់ការប្រើប្រាស់ការចាកចេញជាមួយចុងក្រោយ៖ ប្រសិនបើអ្នកចេញនៅកន្លែងណាមួយនៅក្នុងប្លុកសាកល្បង ទីបំផុតនឹងមិនត្រូវបានប្រតិបត្តិទេ។ មិនអាចស្តាប់ទៅច្បាស់ទេ៖ ឧទាហរណ៍នៅក្នុង Java អ្នកមិនដែលចេញច្រកចេញទេ យ៉ាងហោចណាស់ការត្រឡប់មកវិញនៅក្នុងរបស់អ្នក ឧបករណ៍បញ្ជា; នៅក្នុង PHP ជំនួសវិញ អ្នកអាចរកឃើញថាខ្លួនអ្នកកំពុងចេញពីវិធីសាស្ត្រឧបករណ៍បញ្ជា (ឧ. ក្នុងករណីដែលអ្នកចេញការបញ្ជូនបន្ត)។
ខាងក្រោមនេះជា POC៖
វានឹងបោះពុម្ព៖
ការធ្វើតេស្តចុងក្រោយជាមួយនឹងការចាកចេញ
ព្យាយាម ចេញ
1 ឆ្នាំមុន
>> មុខងារ Shutdown និង object destructors នឹងត្រូវបានប្រតិបត្តិជានិច្ច បើទោះបីជា exit ត្រូវបានហៅ។
វាមិនពិតទេប្រសិនបើអ្នកហៅចេញចូលទៅក្នុង dectructor ។
ច្រកចេញធម្មតា៖
// ចូលទៅក្នុងឧបករណ៍បំពងសំឡេង៖
១៧ ឆ្នាំមុន
ប្រសិនបើអ្នកកំពុងប្រើពុម្ពដែលមានរួមបញ្ចូលជាច្រើន នោះការចេញ() នឹងបញ្ចប់ស្គ្រីបរបស់អ្នក ហើយគំរូរបស់អ្នកនឹងមិនបញ្ចប់ (ទេ, , ល...)។ ជាជាងមានតក្កវិជ្ជាតាមលក្ខខណ្ឌស្មុគស្មាញនៅក្នុងមាតិការបស់អ្នក គ្រាន់តែបង្កើតឯកសារ "footer.php" ដែលបិទ HTML របស់អ្នកទាំងអស់ ហើយប្រសិនបើអ្នកចង់ចេញពីស្គ្រីប គ្រាន់តែរួមបញ្ចូល () បាតកថាមុនពេលអ្នកចេញ () ។
include("header.php");
blah blah blah
ប្រសិនបើ (!$ mysql_connect) (
បន្ទរ "មិនអាចភ្ជាប់";
include("footer.php");
ចេញ;
}
blah blah blah
include("footer.php");
១៦ ឆ្នាំមុន
ការត្រលប់មកវិញអាចជាការប្រសើរក្នុងការចាកចេញក្នុងស្ថានភាពជាក់លាក់ ជាពិសេសនៅពេលដោះស្រាយជាមួយ PHP binary និង shell ។
ខ្ញុំមានស្គ្រីបមួយដែលជាអ្នកទទួលឈ្មោះហៅក្រៅសំបុត្រ ឧ. សំបុត្រដែលបានផ្ញើទៅឈ្មោះក្លែងក្លាយនោះត្រូវបានបំពង់ទៅស្គ្រីបជំនួសឱ្យការបញ្ជូនទៅកាន់ប្រអប់សំបុត្រ។ ការប្រើការចាកចេញនៅក្នុងស្គ្រីបនេះនាំឱ្យអ្នកផ្ញើអ៊ីមែលទទួលបានការជូនដំណឹងអំពីការបរាជ័យក្នុងការដឹកជញ្ជូន។ នេះមិនមែនជាអាកប្បកិរិយាដែលចង់បាននោះទេ ខ្ញុំចង់បោះបង់សារដែលមិនបំពេញតាមតម្រូវការរបស់ស្គ្រីបដោយស្ងាត់ស្ងៀម។
បន្ទាប់ពីការព្យាយាមជាច្រើនម៉ោងដើម្បីរកឃើញតម្លៃចំនួនគត់ដែលខ្ញុំគួរឆ្លងទៅ exit() ដើម្បីបំពេញការផ្ញើអ៊ីមែល ខ្ញុំបានព្យាយាមប្រើការត្រឡប់ជាជាងការចាកចេញ។ បានធ្វើការដូចជាមន្តស្នេហ៍។ Sendmail មិនចូលចិត្តការចាកចេញទេ ប៉ុន្តែវាពិតជារីករាយនឹងការត្រឡប់មកវិញ ដូច្នេះប្រសិនបើអ្នកកំពុងមានបញ្ហាជាមួយនឹងការចាកចេញ និងប្រព័ន្ធគោលពីរផ្សេងទៀត សូមសាកល្បងប្រើការត្រឡប់មកវិញជំនួសវិញ។
3 ឆ្នាំមុន
បន្ថែមពីលើ "ទុកជាមោឃៈនូវព័ត៌មាន 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 វិនាទីដើម្បីបង្ហាញលទ្ធផល៖