أجهزة الكمبيوتر شبابيك إنترنت

توقف تنفيذ البرنامج النصي php. تنفيذ البرنامج النصي في الخلفية في PHP بدون crontab. #واحد. مظاهرة للاستخدام

توقف التنفيذ نص PHPويخرج رسالة HTML منسقة.

التناظرية من القاعدة وظائف PHPموت(). الفرق هو أن wp_die () ينتج ملف صفحة HTMLأخطاء. يوصى باستخدام هذه الوظيفة عندما تحتاج إلى التوقف تمامًا وظيفة PHP. لا يوصى باستخدام هذه الوظيفة كثيرًا - حاول عدم إظهار الأخطاء للمستخدمين.

عائدات

لا يُرجع أي شيء ، لكنه يُنهي PHP.

إستعمال

wp_die ($ message، $ title، $ args) ؛ رسالة $ (مختلط)رسالة خطأ أو كائن فئة WP_Error كامل.
تقصير: ""العنوان (سلسلة / مجموعة / رقم / كائن / منطقي)عنوان الخطأ. إذا كنت تستخدم كائن WP_Error ، فسيتم أخذ العنوان من $ data ["title"] ، ويمكن تغيير هذا المعامل مسبقًا بنفسك.
تقصير: ""$ أرجس (سلسلة / مجموعة)

الحجج المختلفة التي تتحكم في السلوك.
الافتراضي: لا

    استجابة (رقم)
    رمز حالة HTTP. 500 - خطأ داخلي في الخادم. القائمة بأكملها.
    الافتراضي: 500

    رابط خلفي (منطقي)
    ما إذا كان سيتم عرض رابط خلفي للصفحة السابقة أم لا.
    الافتراضي: خطأ

  • اتجاه النص (خط)
    اتجاه النص: ltr (من اليسار إلى اليمين) أو rtl (من اليمين إلى اليسار).
    الافتراضي: "ltr"

أمثلة

#واحد. مظاهرة للاستخدام

باستخدام الدالة wp_die () ، لنرى ما هو موجود حاليًا في المتغير العام $ post:

