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 相关文章推荐
玩转图像函数库―常见图形操作
Sep 03 PHP
用PHP+java实现自动新闻滚动窗口
Oct 09 PHP
用PHP和ACCESS写聊天室(九)
Oct 09 PHP
php UTF-8、Unicode和BOM问题
May 18 PHP
PHP通用检测函数集合
Feb 08 PHP
php中eval函数的危害与正确禁用方法
Jun 30 PHP
ThinkPHP里用U方法调用js文件实例
Jun 18 PHP
PHP生成可点击刷新的验证码简单示例
May 13 PHP
thinkPHP数据库增删改查操作方法实例详解
Dec 06 PHP
PHP设计模式之工厂模式详解
Oct 24 PHP
php实现微信公众号企业转账功能
Oct 01 PHP
PHPExcel实现的读取多工作表操作示例
Apr 14 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设计模式 State (状态模式)
2011/06/26 PHP
php CI框架插入一条或多条sql记录示例
2014/07/29 PHP
PHP文件上传判断file是否己选择上传文件的方法
2014/11/10 PHP
php类的自动加载操作实例详解
2016/09/28 PHP
Alliance vs Liquid BO3 第一场2.13
2021/03/10 DOTA
前端开发部分总结[兼容性、DOM操作、跨域等](持续更新)
2010/03/04 Javascript
javascript高级学习笔记整理
2011/08/14 Javascript
jquery 事件冒泡的介绍以及如何阻止事件冒泡
2012/12/25 Javascript
JScript分割字符串示例代码
2013/09/04 Javascript
实例讲解JavaScript中instanceof运算符的用法
2016/06/08 Javascript
jQuery实现右键菜单、遮罩等效果代码
2016/09/27 Javascript
Javascript 创建类并动态添加属性及方法的简单实现
2016/10/20 Javascript
Bootstrap CSS使用方法
2016/12/23 Javascript
JavaScript用JSONP跨域请求数据实例详解
2017/01/06 Javascript
jQuery 实现鼠标画框并对框内数据选中的实例代码
2017/08/29 jQuery
微信小程序实现鼠标拖动效果示例
2017/12/01 Javascript
在vue中使用jointjs的方法
2018/03/24 Javascript
Vue 中 template 有且只能一个 root的原因解析(源码分析)
2020/04/11 Javascript
vue-router懒加载的3种方式汇总
2021/02/28 Vue.js
[01:47]2018年度DOTA2最佳教练-完美盛典
2018/12/16 DOTA
[37:21]完美世界DOTA2联赛PWL S2 Inki vs Magma 第二场 11.22
2020/11/24 DOTA
Python 类与元类的深度挖掘 I【经验】
2016/05/06 Python
在Linux命令行终端中使用python的简单方法(推荐)
2017/01/23 Python
python 多线程中子线程和主线程相互通信方法
2018/11/09 Python
python-itchat 获取微信群用户信息的实例
2019/02/21 Python
Python Pandas 如何shuffle(打乱)数据
2019/07/30 Python
python3获取文件中url内容并下载代码实例
2019/12/27 Python
Python绘图之二维图与三维图详解
2020/08/04 Python
日本最大的眼镜购物网站:Oh My Glasses
2016/11/13 全球购物
土耳其家居建材网站:Koçtaş
2016/11/22 全球购物
广告设计应届生求职信
2014/03/01 职场文书
应聘销售主管的求职信
2014/04/26 职场文书
禁止酒驾标语
2014/06/25 职场文书
2015年政治教研组工作总结
2015/07/22 职场文书
2015教师个人师德工作总结
2015/10/23 职场文书
管理者日常工作必备:22条企业管理流程模板!
2019/07/12 职场文书