4

現在、自分の画像サイトに、一意の $imgid に対してユーザー IP をデータベースに保存する好きな機能があります。

現在、IP は文字列として保存されています。スペースを節約するために、IP を小数点付きの文字列としてではなく、32 ビット整数として格納したいと思います (文字列内の整数ごとに 1 ビット対文字ごとに 1 バイト)。n個の一意のIPがx個の画像を好む可能性があるため、これによりかなりのスペースを節約できると思います...

したがって、指定された文字列「109.181.156.221」は、数値の最大 12 バイト + 小数点あたり 3 バイトになります... 15 バイト * 5000 IP * 10 イメージ ID = 7.1 Mb

対 32 ビット 109181156221、4 バイト * 5000 IP * 100 イメージ ID = 2 Mb

したがって、IP を挿入する前に、正規表現を使用して小数を削除し、IP を数値として保存したいと思います... "109.181.156.221" -> 109181156221 正規表現は初めてですが、これを試しましたが、うまくいきません:

$ipINT = preg_replaceAll("\\.+$", "" , $ipString);

だから私の質問は:

1) スペースの節約は、Mysql データベースでも問題になりますか? これは苦労する価値がありますか?

2) 正規表現でどこに行ったのですか?

3) 読み込もうとしている場合、元に戻すことはできますか?

何かご意見は?

ありがとう!

4

4 に答える 4

4

ip2long ()を使用すると、unsigned int 列に収まるはずです。

于 2013-02-21T17:50:12.587 に答える
3

これにはさまざまな方法があります。

正しい方法:

データベースに変換を任せることによって。IPをデータベースに保存し、INET_ATON & INET_NTOAINT(10) UNSIGNEDを使用する必要があります:

SELECT INET_ATON("109.181.156.221"); // result 1840618717
SELECT INET_NTOA("1840618717"); // result 109.181.156.221

別の方法:

PHP 内部関数ip2long() & long2ip()を使用して、DB に保存します。

$ipINT = ip2long('109.181.156.221'); // result 1840618717
$ip = long2ip('1840618717'); // result 109.181.156.221

非標準的な方法:

ドットを削除し、必要に応じて「0」を追加して元に戻す:

function ip2int($ip){
  $chunks = explode(".", $ip);
  $int = '';
  foreach($chunks as $chunk){
    $int .= str_pad($chunk, 3, '0', STR_PAD_LEFT);
  }
  return $int;
}

function int2ip($int){
  $chunks = str_split($int, 3);
  $c = count($chunks);
  $ip = ltrim($chunks[0], '0');
  for($i=1;$i<$c;$i++){
    $ip .= '.' . ltrim($chunks[$i], '0');
  }
  return($ip);
}

echo ip2int("109.1.156.5") . '<br>'; // result 109001156005
echo int2ip("109001156005"); // result 109.1.156.5

正規表現の修正:

$ip = "109.181.156.221";
$replace = preg_replace("/\./", "", $ip); // This will remove all the dots
echo $replace; // result 109181156221
于 2013-02-21T19:33:30.663 に答える
2

この関数を使用してip2long()IPアドレスを格納します-符号なしINT(10)は素晴らしいはずです。

long2ip()デコードに使用します。

http://php.net/manual/en/function.ip2long.php

小数点を復元する場所がわからないため、1.123.123.123のようなIPアドレスではソリューションは機能しません。IPアドレスを保存する正しい方法は、上記の方法を使用することです。

于 2013-02-21T17:51:15.527 に答える
0

正規表現を必要としない数字のみを抽出したい場合は、次を使用できます。

filter_var('109.181.156.221', FILTER_SANITIZE_NUMBER_INT);

あなたに109181156221を与えるでしょう

しかし、それを IP 形式に戻すことはできないと思います。

私はそれをドットで保存します。

于 2013-02-21T17:55:09.443 に答える