سؤال

لدي برنامج نصي PHP يحتاج إلى التشغيل لبعض الوقت.

ماذا يفعل البرنامج النصي:

  • يتصل بـ mysql
  • يبدأ في أي مكان من 100 إلى 100000 طلب من طلبات cURL
  • يقوم كل طلب cURL بإرجاع بيانات مفككة التشفير من 1 إلى 2000 قائمة عقارات - أستخدم preg-match-all للحصول على جميع البيانات وإجراء إدراج MySQL واحد لكل قائمة.لا يتجاوز كل استعلام أبدًا أكثر من 1 ميجابايت من البيانات.

لذلك هناك الكثير من الحلقات، وإدراجات MySQL، وطلبات التجعيد الجارية.تم إيقاف تشغيل الوضع الآمن لـ php وأنا قادر على تعيين ini_set الحد الأقصى لوقت التنفيذ بنجاح على شيء مثير للسخرية للسماح بتشغيل البرنامج النصي الخاص بي طوال الطريق.

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

أيه أفكار؟

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

المحلول

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

حاول ضبط حد الذاكرة على شيء أكثر منطقية:

ini_set('memory_limit', '256M');

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

بدلا من ذلك، فقط قم بتعيينه على 0, ، وهو يعادل وظيفيًا إيقاف حد التنفيذ تمامًا:

ini_set('max_execution_time', 0);

نصائح أخرى

الكثير من الأفكار:

1) لا تفعل ذلك داخل طلب HTTP.اكتب برنامج نصي PHP لسطر الأوامر لتشغيله.يمكنك استخدام برنامج نصي مرتبط بالويب لبدء تشغيله، إذا لزم الأمر.

2) يجب أن تكون قادرًا على ضبط max_execution_time على صفر (أو الاتصال بـ set_time_limit(0)) لضمان عدم إيقاف تشغيلك بسبب تجاوز الحد الزمني

3) يبدو أنك تريد حقًا إعادة صياغة هذا إلى شيء أكثر عقلانية.فكر في إعداد نظام صغير لانتظار المهام، وامتلاك برنامج نصي php يقوم بتوزيع العديد من الأطفال لمضغ كل العمل.

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

ولكن على المدى الطويل، يبدو أن لديك الكثير من العمل الذي يتعين عليك القيام به داخل طلب http واحد.أخرجه من http، وقسم تسد!

يمكنك ضبط المهلة لتكون غير محددة عن طريق تعديل PHP.ini الخاص بك وتعيين متغير تنفيذ البرنامج النصي.

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

يمكنك إصدار "بسيط"wget URL -o UniqueFileName &" سيؤدي هذا إلى استرداد صفحة ويب وحفظها في اسم ملف "فريد" وكل ذلك في الخلفية.

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

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

هذا النوع من الخيوط المتعددة قوي حقًا ولا يستخدم بشكل كبير IMHO.بالنسبة لي، هذه هي القوة الحقيقية للويب.

لقد واجهت نفس المشكلة عند الحصول على البيانات من MySQL عبر PHP والتي تحتوي على أحرف خاصة مثل علامات التشكيل ä،ö،ü، علامات الضم وما إلى ذلك.تمت إعادة تعيين الاتصال ولم أجد أي أخطاء في سجل Apache أو سجلات php.لقد تأكدت أولاً في PHP من أنني قمت بالوصول إلى الأحرف المعينة في قاعدة البيانات بشكل صحيح باستخدام:

mysql_query("SET NAMES 'latin1' COLLATE 'latin1_german2_ci'");

mysql_query("SET CHARACTER SET 'latin1'");

Then, finally, I resolved the problem with this line in PHP:

mysql_query("SET character_set_connection='latin1'");

100000 طلب الضفيرة؟؟؟انت مجنون.كسر تلك البيانات!

ماذا يوجد في Error_log اباتشي؟هل وصلت إلى الحد الأقصى للذاكرة؟

يحرر:يبدو أنك وصلت إلى الحد الأقصى للذاكرة الخاصة بك.هل لديك حق الوصول إلى PHP.ini؟إذا كان الأمر كذلك، أنت يمكن رفع Memory_limit هناك.إذا لم يكن الأمر كذلك، فحاول تشغيل ثنائيات الضفيرة أو wget باستخدام الملف exec أو shell_exec بهذه الطريقة يتم تشغيلها كعمليات منفصلة، ​​دون استخدام ذاكرة PHP.

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