كيفية تحديد كود PHP الذي يفتح اتصالات MySQL التي لا يتم إغلاقها

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

سؤال

لدينا تطبيق يتكون من اثنين من تطبيقات PHP الجاهزة (ExpressionEngine وXCart) بالإضافة إلى الكود المخصص الخاص بنا.

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

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

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

المحلول

ويمكنك استخدام

 SHOW PROCESSLIST  

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

والمزيد هنا: http://codeinthehole.com/archives/2- رصد الخلية-processes.html

نصائح أخرى

لا ينبغي أن يحدث هذا بسبب كود php لأنه من المفترض أن يتم إغلاق اتصالات mysql تلقائيًا.

راجع : http://www.php.net/manual/function.mysql-connect.php :

سيتم إغلاق رابط الخادم بمجرد انتهاء تنفيذ البرنامج النصي ، ما لم يتم إغلاقه في وقت مبكر عن طريق الاتصال بشكل صريح MySQL_Close ().

بعض الاقتراحات :

  • هل لدى المطور الخاص بك إمكانية الوصول المباشر من الناحية الفنية إلى خادم MySQL للإنتاج الخاص بك؟إذا كانت الإجابة بنعم، فمن المحتمل أنهم يتركون MySQL Manager مفتوحًا :)
  • هل لديك بعض العمليات الدفعية اليومية؟إذا كانت الإجابة بنعم، فربما تكون هناك بعض عمليات الزومبي في الذاكرة

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

ولكن إذا كنت تريد حقا أن ننظر إلى التعليمات البرمجية لتجد فيها يكون ربط، انظر HTTP: // xdebug. غزاله / مستندات / التعريف

وكما قال آخرون، PHP ينهي اتصالات الخلية التي تم إنشاؤها من خلال mysql_connect أو msqli حكمه / شركة تنمية نفط عمان.

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

هل يمكن خفض الحد الأقصى لعدد الاتصالات، أو خفض مهلة الاتصالات المستمرة. انظر التعليقات على الجزء السفلي من للحصول على المزيد التفاصيل.

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

وكان الشيء التالي فعلت نظرة على مهلة الاتصال وضبط لهم أشبه 30 ثانية ل. لذلك أنا تعديل بلادي my.cnf مع

وربط-مهلة = 30

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

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

$q = "SELECT '".__FILE__.'.'.__LINE__."' as _info, * FROM table ...";

وهذا من شأنه أن تدلني على ملف إصدار الاستعلام عندما نظرت في mytop، وأنه لم يكن احباط ذاكرة التخزين المؤقت الخلية الاستعلام مثل استخدام

/* __FILE__.'.'.__LINE__ */ 

وفي بداية الاستعلام بلدي شأنه.

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

memory_get_usage

memory_get_peak_usage

وعلى وجه الخصوص منذ وأنا أعمل حاليا على تسجيل من بعض التعليمات البرمجية المخصصة، ويمكنني أن تسجيل استخدام الذاكرة بينما أنا في ذلك

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