クライアントは次のように PHP を使用しています。
function getBlah($something) {
$p1 = "foo";
$p2 = "bar";
$obj = new COM("namespace.class");
$result = $obj->method($p1,$p2,$something);
unset($obj);
$blah = explode(chr(10),$result); // and do other stuff
echo $blah;
}
COM オブジェクトは VB.NET クラスです。このコードは機能します。PHP は Web ページから実行されています。
.NET メソッド内で、サーバーとの通信を行う別のクラスがインスタンス化されます。メソッドが完了すると、.NET ガベージ コレクションによってすべてのリソースが破棄されることを "想定" します。さらに、PHP メソッドが完了すると、COM オブジェクトは PHP GC によってラップされ、それらのリソースは他のプロセスで使用できなくなると「仮定」します。
しかし、複数のユーザーが関数を同時に実行すると、.NET メソッド オブジェクト内でインスタンス化されたスレッドが再利用されることがわかりました。user1 が PHP を実行すると、COM オブジェクトがインスタンス化され、メソッドが呼び出され、マネージド オブジェクトが作成されます。そのオブジェクトはスレッドで作成され、サーバーの応答を数ミリ秒から数秒待ちます。今度は user2 が同じことを行いますが、どういうわけか user1 の応答が user2 のスレッドに返されます。そのため、いずれかまたは両方のプロセスが返され、そのうちの 1 つが他のスレッドからの応答を受け取る可能性があります。
ええ、私たちは皆、「仮定」が何を意味するかを知っており、可能な限りあらゆる方法で明示的なリソースの破棄を試みました。
ここでの別の質問は、正反対の問題を表しています: PHPでCOMオブジェクトをキャッシュ/シリアル化することは可能ですか? それに対する回答はノーと言いますが、これはそうではないことが証明されるかもしれません.
これを再現するのは非常に難しい場合がありますが、それが時々発生するという事実は非常にいらいらさせられます.Webフォームを送信して、他の誰かのトランザクションの確認を取得することを想像してください.
PHP変数のスコープは各プロセスに固有であり、各プロセスGCは各関数の最後に独自のリソースを持っていますが、COMオブジェクトに割り当てられたメモリは、2人のユーザーが同じコードを実行している間、何らかの方法で共有されているようです. つまり、COM オブジェクトを含む PHP 関数は再入可能ではないようです。
これが定義された動作であること、またはこれが検証可能なバグであることを確認するために、誰かがいくつかのルールを指摘できますか?
PHP over Windows はスレッドセーフではないと認識されますか?
スレッドセーフな安定性を確保するために設定する必要があるフラグまたは適用するパッチはありますか?
セマフォまたはブロッキング ロックを使用する必要がありますか?
Fast-CGI または IIS7 に関する問題や既知の構成はありますか?
PHP のバージョンが手元になく、正確な環境の詳細を取得する必要があります。いくつかの詳細が欠けていることをお許しください。何か重要なことを知っている場合は、質問してください。(ええと、答えがあなたの反応を変えないかどうか尋ねないでください。)私はPHPの人よりも.NETの人でもあるので、ここで重要なことやPHPの第一人者にとって明らかなことを見落としている可能性があります。 .
はい、私はこれらの質問のいくつかに対する答えを何ヶ月も探していましたが、Google やここ SO ではうまくいきませんでした。ここにいます。
ありがとう!