クライアントオブジェクト内に属性があると言いid
ます。id
それを両方のアレイのキーとして使用してみませんか?
接続とクライアントオブジェクトを1つの配列に保持し、それぞれを前に説明したのと同じキー(クライアント)の下にある1つのオブジェクトに保持できる場合もありますid
。
いずれにせよ、クライアント接続オブジェクトを格納することにした場合はいつでも、関連するすべてのソケット関数にそれを渡すことができます-
socket_select();
socket_accept();
socket_write();
- 等...
サーバーの効率に関しては、大量のクライアント(チャットサーバーの例ではすべて)にデータをブロードキャストするためのフォークを実装しました。
これは、ブロードキャストをフォークするために使用した実装です-
function broadcastData($socketArray, $data){
global $db;
$pid = pcntl_fork();
if($pid == -1) {
// Something went wrong (handle errors here)
// Log error, email the admin, pull emergency stop, etc...
echo "Could not fork()!!";
} elseif($pid == 0) {
// This part is only executed in the child
foreach($socketArray AS $socket) {
// There's more happening here but the essence is this
socket_write($socket,$msg,strlen($msg));
// TODO : Consider additional forking here for each client.
}
// This is where the signal is fired
exit(0);
}
// The child process is now occupying the same database
// connection as its parent (in my case mysql). We have to
// reinitialize the parent's DB connection in order to continue using it.
$db = dbEngine::factory(_dbEngine);
}
上記のコードは、私の前の質問から削除されました(それは自己回答でした)。
ソケットサーバーからフォークされたゾンビ子プロセスを終了する
おそらく、フォークプロセスを開始することを選択した場合に役立つ可能性があります。