ホームページ >バックエンド開発 >PHPチュートリアル >PHP Pthread ソケットはグローバル静的オブジェクトのオブジェクト値を取得します

PHP Pthread ソケットはグローバル静的オブジェクトのオブジェクト値を取得します

WBOY
WBOYオリジナル
2016-06-20 12:39:57981ブラウズ

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 つ スレッド、完了 ソケットをソケットに追加し、応答 それ以外の場合は、ユーザーがデータを受信して​​いることを意味します、
ここでスレッドを開始し、完了 読み取りと応答

メイン スレッドスケジューリングを担当し、サブスレッドが操作を担当します

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。