Add_filter ("body_class"، "add_body_class_cb") ؛ الوظيفة add_body_class_cb (فئات $) (global $ post؛ wp_die ("

"var_export ($ post، true)."
"); }

# 2. تصميم قالب wp_die

إذا احتاج الموقع إلى تغيير تصميم هذه الكتلة ، فيمكنك استخدام خطاف wp_die_handler:

500) ؛ $ r = wp_parse_args ($ args ، $ الافتراضي) ؛ $ have_gettext = function_exists ("__") ؛ if (function_exists ("is_wp_error") && is_wp_error ($ message)) (if (فارغ ($ title)) ($ error_data = $ message-> get_error_data () ؛ if (is_array ($ error_data) && isset ($ error_data [" title "])) $ title = $ error_data [" title "]؛) $ errors = $ message-> get_error_messages ()؛ switch (count ($ errors)) (الحالة 0: $ message =" "؛ فاصل ؛ حالة 1 : $ message = "" ؛ فاصل ؛ افتراضي: $ message = "

    \ n \ t \ t
  • ".انضم("
  • \ n \ t \ t
  • "، أخطاء $)."
  • \ n \ t
"؛ break؛)) elseif (is_string ($ message)) ($ message =" "؛) if (isset ($ r [" back_link "]) && $ r [" back_link "]) ($ back_text = $ have_gettext؟ __ ("رجوع"): "رجوع" ؛ رسالة $. = "\ n

$ back_text

"؛) if (! did_action (" admin_head ")): if (! headers_sent ()) (status_header ($ r [" response "]) ؛ nocache_headers () ؛ header (" Content-Type: text / html؛ charset = utf-8 ") ؛) إذا (فارغ ($ title)) $ title = $ have_gettext؟ __ (" WordPress ›Error"): "WordPress› Error "؛ $ text_direction =" ltr "؛ if (isset ($ r [ "text_direction"]) && "rtl" == $ r ["text_direction"]) $ text_direction = "rtl"؛ elseif (function_exists ("is_rtl") && is_rtl ()) $ text_direction = "rtl"؛؟> > <?php echo $title ?>

الرمز wp يموت: wp-include / function.php WP 5.2.2

$ args) ؛ ) elseif (is_int ($ title)) ($ args = array ("response" => $ title) ؛ $ title = "" ؛) if (wp_doing_ajax ()) (/ ** * يقوم بفلترة رد الاتصال لقتل تنفيذ WordPress لـ طلبات Ajax. * *since 3.4.0 * *param قابلة للاستدعاء $ function اسم وظيفة رد الاتصال. * / $ function = application_filters ("wp_die_ajax_handler"، "_ajax_wp_die_handler")؛) elseif (wp_is_json_request ()) (/ ** * عوامل التصفية رد الاتصال لقتل تنفيذ WordPress لطلبات JSON. * *since 5.1.0 * *param يمكن استدعاءه $ function اسم وظيفة رد الاتصال. * / $ function = application_filters ("wp_die_json_handler"، "_json_wp_die_handler")؛) elseif (wp_is_jsonp_request () ) (/ ** * يقوم بتصفية رد الاتصال لقتل تنفيذ WordPress لطلبات JSONP. * *since 5.2.0 * *param يمكن استدعاء $ function اسم وظيفة رد الاتصال. * / $ function = application_filters ("wp_die_jsonp_handler"، "_jsonp_wp_die_handler") ؛) elseif (المعرفة ("XMLRPC_REQUEST") && XMLRPC_REQUEST) (/ ** * يقوم بتصفية رد الاتصال لقتل تنفيذ WordPress n لطلبات XML-RPC. * *since 3.4.0 * *param للاستدعاء $ function callback function name. * / $ function = apply_filters ("wp_die_xmlrpc_handler"، "_xmlrpc_wp_die_handler") ؛ ) elseif (wp_is_xml_request () || isset ($ wp_query) && (function_exists ("is_feed") && is_feed () || function_exists ("is_comment_feed") && is_comment_feed () || function_exists ("is_trackback") () || function_trackback ("is_trackback") && ) (/ ** * لتصفية رد الاتصال لقتل تنفيذ WordPress لطلبات XML. * *since 5.2.0 * *param callable $ function اسم وظيفة رد الاتصال. * / $ function = application_filters ("wp_die_xml_handler"، "_xml_wp_die_handler") ؛) else (/ ** * يقوم بتصفية رد الاتصال لقتل تنفيذ WordPress لجميع الطلبات بخلاف Ajax و non-JSON و non-XML. * *since 3.0.0 * *param callable $ function callback name. * / $ function = application_filters ("wp_die_handler"، "_default_wp_die_handler")؛) call_user_func ($ function، $ message، $ title، $ args)؛ )

قبل 8 سنوات

إذا كنت ترغب في تجنب استدعاء exit () في FastCGI وفقًا للتعليقات أدناه ، ولكن في الحقيقة ، تريد بشكل إيجابي الخروج تمامًا من استدعاء الوظيفة المتداخلة أو تضمينها ، ففكر في القيام بذلك بطريقة Python:

عرّف استثناء باسم SystemExit ، وألقه بدلاً من استدعاء exit () وألحقه في index.php بمعالج فارغ لإنهاء تنفيذ البرنامج النصي بشكل نظيف.

// ملف: index.php
تمدد فئة SystemExit الاستثناء ()
محاولة(
/ * كود الكود * /
}
catch (SystemExit $ e) (/ * لا تفعل شيئًا * /)
// نهاية الملف: index.php

// بعض الوظائف المتداخلة بشدة أو ملف .php

إذا (SOME_EXIT_CONDITION)
رمي SystemExit () الجديد ؛ // بدلاً من الخروج ()

?>

منذ 10 سنوات

اقترح Jbezorg at gmail ما يلي:


header ("الموقع: /") ؛

?>

بعد إرسال "الموقع:" PHP header _will_ تابع التحليل ، وسيستمر تنفيذ جميع التعليمات البرمجية الموجودة أسفل استدعاء header (). لذا استخدم بدلاً من ذلك:

إذا ($ _ SERVER ["SCRIPT_FILENAME"] == __FILE__)
{
header ("الموقع: /") ؛
خروج؛
}

?>

منذ 10 سنوات

To rich dot lovely at klikzltd dot co dot uk:

استخدام "@" قبل header () لمنع الخطأ ، والاعتماد على خطأ "العناوين المرسلة بالفعل" يبدو لي فكرة سيئة للغاية أثناء إنشاء أي موقع ويب جاد.

هذه * ليست * طريقة نظيفة لمنع استدعاء ملف بشكل مباشر. على الأقل هذه ليست طريقة آمنة ، لأنك تعتمد على وجود استثناء أرسله المحلل اللغوي في وقت التشغيل.

أوصي باستخدام طريقة أكثر شيوعًا مثل تحديد ثابت أو تعيين متغير بأي قيمة ، والتحقق من وجوده في البرنامج النصي المضمن ، مثل:

في index.php:
تعريف ("INDEX" ، صحيح) ؛
?>

في ملفك المضمن:
إذا (! المعرفة ("INDEX")) (
موت( "لا يمكنك استدعاء هذا البرنامج النصي مباشرة!");
}
?>

ب.

منذ 4 سنوات

ملاحظة جانبية لاستخدام الخروج مع أخيرًا: إذا خرجت من مكان ما في كتلة المحاولة ، فلن يتم تنفيذ الأمر في النهاية. قد لا يبدو واضحًا: على سبيل المثال في Java ، لا تصدر خروجًا أبدًا ، على الأقل إرجاع في وحدة تحكم ؛ في PHP بدلاً من ذلك ، قد تجد نفسك تخرج من طريقة تحكم (على سبيل المثال في حالة إصدار إعادة توجيه).

هنا يتبع POC:

صدى "الاختبار أخيرا مع الخروج \ n" ؛

محاولة(
صدى "في محاولة ، الخروج \ n" ؛

خروج؛
) catch (استثناء $ e) (
صدى "اصطياد \ n" ؛
) أخيرا (
صدى "أخيرا \ n" ؛
}

صدى "في النهاية \ n" ؛
?>

هذا سوف يطبع:

اختبار خفة دم الخروج أخيرا
في محاولة الخروج

منذ سنة 1

>> سيتم دائمًا تنفيذ وظائف إيقاف التشغيل وأدوات تدمير الكائنات حتى إذا تم استدعاء الإنهاء.

إنه خطأ إذا طلبت الخروج إلى جهاز إلغاء الهيكلة.

الخروج العادي:
فئة أ
{
{
صدى "وداعا أ \ n" ؛
}
}

الصف ب
{
وظيفة عامة __destruct ()
{
صدى "وداعا ب \ n" ؛
}
}

$ a = جديد A ؛
دولار ب = ب جديد ؛
خروج؛

//انتاج:
// وداعا ب
// وداعا أ
?>

// الخروج إلى المدمر:
فئة أ
{
وظيفة عامة __destruct ()
{
صدى "وداعا أ \ n" ؛
}
}

الصف ب
{
وظيفة عامة __destruct ()
{
صدى "وداعا ب \ n" ؛
خروج؛
}
}

$ a = جديد A ؛
دولار ب = ب جديد ؛

//انتاج:
// وداعا ب
?>

قبل 17 عاما

إذا كنت تستخدم قوالب مع العديد من التضمينات ، فإن الخروج () سينهي البرنامج النصي الخاص بك ولن يكتمل القالب الخاص بك (لا, , إلخ...). بدلاً من وجود منطق شرطي متداخل معقد داخل المحتوى الخاص بك ، ما عليك سوى إنشاء ملف "footer.php" يغلق جميع ملفات HTML الخاصة بك وإذا كنت تريد الخروج من نص برمجي ، فقم فقط بتضمين () التذييل قبل الخروج ().

تشمل ("header.php") ؛
الخ الخ الخ
إذا (! $ mysql_connect) (
صدى "غير قادر على الاتصال" ؛
تشمل ("footer.php") ؛
خروج؛
}
الخ الخ الخ
تشمل ("footer.php") ؛

قبل 16 عاما

قد يكون من الأفضل الخروج من العودة في مواقف معينة ، خاصة عند التعامل مع PHP binary و shell.

لدي برنامج نصي هو مستلم الاسم المستعار للبريد ، أي يتم توجيه البريد المرسل إلى هذا الاسم المستعار إلى البرنامج النصي بدلاً من تسليمه إلى صندوق بريد. أدى استخدام الخروج في هذا النص البرمجي إلى حصول مرسل البريد الإلكتروني على إشعار بفشل التسليم. لم يكن هذا هو السلوك المرغوب ، أردت أن أتجاهل بصمت الرسائل التي لا تفي بمتطلبات البرنامج النصي.

بعد عدة ساعات من محاولة اكتشاف قيمة العدد الصحيح التي يجب أن أمررها للخروج () لإرضاء sendmail ، حاولت استخدام return بدلاً من exit. عملت مثل السحر. لم يحب Sendmail الخروج ولكنه كان سعيدًا تمامًا بالعودة. لذا ، إذا كنت تواجه مشكلة في الخروج وثنائيات النظام الأخرى ، فحاول استخدام return بدلاً من ذلك.

منذ 3 سنوات

بالإضافة إلى "إبطال المعلومات عن المعلومات" ، إليك سطر واحد لا يتطلب ثابتًا:



سيؤدي وضعه في بداية ملف PHP إلى منع الوصول المباشر إلى البرنامج النصي.

لإعادة التوجيه إلى / بدلاً من الموت:

إذا (basename ($ _SERVER ["PHP_SELF"]) == basename (__FILE__)) (
إذا (ob_get_contents ()) ob_clean () ، // ob_get_contents () يعمل حتى بدون التخزين المؤقت للإخراج النشط
header ("الموقع: /") ؛
موت؛
}
?>

فعل الشيء نفسه في خط واحد:



ملاحظة للأمان: على الرغم من أن المستخدم _SERVER ["PHP_SELF"] يأتي من المستخدم ، فمن الآمن افتراض صلاحيته ، حيث أن "التلاعب" يحدث قبل_ تنفيذ الملف الفعلي ، مما يعني أن السلسلة _must_ كانت صالحة بدرجة كافية لتنفيذ الملف. أيضًا ، يعد basename () آمنًا ثنائيًا ، لذا يمكنك الاعتماد على هذه الوظيفة بأمان.

قبل 7 سنوات

عند استخدام php-fpm ، يجب استخدام fastcgi_finish_request () بدلاً من register_shutdown_function () و exit ()

على سبيل المثال ، ضمن nginx و php-fpm 5.3+ ، سيجعل هذا المتصفحات تنتظر 10 ثوانٍ لإظهار الإخراج:

صدى صوت "عليك أن تنتظر 10 ثوان لترى هذا.
"
;
register_shutdown_function ("الإغلاق") ؛
خروج؛
وظيفة الاغلاق () (
ينام (10) ؛
صدى صوت "لأن exit () لا ينهي مكالمات php-fpm على الفور.
"
;
}
?>

هذا لا:

صدى صوت "يمكنك أن ترى هذا من المتصفح على الفور.
"
;
fastcgi_finish_request () ،
ينام (10) ؛
صدى صوت "لا يمكنك رؤية هذا النموذج من المتصفح.";
?>

لقد حيروني هنا لكتابة شيطان بلغة PHP. أولئك. نص يقوم بتنفيذ إجراءات معينة لعدد محدد من المرات في عدد محدد من الساعات في وقت عشوائي (عشوائيًا دائمًا) ، وكل هذا دون استخدام cron "a.

قبل ذلك ، لم أزعج نفسي أبدًا ، ولكن بعد تعيين المهمة ، بدأت أفكر أنه من المستحيل ، أن يتم استدعاء نص php بواسطة المتصفح ... حسنًا ، تم تعيين المهمة ، ويجب تنفيذها.

الفكرة الأولى هي تعطيل الحد الزمني لتنفيذ البرنامج النصي. ممنوع من قبل المضيف.

الفكرة الثانية هي تكرار طلب Ajax بشكل دوري (نعم ، مرة واحدة على الأقل في الثانية) باستخدام جافا سكريبت. - غير ممكن (مطلب العميل).

اتضح ، في الواقع ، أن المتصفح لا ينبغي أن يكون مفتوحًا ، ولا ينبغي استخدام crons ، ويجب أن يعمل البرنامج النصي بشكل مستقل عن المستخدم ، إلى أجل غير مسمى. بطبيعة الحال ، يجب أن يقوم بتحميل النظام على الأقل.

1. علبة سجائر ، ليل ، جوجل ، أرصفة ، كتب ، كتيبات….
اذهب 1 ...

عند الإخراج أحصل على:
مهمة 1:
قم بتنفيذ منشئ وقت تنفيذ البرنامج النصي بناءً على عدد المرات وعدد الساعات. قم بتخزين هذه الأوقات في مكان ما.

المهمة_2:
العمل بعد إغلاق المتصفح

Task_3:
لا تتعطل بعد انتهاء الحد الزمني لتنفيذ البرنامج النصي

المهمة_4:
اتخذ الإجراء في الوقت المناسب.

لذا…
نكتب البيانات الأولية في التكوين:

جلسة_ستارت () ، // بدء الجلسة $ num_starts = 120 ؛ // عدد البرامج النصية التي يتم تشغيلها في كل فترة زمنية $ ساعة = 1 ؛ // عدد ساعات تشغيل البرنامج النصي $ num_starts مرات. time_sec دولار أمريكي = ساعة * 3600 دولار أمريكي ؛ // عدد الثواني في دورة التشغيل $ time_to_start = array ()؛ // في الواقع ، مصفوفة بأوقات إطلاق ignore_user_abort (1) ؛ // تجاهل فصل المتصفح

بعد ذلك ، نكتب دالة ستساعدنا في تحديد أوقات البدء.
في ذلك ، نقوم بإنشاء رقم عشوائي من 0 إلى عدد الثواني في الفاصل الزمني الأصلي.
/ ****** *desc إنشاء فاصل زمني بين عمليات التشغيل. * / function add_time2start () (global $ time_sec، $ time_to_start؛ $ new_time = time () + rand (0، $ time_sec)؛ if (! in_array ($ new_time، $ time_to_start)) (// إذا لم يكن هناك مثل هذا الوقت في المصفوفة - أضف $ time_to_start = $ new_time؛) else (add_time2start () ؛ // إذا كان هذا الوقت موجودًا بالفعل ، قم بإعادة التوليد.))

$ ك = 1 ؛ إذا ($ _SESSION ["num_st"] == "" || $ _SESSION ["num_st"] [$ num_starts-1]< time()) { // проверка, что в сессию не записаны данные и что эти данные не устарели. do { add_time2start($k); $k++; } while ($k < = $num_starts); sort($time_to_start, SORT_NUMERIC); $_SESSION["num_st"] = $time_to_start; }

نحتاج الآن إلى جعل النص يعمل ، بغض النظر عن الحد الأقصى لوقت التنفيذ الذي حدده الخادم.
المبدأ هو:
1) تحديد وقت بدء البرنامج النصي ؛
2) نحدد القيد المحدد على وقت التنفيذ.
3) نبدأ الدورة ، التي نحسب فيها الوقت الحالي ونحسب الوقت الإجمالي الذي يعمل فيه البرنامج النصي ، ونتحقق من الوقت الحالي بالقيم الموجودة في مصفوفة أوقات البدء ، وإذا كان هناك تطابق ، فإننا ننفذ الإجراءات المحددة (لديّهم في ملف exec.php). نستخدم مآخذ لتشغيل الملفات.
4) كرر الدورة حتى يقترب وقت تشغيل البرنامج النصي من الحد الأقصى المسموح به. قمت بتعيين - حتى الحد الأقصى للوقت هو 5 ثوان.

