PHP实现更改hosts文件的方法示例


Posted in PHP onAugust 08, 2017

本文实例讲述了PHP实现更改hosts文件的方法。分享给大家供大家参考,具体如下:

有这样一个需求,我有多个网址希望在不同的时候对应不同的 ip,如果一个个配 hosts,这工作显得有些繁琐。写了如下脚本来批量更改。

<?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;
    }
}

示例配置文件如下:

# 域名
[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

使用方法:

php hosts.php local # 域名将指向本机 127.0.0.1
php hosts.php dev # 域名将指向开发机 192.168.1.100
php hosts.php # 删除域名的 hosts 配置

写完后,发现,这明明就是只需要一次查找替换就能完成的工作嘛

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP类中Static方法效率测试代码
Oct 17 PHP
jQuery 源码分析笔记
May 25 PHP
Win7 64位系统下PHP连接Oracle数据库
Aug 20 PHP
PHP中创建图像并绘制文字的例子
Nov 19 PHP
php操作xml入门之xml基本介绍及xml标签元素
Jan 23 PHP
通过php修改xml文档内容的方法
Jan 23 PHP
Laravel模板引擎Blade中section的一些标签的区别介绍
Feb 10 PHP
列举PHP的Yii 2框架的开发优势
Jul 03 PHP
PHP常见错误提示含义解释(实用!值得收藏)
Apr 25 PHP
PHP加密技术的简单实现
Sep 04 PHP
php和C#的yield迭代器实现方法对比分析
Jul 17 PHP
PHP优化之批量操作MySQL实例分析
Apr 23 PHP
PHP编程实现阳历转换为阴历的方法实例
Aug 08 #PHP
PHP数据分析引擎计算余弦相似度算法示例
Aug 08 #PHP
Eclipse PHPEclipse 配置的具体步骤
Aug 08 #PHP
PHP 文件锁与进程锁的使用示例
Aug 07 #PHP
PHP实现找出有序数组中绝对值最小的数算法分析
Aug 07 #PHP
php基于session锁防止阻塞请求的方法分析
Aug 07 #PHP
在Yii2特定页面如何禁用调试工具栏Debug Toolbar详解
Aug 07 #PHP
You might like
利用PHP动态生成VRML网页
2006/10/09 PHP
PHP开发之用微信远程遥控服务器
2018/01/25 PHP
模拟多级复选框效果的jquery代码
2013/08/13 Javascript
JS+CSS实现简易的滑动门效果代码
2015/09/24 Javascript
14 个折磨人的 JavaScript 面试题
2016/08/08 Javascript
深入理解Javascript中的valueOf与toString
2017/01/04 Javascript
JS实现图片预加载之无序预加载功能代码
2017/05/12 Javascript
详解mpvue小程序中怎么引入iconfont字体图标
2018/10/01 Javascript
vue2中引用及使用 better-scroll的方法详解
2018/11/15 Javascript
React生命周期原理与用法踩坑笔记
2020/04/28 Javascript
解决VUEX的mapState/...mapState等取值问题
2020/07/24 Javascript
Python采用raw_input读取输入值的方法
2014/08/18 Python
python使用wxpython开发简单记事本的方法
2015/05/20 Python
python实现识别相似图片小结
2016/02/22 Python
python实现上传下载文件功能
2020/11/19 Python
python的文件操作方法汇总
2017/11/10 Python
Python使用PIL模块生成随机验证码
2017/11/21 Python
Python爬虫框架Scrapy基本用法入门教程
2018/07/26 Python
Django中密码的加密、验密、解密操作
2019/12/19 Python
使用pyhon绘图比较两个手机屏幕大小(实例代码)
2020/01/03 Python
Python特殊属性property原理及使用方法解析
2020/10/09 Python
世界上最大的乐谱选择:Sheet Music Plus
2020/01/18 全球购物
Vuori官网:运动服装的终级表现
2021/01/27 全球购物
自荐信不宜过于夸大
2013/11/06 职场文书
护士毕业生自我鉴定
2014/02/08 职场文书
成绩单家长评语大全
2014/04/16 职场文书
学生期末评语大全
2014/04/30 职场文书
2015年世界艾滋病日活动总结
2015/03/24 职场文书
大学生暑期实践报告
2015/07/13 职场文书
毕业生就业推荐表自我鉴定
2019/06/20 职场文书
教你用Python爬取英雄联盟皮肤原画
2021/06/13 Python
python非标准时间的转换
2021/07/25 Python
mysql事务隔离级别详情
2021/10/24 MySQL
python编程学习使用管道Pipe编写优化代码
2021/11/20 Python
Python Pygame实战之塔防游戏的实现
2022/03/17 Python
Golang原生rpc(rpc服务端源码解读)
2022/04/07 Golang