PHP: ネットワーク関数 - Manual
PHP  
downloads | documentation | faq | getting help | mailing lists | | php.net sites | links | my php.net 
search for in the  
<muscat_setupcheckdnsrr>
view the version of this page
Last updated: Tue, 21 Dec 2004

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_NEWSUSENETニュースサブシステム
LOG_SYSLOGsyslogdによって内部で生成されたメッセージ
LOG_USER一般ユーザーレベルのメッセージ
LOG_UUCPUUCPサブシステム

表 4. syslog()プロパティ(降順)

定数説明
LOG_EMERGシステムは使用不可
LOG_ALERTアクションを直ちに起こすことが必要
LOG_CRIT危機的な条件
LOG_ERRエラー条件
LOG_WARNING警告条件
LOG_NOTICE正常、しかし、注意すべき条件
LOG_INFO情報メッセージ
LOG_DEBUGデバッグレベルメッセージ

表 5. dns_get_record()オプション

定数説明
DNS_AIPv4アドレスリソース
DNS_MXMail Exchangerリソース
DNS_CNAMEエイリアス(Canonical Name)リソース
DNS_NSAuthoritative Name Serverリソース
DNS_PTRポインタリソース
DNS_HINFOホスト情報リソース (See IANA's for the meaning of these values)
DNS_SOA認証リソースの開始
DNS_TXTテキストリソース
DNS_ANY 全てのリソースレコード。多くのシステムでは、 これは、全てのリソースレコードを返します。 しかし、危機的な状況には対応できません。代わりに DNS_ALLを試してください。
DNS_AAAAIPv6アドレスリソース
DNS_ALL 利用可能なレコード型毎のネームサーバへの反復クエリ。
目次
checkdnsrr --  指定したインターネットホスト名もしくはIPアドレスに対応するDNSレコー ドを検索する
closelog -- システムログへの接続を閉じる
debugger_off -- PHPの内部デバッガを無効にする(PHP 3)
debugger_on -- PHPの内部デバッガを有効にする
define_syslog_variables -- syslogに関係する全ての定数を初期化する
dns_check_record -- checkdnsrr()と同義
dns_get_mx -- getmxrr()と同義
dns_get_record --  Fetch DNS Resource Records associated with a hostname
fsockopen --  インターネットもしくはUNIXドメインのソケット接続をオープンする
gethostbyaddr --  指定したIPアドレスに対応するインターネットホスト名を取得する
gethostbyname --  インターネットホスト名に対応するIPアドレスを取得する
gethostbynamel --  指定したインターネットホスト名に対応するIPアドレスのリストを取得 する。
getmxrr --  指定したインターネットホスト名に対応するMXレコードを取得する
getprotobyname --  プロトコル名のプロトコル番号を得る
getprotobynumber -- プロトコル番号が指すプロトコル名を得る
getservbyname --  インターネットサービスおよびプロトコルが関連するポート番号を得る
getservbyport --  ポートおよびプロトコルに対応するインターネットサービスを得る
inet_ntop --  Converts a packed internet address to a human readable representation
inet_pton --  Converts a human readable IP address to its packed in_addr representation
ip2long --  (IPv4) インターネットプロトコルドット表記のアドレスを適当なアドレ スを有する文字列に変換する
long2ip --  (IPv4) インターネットアドレスをインターネット標準ドット表記に変換 します。
openlog -- システムログへの接続をオープンする
pfsockopen --  持続的なInternetまたはUnixドメインソケット接続をオープンする
socket_get_status --  既存のソケットリソースに関する情報を返す
socket_set_blocking -- ソケットにおけるブロック非ブロックモードの設定
socket_set_timeout -- ソケットのタイムアウト時間を設定する
syslog -- システムログのメッセージを生成する


add a note add a note User Contributed Notes
ネットワーク関数
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");

// Normally you should use the following line
$myip = $HTTP_SERVER_VARS['REMOTE_ADDR'];
// This is first example: returns Tuscany/Pisa
$myip = "192.168.2.33";
// This is second example: returns Tuscany/T.Arch./Elba
$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)
{
// use base_convert not dechex because dechex is broken and returns 0x80000000 instead of 0xffffffff
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)
{
// this function returns an array of cidr lists that map the range given
$s = explode(".", $istart);
// PHP ip2long does not handle leading zeros on IP addresses! 172.016 comes back as 172.14, seems to be treated as octal!
$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 :

<muscat_setupcheckdnsrr>
 Last updated: Tue, 21 Dec 2004
show source | credits | sitemap | contact | advertising | mirror sites 
Copyright © 2001-2005 The PHP Group
All rights reserved.
This unofficial mirror is operated at: /
Last updated: Mon Mar 14 08:13:06 2005 Local time zone must be set--see zic manual page