1

多くのユーザーが同じ PHP スクリプトを同時に呼び出す場合。実行の順序は何ですか?キューに入れられますか?1 つのセッションの実行が終了したら、別のセッションを実行しますか?

私はサーバー側のプログラミングに非常に慣れていません。私が書いているPHPは、データベースにアクセスし、トランザクションでデータベースにクエリを実行します(つまり、トランザクションのクエリが失敗した場合、コミットとロールバックがあります)。PHP が無秩序に実行されると、明らかに問題が発生します。

[追加] 返信ありがとうございます。問題についてより具体的に説明します。PHP を介してサーバーと通信するオンライン ゲームです。すべてが一貫していることを確認するには、トランザクションが必要です。新しいプレーヤーを登録するのと同じように、talbe "PlayerData" が挿入され、"PlayerInventory" が何らかのエラーで失敗したことは望ましくありません。彼らは全体として成功するか失敗するはずでした。

したがって、PHP が同時に実行される場合、「ロールバック」または「コミット」は、他の PHP によって同時に実行されているトランザクションをロールバックまたはコミットする可能性があります。

それで、これに対する解決策は何ですか?

前もって感謝します

4

3 に答える 3

1

サーバーは、受信した各要求を処理します。PHPは、同時変更に直面してもデータの整合性を維持するのに役立ちません。そうは言っても、DBトランザクションを使用すると、複数のクエリが連続して(次々に)実行されたように見えるため、データの整合性を維持するのに役立ちます。

DBコードがトランザクション内にある場合、DBMSはトランザクションを処理して、DBコードが次々に実行されたように見せます(実際にはその下で発生したことではない場合でも)。これは、DBMSがACIDトランザクションをサポートしていることを前提としています。

于 2012-08-08T05:06:46.273 に答える
1

Webサーバーによって異なります。標準のApacheインストールでは、複数の子が並列でリクエストを処理します。20人の子供がいて、20人が同じスクリプトを要求した場合、スクリプトの20個のコピーが同時に実行されます。

スクリプトの各コピーは、名目上は互いに独立しており、通信チャネル(セッション、データベース、共有ファイル/メモリなど)を追加しない限り、スクリプトの実行中の各コピー間の通信はありません。

データベースで複数のリクエストを並行して実行できない場合は、データベースに適切なトランザクションとテーブル/行のロックを実装して、それらの並列リクエストが互いのつま先を踏みつけないようにする必要があります。これらは引き続き並行して実行されますが、トランザクション/ロックにより、実際のデータベース操作が確実にシリアル化されます。

于 2012-08-08T05:08:06.937 に答える