كمبرمج - كيف تقطع عمل function إن تجاوزت مدت عملها 30 ثانية وتكمل تنفيذ الأكواد التى تليها ؟!


التعليقات

عليك أن تغير من طريقة تفكيرك لحل مثل هذا النوع من المشاكل.

واضع أنك تحتاج Multi-threading أو Asynchronous Programming لحل هذه المشكلة

PHP بطبيعتها لا تدعم تعدد الخيوط (MultiThreading) إلا عن طريق إضافة خاصة

قم بوضع الكود الذي يأخذ وقتاً طويلاً في Thread خاص به، وضع عليه مؤقتاً Timer.

أما إذا لم يكن لديك وصول لتركيب هذه الإضافة، فعليك تغيير لغة البرمجة، إلى Java أو Python مثلاً

خطر في بالي السيناريو التالي :

  • تفتح جلسة session وفي السطر قبل الدالة تسند القيمة on لمتغير ما على الجلسة.

  • تنفذ الدالة بداخل Thread لكن في نهاية كود الدالة تغير قيمة الجلسة الى off.

  • في السطر مابعد الدالة تعمل sleep لـ 30 ثانية.

  • في السطر بعد sleep تعمل شرط اذا كانت الجلسة قيمتها on تعمل kill للـ Thread.

  • ثم تنفذ باقي الاكواد.

ممكن تستعين بهذه المكتبة في موضوع الـ Thread.

سؤالك غير واضح باي لغة تعمل وهل ممكن مثال علي ما تريد ؟

لو كان عندك ملف فية 10 دوال مثلاً

وهناك دالة فيهم ربما تأخذ وقت فى التنفيذ 60 ثانية وأنت لا تريد أن تتجاوز هذة الدالة مثلاً ال 30 ثانية

وتريد أن تغلق عمل الدالة أو تتجاوزها بعد ال 30 ثانية

أو بمعنى آخر أعطاء وقت معين للتنفيذ فى أحد اجزاء ملف ال php

شكراً لك

أنا مريت على المواضع دى فعلياً أشكرك مرة أخرى لكن المشكلة لو أن حلقة التكرار مثلا التى تأخذ 60 ثانية تأتى قبل هذا الكود

if ((time() - $start_time) > 300) {

فى راى أفضل حل أن تكون الدالة فى ملف آخر ويتم إرسال البيانات لها POST مع تحديد وقت 30 ثانية

لكنى أبحث عن حل أقرب

نعم أخي هذا هو أفضل حل ,

الفكرة هي عمل شيء مشابه لطريقة البرمجة asynchronous للموجود في javascript

كنت أبحث عن هذا الموضوع منذ بضعت أيام , وجدت هذا المقال [1] الذي يتحدث عن كل الطرق الممكنة لعمل ذلك وأفضلها .

[1]

طالما أن السيرفر الخاص بك لا يمكنه معالجة البيانات فى خلال فترة زمنية قصيرة فأنت يجب أن تحترم حدود السيرفر ولا ترهقه بدوال تجعله overloaded

إعمل على تقليل ما تستهلكه الدالة و تقسيم عملها على عدة مراحل و إسنادها إلى ال Cron jobs

من الممكن كذلك تقسيم أعمالك عبر عدة سيرفرات و بناء API على أحدهم يقوم بتوزيع ال Load عليهم

فمثلاً يقوم السيرفر رقم A بإستعلام عن 100 Row و تقوم بإرسال 50 منهم إلى سيرفر B و 50 إلى سيرفر C .. ثم تلتقط الناتج منهم بعد إنتهاء المعالجة

تحياتى

لأ مش موضوع سيرفر أو أرهاق

المشكلة دى حصلت معايا فى برنامج خاص بالنظم الخبيرة والمفترض هيشارك فية أكثر من مبرمج وكل مبرمج له اكواده الخاصة

فمش عايز كود لأى مبرمج يتجاوز فترة زمنية معينة هو دا كل ما فى الموضوع

ان كنت تقصد لغة ال PHP

يوجد اضافة لل PHP لدعم ال

Event-driven, non-blocking I/O

وهو ان شاءالله ماتبحث عنه


برمجة

المواضيع والنقاشات المتعلقة بالبرمجة بشكل عام او لغات البرمجة التي لايوجد لها مجتمعات فرعية.

24.6 ألف متابع