[Php] لقد ذهب خادم فب أكتيفريكورد ميسكل بعيدا



Answers

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

حاول إجراء التغيير التالي.

max_allowed_packet=64M

إذا كان لديك الكثير من طلب تعيين هذا ولا تعيينه إلى أكبر بسبب ارتباطه مع البيئة الخاصة بك.

max_connections=1000

قد يؤدي إضافة هذا السطر إلى ملف my.cnf إلى حل مشكلتك. إعادة تشغيل خدمة ميسكل بمجرد الانتهاء من ذلك مع التغيير.

قراءة المزيد على خادم الخلية قد ذهب بعيدا

إذا كان لا يعمل محاولة هذه الوظيفة لصناعة السيارات في إعادة الاتصال كذلك.

Question

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

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

في البداية أنه يعطي تحذيرا:

PHP Warning: Error while sending QUERY packet. PID=XXXXX in /home/user/domains/example.com/public_html/vendor/php-activerecord/php-activerecord/lib/Connection.php on line 322

ثم يلقي خطأ فادح:

PHP Fatal error: Uncaught exception 'ActiveRecord\DatabaseException' with message 'exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 2006 MySQL server has gone away' in /home/user/domains/example.com/public_html/vendor/php-activerecord/php-activerecord/lib/Connection.php:322

تتبع المكدس:

#0 /home/user/domains/example.com/public_html/vendor/php-activerecord/php-activerecord/lib/Connection.php(322): PDOStatement->execute(Array)

#1 /home/user/domains/example.com/public_html/vendor/php-activerecord/php-activerecord/lib/Table.php(218): ActiveRecord\Connection->query('SELECT * FROM ...', Array)

#2 /home/user/domains/example.com/public_html/vendor/php-activerecord/php-activerecord/lib/Table.php(209): ActiveRecord\Table->find_by_sql('SELECT * FROM `...', Array, false, NULL)

#3 /home/user/domains/example.com/public_html/vendor/php-activerecord/php-activerecord/lib/Model.php(1567): ActiveRecord\Table->find(Array)

#4 in /home/user/domains/example.com/public_html/vendor/php-activerecord/lib/Connection.php on line 325

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

لقد قرأت شيئا عن إعداد MYSQL_OPT_RECONNECT . ولكن أنا لست متأكدا مما إذا كان يعمل أو كيفية تعيين هذا الخيار باستخدام فب-أكتيفريكورد. هل لدى أي شخص هنا بعض الخبرة في هذا المجال؟

تحرير: هنا متغيرات التكوين مهلة العالمية

VARIABLE_NAME                   VARIABLE_VALUE  
DELAYED_INSERT_TIMEOUT          300
WAIT_TIMEOUT                    28800
CONNECT_TIMEOUT                 10
LOCK_WAIT_TIMEOUT               31536000
INNODB_ROLLBACK_ON_TIMEOUT      OFF
THREAD_POOL_IDLE_TIMEOUT        60
NET_WRITE_TIMEOUT               60
INNODB_LOCK_WAIT_TIMEOUT        50
INTERACTIVE_TIMEOUT             28800
DEADLOCK_TIMEOUT_LONG           50000000
SLAVE_NET_TIMEOUT               3600
DEADLOCK_TIMEOUT_SHORT          10000
NET_READ_TIMEOUT                30



ويمكن أن يكون أيضا حجم الاستعلام، كما أحيانا أورمز الجمع بين الاستعلامات لتحسين الأداء.

حاول إعداد max_allowed_packet = 128M، على الأقل يجب أن تكون مفيدة كتشخيص.




من أجل حل هذه المشكلة، أقترح عليك:

  1. قم بتوزيع العمليات باستخدام خادم وظيفة جيرمان ( http://gearman.org/ )
  2. إدارة تلك العمليات بسهولة باستخدام المشرف ( http://supervisord.org/ )

هنا هو كيف.

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

تكوين مثال:

[program:my-daemon]
command=/usr/bin/php /path/to/your/daemon/script
autostart=true
autorestart=true

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

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

وأخيرا، علينا أن نجعل العامل متاح في كل وقت تماما مثل الخفي. لذلك، على غرار الخفي، تكوين المشرف على التشغيل التلقائي و أوتوريستارت عند وفاة عامل / توقف، مثل ذلك:

[program:my-worker]
command=/usr/bin/php /path/to/your/worker/script
autostart=true
autorestart=true

شيء آخر للاهتمام هو أنه يمكنك إضافة العديد من العمال كما تريد أن تكون على قيد الحياة الانتظار. ما عليك سوى إضافة التهيئة التالية:

numprocs=9 #change it to any number
process_name=%(program_name)s_%(process_num)02d #to identity worker number

منذ قيل لنا المشرف على أوتوريستارت كل العمليات، لدينا دائما العمال المستمر قيد التشغيل في الخلفية.

في ما يلي شرح آخر حول هذه الإستراتيجية: http://www.masnun.com/2011/11/02/gearman-php-and-supervisor-processing-background-jobs-with-sanity.html

امل ان يساعد!




Links