php បោះបង់ការប្រតិបត្តិស្គ្រីប។ ការប្រតិបត្តិផ្ទៃខាងក្រោយនៃស្គ្រីប PHP ដោយគ្មាន crontab ។ #1. ការបង្ហាញការប្រើប្រាស់

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 វិនាទីដើម្បីបង្ហាញលទ្ធផល៖