كيفية إعادة تشغيل البرنامج النصي Perl الذي يعمل ضمن mod_fcgid عند تغييره؟

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

  •  12-12-2019
  •  | 
  •  

سؤال

أقوم بتشغيل بعض البرامج النصية لـ FastCGI ضمن mod_fcgid, ، وأرغب في إعادة تحميلها تلقائيًا عندما أقوم بإجراء أي تغييرات على البرنامج النصي.

تحت mod_fastcgi, ، يمكنك تكوين

FastCgiConfig -autoUpdate

للقيام بذلك بالضبط، ولكن mod_fcgid ليس لديه مثل هذا الخيار.هل لدى أي شخص حل جيد لهذا؟

أفضل ما توصلت إليه هو:

while (my $cgi = CGI::Fast->new()) {
    processRequest($cgi);
    exit if -M $0 < 0;  # restart if script changed
}

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

إذا قمت بذلك exit قبل processRequest, ، يحصل المستخدم على خطأ، لذلك لن يحدث ذلك أيضًا.

شكرا لك مقدما،

- ميخائيل

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

المحلول

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

use CGI::Fast;
while (my $cgi = CGI::Fast->new) {
    processRequest($cgi);
}

ل

use CGI::Emulate::PSGI;
use CGI;

my $app = CGI::Emulate::PSGI->handler(sub {
    my $cgi = CGI->new;
    processRequest($cgi);
});

(إن كتابة تطبيق PSGI أصلي مناسب هو أمر أجمل، ولكن هذا الإصدار يوفر عليك إعادة كتابة معظم تطبيقك).

نصائح أخرى

لم أحاول هذا على الإطلاق، ولكن سوف Module::Refresh العمل لديك mod_fcgid المقاصد؟

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