ホームページ >バックエンド開発 >PHPチュートリアル >PHP Pthread ソケットはグローバル静的オブジェクトのオブジェクト値を取得します
PHP Pthread の使用法についてお聞きしたいのですが
現在カードゲームを開発中です。クライアントとサーバーの両方が作成されました。
これでカードをプレイできるようになりました。
カードをプレイするとき、誰かがカードをプレイしない場合は一時停止する必要があります
とにかく、多くの場所でスリープを使用する必要があります。
そのままスリープしてください
その後、単一プロセスであるため、サーバー全体が停止します。 。
そこで、私は pthread を使用する予定です。スレッドは、通信と遅延を容易にするために、プレーヤー オブジェクトに格納されます。メインプロセスから直接データを取得することはできません。それとも、プレーヤーオブジェクトはスレッドです
スレッドをあまり使用したことがなく、実装方法がわからないため、アイデアは異なります。実装できるかわかりません。
開発中のため、変更できません。
アイデアを教えてください。コードが多すぎるので単純に自分でコードを投稿します **アスタリスクが取得できません
あと、スリープポーズと通信部分について何か良いアイデアがあれば教えてください。 。 。 。 。
クラス WaitingRoom{
public static $Rooms= array();
public static $Gamers = array();
public function addGamer($gamer_id){
db query
self ::$Gamers = new Gamer($gamer_id);
}
}
WaittingRoom::addGamer("game_id");
class Connection extends Thread {
public $connection ;
public $uid = null;
public $is_free;
$this->is_free = false; $client;
$this->start();
}
}
connections = array();
do{
接続がある場合 [ ] = new Con($sockit);
}while
class Con(){
public function __construct($client){
$this->connection = $client; 🎜> $this->start();
}
public run(){
while($this-connection reads data){
ここでデータを処理します
処理時に使用されますデータ全体の状況 静的変数
****** WaitingRoom::$Gamers[identity]->指定された関数または変数はインポートされたデータを取得できず、DB 操作もできません ********
******
}
}
あなたの考え方に何か問題があるようですか?また、私がマルチスレッドの仕組みを理解するのに十分な知識がないことも考えられます。
マルチスレッドを使用する場合、ソケットサーバーは 1 つのポートのみをリッスンします。ユーザーはどのポートが空いているかをどのようにして知るのでしょうか?
睡眠がよく使われると言いましたが、それはなぜですか?
待機中のループがあるため (私の推測です)、スリープすると間違いなく処理が遅くなります
残念ながら私が推測したのであれば、ポイントツーポイントのソケット アーキテクチャを使用していることになります
によるとあなたの説明 アプリケーションは選択アーキテクチャ (ポイントツーマルチポイント) を使用する必要があります:
マスター リスナー master を作成します
それを接続リストに追加しますソケット[] = master
永続的なループ内で (無限ループと言います) :
コネクタリストのコピーを取得して変更 = ソケット
各コネクタのステータスを読み取ります。ステップ)
ソケット選択はコネクタリスト内にのみあります。変更があった場合にのみ返されるため、スリープして待つ必要はありません。
(ソケットとして変更された)foreach の有効な接続ワードのリストを調べます。 🎜> if (socket == master) は通常、新しい接続リクエストがあることを意味し、ソケットソケットを追加して応答します
else はユーザーがデータを受信し、それを読み取って応答することを意味します
このアーキテクチャはあなたが思っているほど複雑ではありません
を発行します。イベント同期として 1 ~ 2 秒待つ必要がありますが、内部にはコンピューターがあります。 。 。 。コンピューターが睡眠を与えてくれないと、配られるカードを見ることができなくなり、今度はあなたがカードを配る番になります。 。
ああ、たくさん話しましたが、私の言語能力には限界があります。 。 。 WEBページであれば、1ユーザーにつき1ページとなります。 。ただし、ソケットの場合は、1ページで複数のユーザーが読み書きできます
ページをスリープに与えると、直接入ってきたプレイヤー全員とルームにいるプレイヤーはデータを受信できないため、マルチスレッド処理
メイン今のところスレッドがあまりないということです。 。余分なスレッドのスリープはメインスレッドには影響しません。 。他のユーザーはデータ
の読み取りと書き込みを行ってから、コードを投稿できます。 。グローバル オブジェクトをスレッドで読み取れないことがわかりました。 。 。 。作成されたオブジェクト。 。 。つまり、プレイヤーオブジェクトです。
マルチスレッドを使用する必要がある場合、
if (socket == master) は通常、新しい接続要求を示します、
startここに 1 つ スレッド、完了 ソケットをソケットに追加し、応答 それ以外の場合は、ユーザーがデータを受信していることを意味します、
ここでスレッドを開始し、完了 読み取りと応答