لذلك ... نعتبر البيانات الأولية في الوقت المناسب:

$ start_time = microtime () ؛ // اكتشف وقت بدء البرنامج النصي $ start_array = explode (""، $ start_time)؛ // ثواني منفصلة وميلي ثانية $ start_time = $ start_array؛ // الحصول على وقت بدء البرنامج النصي $ max_exec = ini_get ("max_execution_time") ؛ // احصل على أقصى وقت ممكن لتشغيل البرنامج النصي
في الأساس دورة. التعليقات في الكود.

Do ($ nowtime = time ()؛ // الوقت الحالي //// إذا كان الوقت الحالي في المصفوفة مع أوقات تنفيذ البرنامج النصي ...... if (in_array ($ nowtime، $ _SESSION ["num_st"]) ) (// نحن نتمسك بالملف الذي يحتوي على المحتوى الرئيسي للإجراءات $ http = fsockopen ("test.ru ، 80) ؛ /// في نفس الوقت نقوم بتمرير بيانات الجلسة إليه والوقت الذي يجب أن يتم فيه ذلك العمل fputs ($ http، "GET http: // test .ru / exec.php؟". session_name (). "=". session_id (). "& nowtime = $ nowtime HTTP / 1.0 \ r \ n")؛ fputs ($ http، "Host: test.ru \ r \ n")؛ fputs ($ http، "\ r \ n")؛ fclose ($ http)؛) //// نفذ الإجراء المحدد // اكتشف الوقت الحالي للتحقق مما إذا كنت تريد الاستمرار في التكرار أو إعادة التشغيل $ now_time = microtime () ؛ $ now_array = explode (""، $ now_time)؛ $ now_time = $ now_array؛ // اطرح الأولي $ exec_time = $ now_time - $ start_time + $ exec_time ؛ /// تبطئ لمدة ثانية (1000000) ؛ // أوقف البرنامج النصي الذي يعمل في الخلفية ، لا يمكنني التفكير بأي طريقة أخرى إذا خرج (file_exists ("stop.txt")) ؛ تحقق من وقت التشغيل ، إذا بقي أقل من 5 ثوانٍ قبل نهاية // عملية البرنامج النصي ، فاخرج من الحلقة. ) بينما ($ exec_time< ($max_exec - 5));

حسنًا ، إذا انتهى الوقت المسموح به ، فإننا نكمل الدورة ونشغل النص البرمجي نفسه بأمان من خلال عملية أخرى (سنلتقي بالتأكيد لمدة 5 ثوانٍ)

// قم بتشغيل نفس البرنامج النصي بعملية جديدة واخرج من العملية الحالية $ http = fsockopen ("test.ru"، 80)؛ fputs ($ http، "GET http://test.ru/index.php؟".session_name()."=".session_id()."&bu=$max_exec HTTP / 1.0 \ r \ n")؛ fputs ($ http، "Host: test.ru \ r \ n")؛ fputs ($ http، "\ r \ n")؛ fclose ($ http) ؛

عندما أنهيت كل شيء ، شعرت بالحيرة من التطبيق المفيد ... يمكنك استخدامه كخدمة. يمكنه مراقبة شيء ما على الشبكة وإخطارك ، على سبيل المثال ، عن طريق البريد. وأنت لست بحاجة إلى أي كرون.

لا يزال من الممكن تحسين النص - لم يتم الانتهاء منه.
بالمناسبة ، هذا ما لم أستطع الابتعاد عنه - لا يزال يتعين فتح المتصفح لتشغيل البرنامج النصي في البداية.