هل PHP مناسب لمشاريع كبيرة جدا؟ هل يمكن أن تكون آمنة المعاملات؟

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

  •  06-09-2019
  •  | 
  •  

سؤال

قد يبدو هذا السؤال غريبا.

ولكن في كل مرة أقول فيها مشاريع PHP في الماضي، واجهت هذا النوع من الخبرة السيئة:

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

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

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

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

لا يوجد حل صحيح

نصائح أخرى

هل PHP مناسب لمشاريع كبيرة جدا؟

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

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

الكثير إذا تم تغطية السلوك السيئ في أطر جيدة مثل إطار zend. أي شيء يستغرق وقتا أطول من 10 ثوان افسدت حقا ولكن يمكنك دائما رفع وقت التنفيذ http://de3.php.net/set_time_limit.

الكثير من المواقع الكبيرة ما هي في PHP: Facebook، Wikipedia، Studivz، Digg.com إلخ. الكثير من الأشياء التي تتحدث عنها هي مجرد أشياء تكوين ربما يجب عليك النظر في ذلك؟

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

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

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

إذا كنت بحاجة إلى القيام بالمعاملات في PHP، يمكنك فقط القيام:

mysql_query("BEGIN");

/// do your queries here

mysql_query("COMMIT");

سيملك الأمر الالتزام الصفقة فقط.

في حالة حدوث أي أخطاء، يمكنك فقط الاستعادة مع:

mysql_query("ROLLBACK");

يحرر: ملاحظة سيعمل هذا فقط إذا كنت تستخدم قاعدة بيانات تدعم المعاملات، مثل InnoDB

يمكنك تكوين مقدار الوقت المسموح به لتنفيذ البرنامج النصي، إما في إعداد PHP.INI أو عبر ini_set / set_time_limit

بدلا من Studivz (The German Facebook Clone)، يمكنك إلقاء نظرة على Facebook الفعلي الذي هو PHP بالكامل. أو digg. أو العديد من مواقع ياهو. أو الكثير، كثيرون آخرون.

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

بالنسبة لهذه الحلقات الكبيرة مثل حذف ألبومات الصور أو إرسال 1000 من رسائل البريد الإلكتروني الخاصة بك تبحث عن ignore_user_abort و set_time_limit.
شيء من هذا القبيل:

ignore_user_abort(true); //users leaves webpage will not kill script
set_time_limit(0); //script can take as long as it wants
for(i=0;i<10000;i++)
 costly_very_important_operation();

كن حذرا ولكن هذا يمكن أن يدير البرنامج النصي إلى الأبد:

ignore_user_abort(true); //users leaves webpage will not kill script
set_time_limit(0); //script can take as long as it wants
while(true)
  do_something();

لن يموت هذا البرنامج النصي، إلا إذا قمت بإعادة تشغيل الخادم الخاص بك.

لذلك من الأفضل أن تحدد أبدا time_limit 0.

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

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

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

هناك قلق أمني مع هذا الرمز، ولكن "افصل" عملية من PHP قيد التشغيل تحت شيء مثل Apache:

exec("nohup /usr/bin/php -f /path/to/script.php > /dev/null 2>&1 &");

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

من الجيد أن يستغرق النظام القائم على Java بضع دقائق لبدء التشغيل، وتهيئة وتحميل جميع الكائنات الافتراضية وتحميلها. ولكن هذا غير مقبول مع PHP. سوف يستغرق PHP المزيد من التخطيط لأنظمة أكبر. السؤال هو، متى يتم حفظ الوقت في استخدام PHP يضيع من خلال وقت التخطيط الإضافي المطلوب لنظام كبير؟

السبب في أنه من المرجح أن تواجه اتساقات قاعدة بيانات سيئة في الماضي لأنك كنت تستخدم محرك MyISAM ل MySQL (والذي لا يدعم المعاملات). استخدم InnoDB بدلا من ذلك، فإنه يدعم المعاملات وأداء قفل مستوى الصف. أو استخدام postgresql.

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

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