Frage

Ich muss eine prähistorische Website mit Tonnen von Perl-Code pflegen.Nach dem Umzug auf einen neuen Server wurden die Dinge unscharf:

Wenn mehrere Anfragen vom selben Client auf einer Seite ausgeführt werden (Bilder mit GD generieren), überschreiben diese Skripte die Variablen der anderen, was zu seltsamen Ergebnissen führt.

Als schnelle Problemumgehung habe ich in Apache MaxRequestsPerChild=1 gesetzt, was das Problem behebt, aber jetzt werden die Dinge nur noch langsam ausgeführt ...

Gibt es eine Möglichkeit, die Anfragen zu trennen?Irgendwelche mod_perl- oder Apache-Parameter, die mir helfen könnten?

Apache:

Server version: Apache/2.2.15 (Unix)
Server built:   Apr  3 2014 23:56:16
Server's Module Magic Number: 20051115:25
Server loaded:  APR 1.3.9, APR-Util 1.3.9
Compiled using: APR 1.3.9, APR-Util 1.3.9
Architecture:   64-bit
Server MPM:     Prefork
  threaded:     no
    forked:     yes (variable process count)

perl -v

This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi

Jede Lösung hierfür wäre sehr dankbar :)


BEARBEITEN:Ich konnte mit mod_perl keinen geeigneten Weg finden, die Probleme zu beheben, aber die folgende Problemumgehung funktioniert:

  • Deaktivieren Sie mod_perl
  • Aktivieren Sie mod_cgi
  • AddHandler CGI-Skript .pl
  • Deaktivieren Sie suEXEC

Letzteres war notwendig, weil es mir „vorzeitige End-of-Script-Header“ gab, als suEXEC aktiviert war.

War es hilfreich?

Lösung

Nein, Sie können nichts tun, um „die Anfragen zu trennen“.Alle Skripte, die in einem einzelnen Perl-Interpreterprozess ausgeführt werden, nutzen dieselbe Umgebung, und unter mod_perl ist diese Umgebung dauerhaft.Sie können versuchen, es einzurichten ModPerl::Registry um sie auszuführen (falls Sie dies noch nicht getan haben), was sie in ihre eigene Unterroutine einschließen und einige der Namespace-Probleme beseitigen sollte, aber wenn die Skripte nicht im Hinblick auf Persistenz geschrieben wurden (*), werden Sie dies trotzdem tun sie zumindest teilweise zu modifizieren.

http://perl.apache.org/docs/2.0/user/intro/start_fast.html#Registry_Scripts

Sie können auch auf Probleme stoßen, wenn die Skripte bestimmte Module wie SOAP::Lite verwenden, die einen globalen Status haben, der von allen Modulen, die sie verwenden, gemeinsam genutzt wird. Dies ist jedoch ein viel selteneres Problem.

Also nein, leider können Sie nichts tun, um sicherzustellen, dass die Skripte ordnungsgemäß funktionieren, ohne sie zu ändern.Manchen geht es vielleicht gut, anderen nicht.Möglicherweise sollten Sie neben dem separaten mod_perl-Server einen regulären Apache-CGI-Server einrichten und diese schrittweise migrieren.Auf dem regulären CGI-Server erhalten Sie zwar nicht die gleiche Leistung, aber die Probleme treten auch nicht auf.

(*) Insbesondere, und das stammt aus der Erinnerung von vor vielen, vielen Monden, müssen sie das Setzen globaler Variablen vermeiden und Variablen immer mit deklarieren my, verwenden Sie das CGI-Modul (oder die mod_perl-API) für die Anforderungsinteraktion und ähnliches.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top