يمكن للالنصي PHP خداع المتصفح إلى التفكير في طلب HTTP قد انتهت؟

StackOverflow https://stackoverflow.com/questions/1436575

سؤال

وأنا أولا تكوين مخطوطتي لتشغيل حتى بعد طلب HTTP هو أكثر

 ignore_user_abort(true);

وبعد ذلك طرد بعض النصوص.

 echo "Thats all folks!";
 flush();

والآن كيف يمكنني خداع المتصفح إلى التفكير في طلب HTTP انتهت؟ حتى أتمكن من مواصلة القيام بأعمال بلدي دون متصفح الاداء "تحميل الصفحات".

 header(??) // something like this?
هل كانت مفيدة؟

المحلول

إليك كيفية القيام بذلك. تخبر المتصفح أن نقرأ في الأحرف N الأولى من الانتاج ومن ثم إغلاق الاتصال، في حين يبقى السيناريو الخاص بك قيد التشغيل حتى يتم ذلك.

<?php
ob_end_clean();
header("Connection: close");
ignore_user_abort(true); // optional
ob_start();
echo ('Text the user will see');
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush();     // Will not work
flush();            // Unless both are called !

// At this point, the browser has closed connection to the web server

// Do processing here
echo('Text user will never see');
?>

نصائح أخرى

وسوف رؤوس لا تعمل (انهم رؤوس، لذلك يأتون <م> أولا )

وأنا لا أعرف من أي وسيلة لإغلاق الاتصال HTTP دون إنهاء النصي، على الرغم من أنني أفترض هناك طريقة غامضة للقيام بذلك.

وتقول لنا ما تريد القيام به بعد الانتهاء من طلب شأنها أن تساعدنا على إعطاء اقتراحات أفضل.

ولكن عموما، سأكون التفكير في واحد مما يلي:

1) تنفيذ بعض سيناريو بسيط سطر الأوامر (باستخدام إكسيك ()) التي تبدو مثل:

#!/bin/sh
php myscript.php <arg1> <arg2> .. <argN> &

وثم ركلة أن الخروج من البرنامج النصي محددة HTTP الخاص بك، مثل:

<?PHP
exec('/path/to/my/script.sh');
?>

وأو:

2) كتابة برنامج آخر (ربما الخفي التي تعمل بشكل مستمر، أو بعض السيناريو الذي يتم cronned من أي وقت مضى في كثير من الأحيان)، ومعرفة كيفية التعليمات البرمجية في والطلب يمكن أن تمر عليه التعليمات. هل يمكن أن يكون قاعدة بيانات الجدول أن قوائم الانتظار العمل، أو محاولة لجعله يعمل مع ملف ثابت من نوع ما. هل يمكن أن يكون أيضا دعوة النصي على شبكة الإنترنت الخاص بك بعض أمر سطر الأوامر التي تسبب بك النصي الخروج من طلب إلى الانتظار بعض العمل.

وفي نهاية اليوم، كنت لا <م> تريد السيناريو الخاص بك للحفاظ على تنفيذ بعد طلب HTTP. على افتراض كنت تستخدم mod_php، مما يعني أنك سوف ربط عملية اباتشي حتى إنهاء البرنامج النصي.

وربما أن هذا التعليق بشكل خاص على php.net الصفحات اليدوية تساعد: <لأ href = "http://www.php.net/manual/en/features.connection-handling.php#71172" يختلط = "نوفولو noreferrer "> http://www.php.net/manual/en/features.connection-handling.php#71172

ونظريا، إذا تم تمكين HTTP 1.1 المحافظة على الحياة ويتلقى العميل مبلغ من الشخصيات انها تتوقع من الملقم، فإنه يجب التعامل معها على أنها نهاية الاستجابة والمضي قدما وتقديم صفحة (مع الحفاظ على اتصال يزال . مفتوح) حاول إرسال هذه الرؤوس (إذا كنت لا تمكنهم طريقة أخرى):

Connection: keep-alive
Content-Length: n

وأين n هو مقدار الأحرف التي أرسلتها في الجسم استجابة (الناتج التخزين المؤقت يمكن أن تساعد كنت تعول ذلك.) أنا آسف أنني لم يكن لديك الوقت لاختبار هذا من نفسي. أنا مجرد رمي في الاقتراح في حال كان يعمل.

وأفضل طريقة لتحقيق ذلك هو استخدام الناتج التخزين المؤقت. PHP يرسل رؤوس عندما انها جيدة وجاهزة، ولكن إذا كنت التفاف الإخراج إلى مستعرض مع ob_ * يمكنك التحكم في رؤوس كل خطوة على الطريق.

ويمكنك اجراء الصفحة المقدمة في المخزن المؤقت إذا كنت تريد وترسل رؤوس حتى تشرق الشمس في الصين. هذه الممارسة هي السبب في أنك قد ترى الكثير من علامات <?php فتح، ولكن لا علامات إغلاق هذه الأيام. إنها تحافظ على السيناريو من إرسال أي رؤوس الأوان لأن هناك ربما بعض ما يلي في الاعتبار.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top