本文实例讲述了PHP实现更改hosts文件的方法。分享给大家供大家参考,具体如下:
有这样一个需求,我有多个网址希望在不同的时候对应不同的 ip,如果一个个配 hosts,这工作显得有些繁琐。写了如下脚本来批量更改。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
<?php define( 'HOST_FILE' , 'C:\Windows\System32\drivers\etc\hosts' ); $hm = new HostManage(HOST_FILE); $env = $argv [1]; if ( empty ( $env )) { $hm ->delAllGroup(); } else { $hm ->addGroup( $env ); } class HostManage { // hosts 文件路径 protected $file ; // hosts 记录数组 protected $hosts = array (); // 配置文件路径,默认为 __FILE__ . '.ini'; protected $configFile ; // 从 ini 配置文件读取出来的配置数组 protected $config = array (); // 配置文件里面需要配置的域名 protected $domain = array (); // 配置文件获取的 ip 数据 protected $ip = array (); public function __construct( $file , $config_file = null) { $this ->file = $file ; if ( $config_file ) { $this ->configFile = $config_file ; } else { $this ->configFile = __FILE__ . '.ini' ; } $this ->initHosts() ->initCfg(); } public function __destruct() { $this ->write(); } public function initHosts() { $lines = file( $this ->file); foreach ( $lines as $line ) { $line = trim( $line ); if ( empty ( $line ) || $line [0] == '#' ) { continue ; } $item = preg_split( '/\s+/' , $line ); $this ->hosts[ $item [1]] = $item [0]; } return $this ; } public function initCfg() { if (! file_exists ( $this ->configFile)) { $this ->config = array (); } else { $this ->config = ( parse_ini_file ( $this ->configFile, true)); } $this ->domain = array_keys ( $this ->config[ 'domain' ]); $this ->ip = $this ->config[ 'ip' ]; return $this ; } /** * 删除配置文件里域的 hosts */ public function delAllGroup() { foreach ( $this ->domain as $domain ) { $this ->delRecord( $domain ); } } /** * 将域配置为指定 ip * @param type $env * @return \HostManage */ public function addGroup( $env ) { if (! isset( $this ->ip[ $env ])) { return $this ; } foreach ( $this ->domain as $domain ) { $this ->addRecord( $domain , $this ->ip[ $env ]); } return $this ; } /** * 添加一条 host 记录 * @param type $ip * @param type $domain */ function addRecord( $domain , $ip ) { $this ->hosts[ $domain ] = $ip ; return $this ; } /** * 删除一条 host 记录 * @param type $domain */ function delRecord( $domain ) { unset( $this ->hosts[ $domain ]); return $this ; } /** * 写入 host 文件 */ public function write() { $str = '' ; foreach ( $this ->hosts as $domain => $ip ) { $str .= $ip . "\t" . $domain . PHP_EOL; } file_put_contents ( $this ->file, $str ); return $this ; } } |
示例配置文件如下:
1
2
3
4
5
6
7
8
9
|
# 域名 [domain] a.example.com=1 # 请无视这个 =1,因为使用了 parse_ini_file 这个函数来解析,如果后面不带值,就获取不到这条记录了 b.example.com=1 c.example.com=1 # ip 记录 [ip] local =127.0.0.1 dev=192.168.1.100 |
使用方法:
1
2
3
|
php hosts.php local # 域名将指向本机 127.0.0.1 php hosts.php dev # 域名将指向开发机 192.168.1.100 php hosts.php # 删除域名的 hosts 配置 |
写完后,发现,这明明就是只需要一次查找替换就能完成的工作嘛
希望本文所述对大家PHP程序设计有所帮助。