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 相关文章推荐
vBulletin HACK----关于排版的两个HACK
Oct 09 PHP
php include和require的区别深入解析
Jun 17 PHP
phpstrom使用xdebug配置方法
Dec 17 PHP
PHP中auto_prepend_file与auto_append_file用法实例分析
Sep 22 PHP
PHP中使用xmlreader读取xml数据示例
Dec 29 PHP
Yii视图CGridView实现操作按钮定义地址示例
Jul 14 PHP
php读取出一个文件夹及其子文件夹下所有文件的方法示例
Jun 15 PHP
基于ThinkPHP5.0实现图片上传插件
Sep 25 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
Nov 10 PHP
PHP获取二叉树镜像的方法
Jan 17 PHP
redis+php实现微博(二)发布与关注功能详解
Sep 23 PHP
PHP call_user_func和call_user_func_array函数的简单理解与应用分析
Nov 25 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笔试题
2009/08/04 PHP
php文件打包 下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
2012/06/13 PHP
解析二进制流接口应用实例 pack、unpack、ord 函数使用方法
2013/06/18 PHP
浅析关于PHP位运算的简单权限设计
2013/06/30 PHP
php读取目录及子目录下所有文件名的方法
2014/10/20 PHP
PHP中把对象数组转换成普通数组的方法
2015/07/10 PHP
PDO::inTransaction讲解
2019/01/28 PHP
PHP面向对象程序设计__tostring()和__invoke()用法分析
2019/06/12 PHP
浅析PHP中json_encode与json_decode的区别
2020/07/15 PHP
PHP安装扩展mcrypt以及相关依赖项深入讲解
2021/03/04 PHP
js对象关系图 方便dom操作
2012/03/18 Javascript
Jquery中扩展方法extend使用技巧
2014/08/24 Javascript
JavaScript实现自动弹出窗口并自动关闭窗口的方法
2015/08/06 Javascript
javascript cookie基础应用之记录用户名的方法
2016/09/20 Javascript
老生常谈js数据类型
2017/08/03 Javascript
微信小程序实现的涂鸦功能示例【附源码下载】
2018/01/12 Javascript
elementUI table表格动态合并的示例代码
2019/05/15 Javascript
vue中datepicker的使用教程实例代码详解
2019/07/08 Javascript
react 不用插件实现数字滚动的效果示例
2020/04/14 Javascript
javascript自定义加载loading效果
2020/09/15 Javascript
python迭代器与生成器详解
2016/03/10 Python
python实现下载整个ftp目录的方法
2017/01/17 Python
python表格存取的方法
2018/03/07 Python
Python爬取个人微信朋友信息操作示例
2018/08/03 Python
详解PyTorch手写数字识别(MNIST数据集)
2019/08/16 Python
使用Python给头像戴上圣诞帽的图像操作过程解析
2019/09/20 Python
Python全栈之列表数据类型详解
2019/10/01 Python
Python中 Global和Nonlocal的用法详解
2020/01/20 Python
python反爬虫方法的优缺点分析
2020/11/25 Python
python程序实现BTC(比特币)挖矿的完整代码
2021/01/20 Python
python反扒机制的5种解决方法
2021/02/06 Python
详解通过HTML5 Canvas实现图片的平移及旋转变化的方法
2016/03/22 HTML / CSS
家庭财产分割协议范文
2014/11/24 职场文书
房租涨价通知
2015/04/23 职场文书
李强为自己工作观后感
2015/06/11 职场文书
MySQL的Query Cache图文详解
2021/07/01 MySQL