|
|
LXXIV. ネットワーク関数これらの関数は、標準モジュールの一部として利用可能であり、常に使用できます。 これらの関数はPHPコアに含まれるため、使用す
る際にインストールは不要です。
これらの関数の動作は、php.iniの設定により変化します。
表 1. ネットワーク設定オプション(Network) 名前 | デフォルト | 変更の可否 |
---|
define_syslog_variables | "0" | PHP_INI_ALL |
PHP_INI_* 定数の詳細と定義については、
ini_set()を参照して下さい。
以下に設定ディレクティブに関す
る簡単な説明を示します。
- define_syslog_variables
boolean
様々なsyslog変数(例: $LOG_PID、$LOG_CRON、等)を定義するかどうか。
これをoffにするのは、性能面では良い考えです。
実行時にdefine_syslog_variables()をコールする
ことにより、これらを定義することができます。
この拡張モジュールはリソース型を全く定義しません。
この一覧にある定数は、PHPコアに含まれており常に利用可能です。
表 2. openlog()オプション 定数 | 説明 |
---|
LOG_CONS |
システムロガーにデータを送信する際にエラーが発生した場合、システ
ムコンソールに直接書き込む。
| LOG_NDELAY |
ロガーにただちに接続をオープンする。
| LOG_ODELAY |
(デフォルト) 最初のメッセージが記録されるまで接続のオープンを遅
延させる。
| LOG_NOWAIT | | LOG_PERROR | 標準エラー出力にもログメッセージを出力する | LOG_PID | 各メッセージにプロセスIDを含める |
表 3. openlog() ファシリティ 定数 | 説明 |
---|
LOG_AUTH |
セキュリティ/認証メッセージ(LOG_AUTHPRIVが定義されているシステムであれば
代わりにそれを使用してください)
| LOG_AUTHPRIV | セキュリティ/認証メッセージ (private) | LOG_CRON | 時刻デーモン (cron and at) | LOG_DAEMON | その他のシステムデーモン | LOG_KERN | カーネルメッセージ | LOG_LOCAL0 ... LOG_LOCAL7 | ローカルで使用できるようリザーブされている。Windowsでは使用できない。 | LOG_LPR | ラインプリンタサブシステム | LOG_MAIL | メールサブシステム | LOG_NEWS | USENETニュースサブシステム | LOG_SYSLOG | syslogdによって内部で生成されたメッセージ | LOG_USER | 一般ユーザーレベルのメッセージ | LOG_UUCP | UUCPサブシステム |
表 4. syslog()プロパティ(降順) 定数 | 説明 |
---|
LOG_EMERG | システムは使用不可 | LOG_ALERT | アクションを直ちに起こすことが必要 | LOG_CRIT | 危機的な条件 | LOG_ERR | エラー条件 | LOG_WARNING | 警告条件 | LOG_NOTICE | 正常、しかし、注意すべき条件 | LOG_INFO | 情報メッセージ | LOG_DEBUG | デバッグレベルメッセージ |
表 5. dns_get_record()オプション 定数 | 説明 |
---|
DNS_A | IPv4アドレスリソース | DNS_MX | Mail Exchangerリソース | DNS_CNAME | エイリアス(Canonical Name)リソース | DNS_NS | Authoritative Name Serverリソース | DNS_PTR | ポインタリソース | DNS_HINFO | ホスト情報リソース (See IANA's
for the meaning of these values) | DNS_SOA | 認証リソースの開始 | DNS_TXT | テキストリソース | DNS_ANY |
全てのリソースレコード。多くのシステムでは、
これは、全てのリソースレコードを返します。
しかし、危機的な状況には対応できません。代わりに
DNS_ALLを試してください。
| DNS_AAAA | IPv6アドレスリソース | DNS_ALL |
利用可能なレコード型毎のネームサーバへの反復クエリ。
|
nexxer at rogers dot com
25-Feb-2005 01:16
In Trevor Hemsley's translation of the perl range2cidr function, the
while ($end > $start)
condition should be
while ($end >= $start)
otherwise it won't work for /32s, ie if you feed range2cidr("1.2.3.4", "1.2.3.4").
-- nex
samuele at norsam dot org
25-Nov-2003 05:01
To find if an IP is in a net/mask (very fast):
<?php
function isIPIn($ip,$net,$mask) {
$lnet=ip2long($net);
$lip=ip2long($ip);
$binnet=str_pad( decbin($lnet),32,"0","STR_PAD_LEFT" );
$firstpart=substr($binnet,0,$mask);
$binip=str_pad( decbin($lip),32,"0","STR_PAD_LEFT" );
$firstip=substr($binip,0,$mask);
return(strcmp($firstpart,$firstip)==0);
}
?>
This function can be compacted, avoiding some variable settings, but the function will not be too clear to read...
Example code, used to made a kind of location service network-based:
<?php
$n = array ( "192.168.0.0/16" => "TUSCANY",
"192.168.1.0/24" => "- Florence",
"192.168.2.0/24" => "- Pisa",
"192.168.3.0/24" => "- Siena",
"192.168.64.0/21" => "- Tuscan Archipelago",
"192.168.64.0/23" => "--- Elba Island",
"192.168.66.0/24" => "--- Capraia Island",
"192.168.67.0/24" => "--- Giannutri Island");
$myip = $HTTP_SERVER_VARS['REMOTE_ADDR'];
$myip = "192.168.2.33";
$myip = "192.168.65.34";
echo "Your position:<br />\n";
foreach ( $n as $k=>$v ) {
list($net,$mask)=split("/",$k);
if (isIPIn($myip,$net,$mask)) {
echo $n[$k]."<br />\n"; }
}
?>
and so on...
null at tty dot net dot ru
13-Oct-2003 11:51
Ported Net::Netmask perl module:
anderson at piq dot com dot br
07-Aug-2003 05:10
If you want to get the interface of an IP, based on the local route table, use this.
function GetIfaceforIP($user_ip)
{
$route = "/bin/netstat -rn";
exec($route, $aoutput);
foreach($aoutput as $key => $line)
{
if($key > 1)
{
$line = ereg_replace("[[:space:]]+",",",$line);
list($network, $gateway, $mask, $flags, $mss, $window, $irtt, $iface) = explode(",", $line)
if((ip2long($user_ip) & ip2long($mask)) == ip2long($network))
{
return $iface;
}
}
}
}
03-Apr-2003 04:11
Alternative cidr_conv function - a little easier to follow
function cidr_conv($cidr_address) {
$first = substr($cidr_address, 0, strpos($cidr_address, "/"));
$netmask = substr(strstr($cidr_address, "/"), 1);
$first_bin = str_pad(decbin(ip2long($first)), 32, "0", STR_PAD_LEFT);
$netmask_bin = str_pad(str_repeat("1", (integer)$netmask), 32, "0", STR_PAD_RIGHT);
for ($i = 0; $i < 32; $i++) {
if ($netmask_bin[$i] == "1")
$last_bin .= $first_bin[$i];
else
$last_bin .= "1";
}
$last = long2ip(bindec($last_bin));
return "$first - $last";
}
trevor-hemsley at nospam dot dial dot pipex dot com
16-Oct-2002 06:53
Previous example of IP range to CIDR list does not cope with ranges as well as the perl Net::Netmask range2cidrlist() function. In PHP this looks like
<?
function imask($this)
{
return base_convert((pow(2,32) - pow(2, (32-$this)))), 10, 16);
}
function imaxblock($ibase, $tbit)
{
while ($tbit > 0)
{
$im = hexdec(imask($tbit-1));
$imand = $ibase & $im;
if ($imand != $ibase)
{
break;
}
$tbit--;
}
return $tbit;
}
function range2cidrlist($istart, $iend)
{
$s = explode(".", $istart);
$start = "";
$dot = "";
while (list($key,$val) = each($s))
{
$start = sprintf("%s%s%d",$start,$dot,$val);
$dot = ".";
}
$end = "";
$dot = "";
$e = explode(".",$iend);
while (list($key,$val) = each($e))
{
$end = sprintf("%s%s%d",$end,$dot,$val);
$dot = ".";
}
$start = ip2long($start);
$end = ip2long($end);
$result = array();
while ($end > $start)
{
$maxsize = imaxblock($start,32);
$x = log($end - $start + 1)/log(2);
$maxdiff = floor(32 - floor($x));
$ip = long2ip($start);
if ($maxsize < $maxdiff)
{
$maxsize = $maxdiff;
}
array_push($result,"$ip/$maxsize");
$start += pow(2, (32-$maxsize));
}
return $result;
}
?>
philippe-at-cyberabuse.org
12-Oct-2002 10:49
... and this one will do the opposite (o return NULL for invalid netblocks) :
1.0.0.0 1.0.255.255 -> 1.0.0.0/16
1.0.0.0 1.3.255.255 -> 1.0.0.0/14
192.168.0.0 192.168.0.255 -> 192.168.0.0/24
function ip2cidr($ip_start,$ip_end) {
if(long2ip(ip2long($ip_start))!=$ip_start or long2ip(ip2long($ip_end))!=$ip_end) return NULL;
$ipl_start=(int)ip2long($ip_start);
$ipl_end=(int)ip2long($ip_end);
if($ipl_start>0 && $ipl_end<0) $delta=($ipl_end+4294967296)-$ipl_start;
else $delta=$ipl_end-$ipl_start;
$netmask=str_pad(decbin($delta),32,"0","STR_PAD_LEFT");
if(ip2long($ip_start)==0 && substr_count($netmask,"1")==32) return "0.0.0.0/0";
if($delta<0 or ($delta>0 && $delta%2==0)) return NULL;
for($mask=0;$mask<32;$mask++) if($netmask[$mask]==1) break;
if(substr_count($netmask,"0")!=$mask) return NULL;
return "$ip_start/$mask";
}
philippe-at-cyberabuse.org
15-Dec-2001 03:46
PHP miss CIDR functions.
This one will convert a CIDR like this:
0.0.0.0/16 -> 0.0.0.0 - 0.0.255.255
127.0/16 -> 127.0.0.0 - 127.0.255.255
etc...
function cidrconv($net) {
$start=strtok($net,"/");
$n=3-substr_count($net, ".");
if ($n>0) { for ($i=$n;$i>0;$i--) $start.=".0"; }
$bits1=str_pad(decbin(ip2long($start)),32,"0","STR_PAD_LEFT");
$net=pow(2,(32-substr(strstr($net,"/"),1)))-1;
$bits2=str_pad(decbin($net),32,"0","STR_PAD_LEFT");
for ($i=0;$i<32;$i++) {
if ($bits1[$i]==$bits2[$i]) $final.=$bits1[$i];
if ($bits1[$i]==1 and $bits2[$i]==0) $final.=$bits1[$i];
if ($bits1[$i]==0 and $bits2[$i]==1) $final.=$bits2[$i];
}
return $start." - ".long2ip(bindec($final));
}
philip at cornado dot c()m
04-Jul-2001 09:20
More socket functions can be seen here :
| |