2016-12-31 10 views
0

複数のRTMPサーバーの負荷分散を試みるために配列を使用しています。PHP配列を無作為化する

$servers = array(
'1.1.1.1', 
'2.2.2.2', 
); 
$edge = $servers[array_rand($settings)]; 

しかし、このコードはあまり役に立ちません。私はもう一方のサーバー2kで3kで終わります。

私はAPCを利用し、与えられた最後のIPをキャッシュし、ユーザー間のより良いIP配信を追跡することを考えていました。

私は人がip 1.1.1.1を取得したように次はip 2.2.2.2を取得して、3kと2kではなく、より近い範囲のユーザを維持するようにします。

私はMySQLを使用することができましたが、おそらくすべての要求でサーバーを叩くでしょう。

私はipsの適切な配布を達成するための最良の方法は何ですか?

+1

なぜラウンドロビンを配布しないのですか?要求の量のカウンタを保持する%array.length =次のサーバの配列内のインデックスも行きます。 –

+0

ちょうど私が考えていたもの。ディスクへの最後のリクエストを0または1としてキャッシュすることができます。 – billynoah

+0

@billynoahええ、私は最後の試みのようにそれをやっていると思っていましたが、私が望む結果を保証する最善の方法のように思えます。 – Slightz

答えて

1

は、ここでは、サイクル3配列のキーがphp memcachedを使用できるかの簡単な例です:あなたがランダム化アプローチをあきらめる前に

$servers = ['1.1.1.1','2.2.2.2','3.3.3.3']; 
$m = new Memcached(); 
$m->addServer('localhost', 11211); 
$key = $m->get('server'); 
if ($key === false) $key = 0; 
echo $servers[$key]; 
if (++$key > count($servers) - 1) $key = 0; 
$m->set('server', $key); 
+0

私のエディタでは、この行で構文エラーが発生します:$ servers = ['1.1.1.1'、 '2.2.2.2'、 '3.3.3.3']; – Slightz

+0

nvmはそれを修正しました。使用された配列( '1.1.1.1'、 '2.2.2.2'、 '3.3.3.3');また、クラス名を新しいMemcacheに変更する必要がありました。機能していませんでした。どちらの方法でも、このソリューションをお寄せいただきありがとうございます。 IPに順序を与えます、ありがとうございます。 – Slightz

+0

@Slightz - MemcacheとMemcachedは2つの異なる拡張です。両方とも基本的に同じことを行います - ここで相違点についてもっと読むことができます:http://stackoverflow.com/questions/1442411/when-should-i-use-memcache-instead-of-memcached – billynoah

0

あなたはmt_rand機能を試してみる必要があります。 randarray_randよりもランダムな結果が得られます。

$servers = array(
    '1.1.1.1', 
    '2.2.2.2', 
); 
$num_servers = count($servers); 
$edge = $servers[ mt_rand(0, $num_servers - 1) ]; 
関連する問題