2016-12-06 13 views
3

Apache hhtpdのmod_perlでいくつかのSOAP :: Liteクライアントを実行しています。 これらのうちのいくつかは1.1のsoap-serversを使用し、そのうちのいくつかは1.2のサーバを使用します。これは、スタンドアロンのクライアントで動作しますが、私はmod_perlの下のコードを実行すると、私はsoapversion 方法は副作用を持っていることに刺さ取得するように見えるSOAP :: Lite - mod_perlでスレッド1.1と1.2を使用しているクライアント

# In client 1: 
my $soap1 = SOAP::Lite->soapversion("1.1"); 
$result1 = $soap1->method1(); 

# In client 2: 
my $soap2 = SOAP::Lite->soapversion("1.2"); 
$result2 = $soap2->method2(); 

# From SOAP::Lite.pm 
sub soapversion { 
    my $self = shift; 
    my $version = shift or return $SOAP::Constants::SOAP_VERSION; 

    ($version) = grep { 
     $SOAP::Constants::SOAP_VERSIONS{$_}->{NS_ENV} eq $version 
     } keys %SOAP::Constants::SOAP_VERSIONS 
      unless exists $SOAP::Constants::SOAP_VERSIONS{$version}; 

    die qq!$SOAP::Constants::WRONG_VERSION Supported versions:\[email protected]{[ 
     join "\n", map {" $_ ($SOAP::Constants::SOAP_VERSIONS{$_}->{NS_ENV})"} keys %SOAP::Constants::SOAP_VERSIONS 
     ]}\n! 
     unless defined($version) && defined(my $def = $SOAP::Constants::SOAP_VERSIONS{$version}); 

    foreach (keys %$def) { 
     eval "\$SOAP::Constants::$_ = '$SOAP::Constants::SOAP_VERSIONS{$version}->{$_}'"; 
    } 

    $SOAP::Constants::SOAP_VERSION = $version; 

    return $self; 
} 
だから私のようなコードを持っています基本的には

soapversionコールrededefines不可欠定数$SOAP::Constants中:

は、これは私が起こる信じるものです。これはmod_perlなので、$SOAP::Constantsはグローバルであり、すべてのサーバースレッド間で共有されています(私が間違っていると私を修正してください)。これは競合状態につながります。ほとんどの場合、コードラインは上記のシーケンスで多かれ少なかれ実行されます。実行シーケンスがある。しかし、たまに(呼び出しの実際の約2%)の中で:

Thread1: my $soap1 = SOAP::Lite->soapversion("1.1"); 
Thread2: my $soap2 = SOAP::Lite->soapversion("1.2"); 
Thread1: $result1 = $soap1->method1(); 
Thread2: $result2 = $soap2->method2(); 

だから、$soap1->method1()は、バージョン1.2にふさわしいよう$SOAP::Constantsセットで呼び出されます - 特に、いくつかの名前空間が間違っている原因: 1.1のために間違っている

xmlns:soapenc="http://www.w3.org/2003/05/soap-encoding" 

- 好む:

xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"             

私は何とか$SOAP::Constantsを作ることができるかのようにローカライズerverthreadなんか、そういうものなんて、うまくいくと思うよ。しかし、どんな解決策も認められるでしょう。

答えて

1

preforkのモデルの代わりに、スレッドモデル(代わりにmpm_event_moduleまたはmpm_worker_modulempm_prefork_module)とファイル名を指定して実行のApacheに、各Apacheの子が定数の独自のセット、したがって、独自のPerlインタープリターを持つことになりますように。

そうでない場合PerlOptionsディレクティブ、特にcloneおよび/またはparent値についてmodperlマニュアルの顔をしています。しかし、スレッドの使用を止めることは私にとっては簡単なようですが、スレッドとPerlは決して友人ではありませんでした。

+0

残念ながら、私はそれをテストする立場にはいませんが、それは私によく見えます。 – NoMann

関連する問題