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

本文实例讲述了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网络编程技巧总结》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

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

(0)

相关推荐

  • php修改指定文件后缀的方法

    因项目需求,需要将asp后缀的修改成php,因懒于一个个修改.又觉得php跟Qt一样都是高级语言了,一般高级语言都有提供对获得的内容进行增删改查的函数.经过一番资料查找与代码测试,总结出了PHP修改指定文件后缀的方法,分享给大家. 目标:将当前目录下的asp后缀改成php,而不影响其它"后缀格式的文件",而且只是针对"当前文件夹",对当前文件夹内包含的文件夹的文件不进行修改. 具体功能代码如下: <?php function foreachDir($dirna

  • php中配置文件操作 如config.php文件的读取修改等操作

    复制代码 代码如下: <?php $name="admin";//kkkk $bb='234'; $db=4561321; $kkk="admin"; ?> 函数定义: 配置文件数据值获取:function getconfig($file, $ini, $type="string") 配置文件数据项更新:function updateconfig($file, $ini, $value,$type="string"

  • php.ini修改php上传文件大小限制的方法详解

    打开php.ini,首先找到file_uploads = on ;是否允许通过HTTP上传文件的开关.默认为ON即是开upload_tmp_dir ;文件上传至服务器上存储临时文件的地方,如果没指定就会用系统默认的临时文件夹upload_max_filesize = 8m ;望文生意,即允许上传文件大小的最大值.默认为2Mpost_max_size = 8m ;指通过表单POST给PHP的所能接收的最大值,包括表单里的所有值.默认为8M一般地,设置好上述四个参数后,上传<=8M的文件是不成问题,

  • PHP实现抓取Google IP并自动修改hosts文件

    无聊中居然又找到个php版本的抓取google hosts的文件,试了下还可以用,ping了下ip,延迟也不是很高,网页打开测试了下速度也很快,大家有兴趣的话可以试试. 自动更新hosts文件, 不覆盖已存在的记录,方便使用,不用每次都 复制->打开hosts文件->粘贴. php文件: <?php /** * 免翻墙上google * @author 自娱自乐自逍遥 <wapznw@gmail.com> * Date: 2015/2/6 * Time: 11:42 */ d

  • php Rename 更改文件、文件夹名称

    命令格式为: bool rename ( string oldname, string newname [, resource context] ) 下面演示rename的具体应用: 文件位置如图:目的:1.把cache.txt 更名为rename.txt; 2.将cache2.txt更名为cache3.txt 3.将html目录 更名为 cache 4.将file目录转移到html目录下(可以实现更名) 代码实现(有错误): 复制代码 代码如下: <?php $file = "html/

  • 修改php.ini不生效问题解决方法(上传大于8M的文件)

    摘要:上传大于8M的文件需要修改php的配置才可以生效.但是我在网上找了一堆修改配置的资料,但是自己修改之后就是没有生效. 解决方法: 修改php.ini这个选项,网上有很多的教程,可以随便搜. 1.先用root账号,登录到nobody的账户. 2.然后用whereis php命令查看,php.ini所在的位置,修改这个php.ini的文件就可以了. 3.最后重启apache,就可以生效了. 这里的nobody账户就是apache使用的账户,权限很低. 这里主要注意的问题就是你修改的配置文件必须

  • php更改目录及子目录下所有的文件后缀扩展名的代码

    不是很经常处理文件,所以对遍历目录还不是很熟悉,找了一下资料,自己修改一下. 让大家看看是否需要完善的 代码主要的目的是 批量更改 文件后缀 由于淘宝数据包图片类型的不同 所以要改一下适合的. 复制代码 代码如下: <?php //本文件和要改变的目录下的文件 放在同一文件夹下 define("STA",".gif");//原来的文件格式 define("END",".jpg");//要改变的格式 $dir="

  • 修改apache配置文件去除thinkphp url中的index.php

    例如你的原路径是 http://localhost/test/index.php/index/add那么现在的地址是 http://localhost/test/index/add如何去掉index.php呢? 1.httpd.conf配置文件中加载了mod_rewrite.so模块  //在APACHE里面去配置 复制代码 代码如下: #LoadModule rewrite_module modules/mod_rewrite.so把前面的警号去掉 2.AllowOverride None 讲

  • php读取excel文件示例分享(更新修改excel)

    复制代码 代码如下: //模板存放目录$dir = $DOCUMENT_ROOT.'/backoffice/admin/oemcheck/'; $templateName = '1.xlsx';$outputFileName = '模板.xlsx';$txt='test'; //实例化Excel读取类$PHPReader = new PHPExcel_Reader_Excel2007();if(!$PHPReader->canRead($dir.$templateName)){ $PHPRead

  • php更改目录及子目录下所有的文件后缀的代码

    不是很经常处理文件,所以对遍历目录还不是很熟悉,找了一下资料,自己修改一下. 让大家看看是否需要完善的 代码主要的目的是 批量更改 文件后缀 由于淘宝数据包图片类型的不同 所以要改一下适合的. 复制代码 代码如下: <?php //本文件和要改变的目录下的文件 放在同一文件夹下 define("STA",".gif");//原来的文件格式 define("END",".jpg");//要改变的格式 $dir="

随机推荐