PHP实现更改hosts文件的方法示例
author:一佰互联 2019-04-26   click:201

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

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

<?phpdefine("HOST_FILE", "C:WindowsSystem32driversetchosts");$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 . "	" . $domain . PHP_EOL;        }        file_put_contents($this->file, $str);        return $this;    }}

示例配置文件如下:

# 域名[domain]a.example.com=1 # 请无视这个 =1,因为使用了 parse_ini_file 这个函数来解析,如果后面不带值,就获取不到这条记录了b.example.com=1c.example.com=1# ip 记录[ip]local=127.0.0.1dev=192.168.1.100

使用方法:

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

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

更多关于PHP相关内容感兴趣的读者可查看本站专题:《php文件操作总结》、《PHP网络编程技巧总结》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

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