تفريغ وظيفة البرنامج النصي إلى ما بعد الاستجابة: الأساليب وأفضل الممارسات؟

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

سؤال

أولاً،

وانشاء:

لديّ برنامج نصي ينفذ عدة مهام بعد أن يضرب المستخدم زر "التحميل" الذي يرسل البرنامج النصي إلى البيانات التي يحتاجها. الآن ، هذا الجزء إلزامي حاليًا ، ليس لدينا الخيار في هذه المرحلة لقطع التحميل والرسم من مصدر مباشر.

هذا القسم عن قصد منذ فترة طويلة لتوضيح نقطة. تخطي إلى الأمام إذا كنت تكره ذلك

في الوقت الحالي ، يتم تحليل البيانات من مصدر غير تقليدي حقًا باستخدام Regex ، ثم تقسيمها إلى صفيف. ثم يقوم بفحص DB لأي بيانات بالفعل في نطاق تاريخ البيانات المحمّلة. إذا لم تكن نطاقات تاريخ البيانات موجودة بالفعل في DB ، فإنها تدخل البيانات وتخرج النجاح للمستخدم (هناك أيضًا بعض عمليات التحقق من الأمان ، والتحقق من صحة مصدر البيانات ، والتحقق من التحميل الأساسي) ... إذا كانت البيانات موجودة ، ثم يحصل البرنامج النصي على البيانات الموجودة بالفعل في DB ، ويجد الاختلافات بين المجموعتين ، ويحذف البيانات القديمة التي لا تتطابق ، ويضيف البيانات الجديدة ، ثم يرسل بريدًا إلكترونيًا إلى كل شخص متأثر بهذه التغييرات (بريد إلكتروني واحد لكل الشخص الذي لديه جميع التغييرات ذات الصلة في البريد الإلكتروني المذكور ، وهي خطوة أخرى كاملة). يتم سحب عناوين البريد الإلكتروني عن طريق البحث عن LDAP لأن DB لدينا لديه بريد إلكتروني عملهم ، لكن LDAP لديه بريدها الإلكتروني الشخصي الذي يضمن الحصول على البريد الإلكتروني قبل وصولهم إلى اليوم التالي ويتم القبض عليهم غير مدركين. أخيرًا ، يتم إخبار Data-Oploader "تم إجراء تغييرات ، وتم إرسال رسائل البريد الإلكتروني". وهو حقًا كل ما يهتمون به.

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

</backstory>

الآن!

السؤال العملي

في هذه المرحلة ، تكامل ما قبل Google ، يستغرق البرنامج النصي على الأكثر ثانية ونصف للتشغيل. إنه أمر مثير للإعجاب ، على الأقل أعتقد ذلك (الخادم ، وليس الترميز الخاص بي). لكن بت Google ، في الاختبارات ، هو sloooow. ربما يمكننا إصلاح ذلك ، لكنه يثير السؤال الأكبر ...

ما هي أفضل طريقة لتحميل بعض العمل بعد أن حصل المستخدم على تأكيد بأن DB قد تم تحديثه؟ هذا هو الجزء الذي يهتم به والجزء الأكثر أهمية. توجد إشعارات البريد الإلكتروني وتحديثات تقويم Google فقط لصالح المتضررين من التحميل ، وإذا كانت هناك مشكلة في هذه الإشعارات ، فسوف يسمع عنها (وبعد ذلك سأسمع عنها) بغض النظر عن البرنامج النصي له أولا.

فهل هناك طريقة ، على سبيل المثال ، لتشغيل cronjob التي نتج عن تنفيذ آخر للنص؟ هل يمكن لـ PHP إنشاء cronjobs exec() قدرة؟ هل هناك طريقة طبيعية للتعامل مع أعمال ما بعد التنفيذ التي تحتاج إلى القيام بها؟

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

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

أفضل ممارسات/سؤال أكثر موضوعية

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

هل هناك أي أشياء كبيرة لتجنبها (بخلاف عدم إعطاء المستخدم أي ملاحظات على الإطلاق)؟

شكرا للقراءة. جزء الترميز أمر بالغ الأهمية ، لذلك لا تشعر بأنها مضطر لتغطية الجزء الثاني أو نسيان تغطية جزء الترميز!

هل كانت مفيدة؟

المحلول

هناك عدد من الطرق للقيام بهذا. يمكنك exec () ، كما يقول ما سبق ، ولكن من المحتمل أن تصادف موقف DOS إذا كان هناك الكثير من النقرات إرسال. يمكن القول إن امتداد PCNTL أفضل في إدارة العمليات مثل هذه. الدفع هذا المشنور لرؤية مناقشة (هناك 3 أجزاء).

يمكنك استخدام JavaScript لإرسال منشور Ajax الثاني الذي يدير البرنامج النصي العامل المناسب بعد ذلك. باستخدام Dection_user_abort () وإرسال طول محتوى ، يمكن للمتصفح فصله مبكرًا ، لكن عملية Apache ستستمر في تشغيل بياناتك ومعالجتها. الاتجاه الصعودي هو عدم وجود إمكانات Forkbomb ، الجانب السلبي هل سيفتح المزيد من عمليات Apache.

هناك خيار آخر يتمثل في استخدام cron في الخلفية التي تنظر إلى جدول العمليات لأشياء للقيام بها "لاحقًا" - يمكنك التمسك بالعناصر في هذا الجدول على الواجهة الأمامية ، وإزالتها على الواجهة الخلفية أثناء المعالجة (انظر (انظر Zend_queue).

آخر هو استخدام إطار عمل أكثر توزيعًا مثل التروس - والتي يمكن أن تعالج العناصر على الآلات الأخرى.

كل هذا يتوقف على قدراتك ومتطلباتك بشكل عام.

نصائح أخرى

وظيفة كرون جيدة لهذا. إذا كان كل ما تريد القيام به عندما يقوم المستخدم بتحميل البيانات "يا مستخدم ، شكرًا على البيانات!" ثم سيكون هذا على ما يرام.

إذا كنت تفضل طريقة أكثر إلحاحًا ، فيمكنك استخدامها exec() لبدء عملية الخلفية. في بيئة Linux ، سيبدو شيء من هذا القبيل:

exec("php /path/to/your/worker/script.php >/dev/null &");

ال & جزء يقول "ركضني في الخلفية". ال >/dev/null جزء يعيد توجيه الإخراج إلى ثقب أسود. بقدر ما تتعامل مع جميع الأخطاء وإخطار الأطراف المناسبة-كل هذا يرجع إلى تصميم نص العامل الخاص بك.

للحصول على نهج أكثر مرونة في المنصات ، تحقق من هذا PHP Manual Post

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