كيفية إعادة تشغيل البرنامج النصي Perl الذي يعمل ضمن mod_fcgid عند تغييره؟
سؤال
أقوم بتشغيل بعض البرامج النصية لـ 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
المقاصد؟