PHP Pthread socket 擷取全域靜態對象裡的對象值

來源:互聯網
上載者:User
我想問一下 PHP Pthread用法

我現在在弄打牌遊戲 用戶端跟 服務端 都寫好了

現在能打牌多人對玩都可以 不過 socket 用的是單線程的

打牌時候有人沒出牌的話 就得停頓一下
反正得很多地方用sleep
就是sleep一下
那整個伺服器就卡了 因為是單進程單線程的。。
所以想解決這個問題 我打算用pthread 一個玩家就是一個線程 就是 玩家對象裡存放 線程 然後方便通訊跟延時
我用了一下Thread 運行以後好像直接不能跟 主進程拿資料 或者可不可以 一個玩家對象是線程
因為沒太用過線程不清楚怎麼實現思路也就不清晰了 也不知道可不可以實現

請高手給個思路 卡一周了 都開發完了 又不能換語言 然後 伺服器是 windows 因代碼太多 簡單自己貼下代碼 **星號處不能擷取
然後有好的 思路 告訴一下 就是sleep停頓跟 通訊部分。。。。。
class WaittingRoom{
public static $Rooms= array();
public static $Gamers = array();
public function addGamer($gamer_id){
db查詢
self::$Gamers = new Gamer($gamer_id);
}
}
WaittingRoom::addGamer("game_id");

class Connection extends Thread {
public $connection;
public $uid = null;
public $is_free;
public function __construct($client){
$this->is_free = false;
$this->connection = $client;
$this->start();
}

connections = array();
do{
有串連的話
connections [] = new Con($sockit);
}while

class Con(){
public function __construct($client){
$this->connection = $client;
$this->start();
}
public run(){
while($this-connection讀資料){
然後這裡 處理資料
處理資料時候 掉用 全域靜態變數
****** WaittingRoom::$Gamers[標識]->指定函數或者變數都不能擷取導資料 DB操作也不行 ********

}

}
}


回複討論(解決方案)

你的思路好像有問題吧?也可能是我道行較淺無法理解你的多線程是如何工作的
一個 socket 服務端只能偵聽一個連接埠,你用多線程怎麼設偵聽連接埠?使用者如何知道那個連接埠是閒置?

你說大量使用了 sleep,這是為什嗎?
既然有迴圈等待(我猜的),那麼 sleep 必將拖慢處理過程

如果不幸被我猜中的話,那麼你使用的是點對點的 socket 架構
按你描述的應用,應使用 select 架構(點對多點):
建立主偵聽 master
將其加入串連字列表 sockets[] = master
在永久迴圈中(說死迴圈不好聽):
擷取串連字列表副本 changed = sockets
讀取各串連字狀態 socket_select(changed) (由於 socket_select 會改變 changed 的內容,所以上一步要取副本)
socket_select 只在串連字列表有變化時才會返回,所以就不需要 sleep 等待了
遍曆有效串連字列表 foreach(changed as socket) :
if(socket == master) 通常表示有新串連請求,將 socket 加入 sockets,並作應答
else 表示某使用者有資料傳入,讀取並作應答

你可以看到,這個架構並不是你想象的那麼複雜吧

理解 你說的那部分已經實現了 socket 接收資料是沒問題的 多個使用者也是可以接受資料 接到資料 並用那個資料 建立的對象 也就是 在讀寫操作的伺服器頁面裡 建立了對象 大廳對象 房間對象 玩家對象 大廳裡存放玩家跟 房間對象 當要玩遊戲的時候 就進入房間 往房間對象裡放入 玩家對象 然後玩家齊了之後 並開始遊戲 建立 裁判對象 也就是遊戲引擎 遊戲引擎裡 得 結果運算
發牌事件同步等問題 得等待1兩秒鐘 裡面還有 電腦。。。。電腦不給 sleep的話 都看不到 發牌直接就輪到你 發牌了 。。

唉說了一大堆 自己語言水平有限。。。 就是WEB頁面的話 一個使用者一個頁面。。 不過socket的話 多個使用者 在一個頁面裡讀寫
一個頁面給sleep的話 直接 進入的全部玩家跟房間裡的玩家 都接收不到資料 所以得多執行緒
現在主要就是不太會多線程。。 多出來的線程sleep 不會影響 主線程。。 其他使用者可以讀寫資料
然後現在 貼代碼時候。。 遇到了 線程裡不能讀取 全域對象裡 。。。。 建立的對象。。。 也就是 玩家對象。

沒有方法嗎 線上等

如果你需要使用多線程時,要
if(socket == master) 通常表示有新串連請求, 在這裡啟動一個線程,完成 將 socket 加入 sockets,並作應答
else 表示某使用者有資料傳入, 在這裡啟動一個線程,完成 讀取並作應答

主線程負責調度,子線程負責操作

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.