When I was designing the member download authentication system of Usable Databases, I created 2 classes, Htpasswd and Htgroup, to create, edit and update the Apache authentication files, .htpasswd (username and password pairs) and .htgroup (user groups). I'm listing the class definitions as well as a few usage examples below for your convenience, so you can create and edit .htpasswd files easily.

Class Definitions

PHP Code:
/*
$pairs = array(
    'username' = 'password',
);
*/

// Algorithm: SHA1

class Htpasswd {
    
    private 
$file '';
    
    public function 
__construct($file) {
        if (
file_exists($file)) {
            
$this -> file $file;
        } else {
            return 
false;
        }
    }
    
    private function 
write($pairs = array()) {
        
$str '';
        foreach (
$pairs as $username => $password) {
            
$str .= "$username:{SHA}$password\n";
        }
        
file_put_contents($this -> file$str);
    }
    
    private function 
read() {
        
$pairs = array();
        
$fh fopen($this -> file'r');
        while (!
feof($fh)) {
            
$pair_str str_replace("\n"''fgets($fh));
            
$pair_array explode(':{SHA}'$pair_str);
            if (
count($pair_array) == 2) {
                
$pairs[$pair_array[0]] = $pair_array[1];
            }
        }
        return 
$pairs;
    }
    
    public function 
addUser($username ''$clear_password '') {
        if (!empty(
$username) && !empty($clear_password)) {
            
$all $this -> read();
            if (!
array_key_exists($username$all)) {
                
$all[$username] = $this -> getHash($clear_password);
                
$this -> write($all);
            }
        } else {
            return 
false;
        }
    }
    
    public function 
deleteUser($username '') {
        
$all $this -> read();
        if (
array_key_exists($username$all)) {
            unset(
$all[$username]);
            
$this -> write($all);
        } else {
            return 
false;
        }
    }
    
    public function 
doesUserExist($username '') {
        
$all $this -> read();
        if (
array_key_exists($username$all)) {
            return 
true;
        } else {
            return 
false;
        }
    }
    
    private function 
getHash($clear_password '') {
        if (!empty(
$clear_password)) {
            return 
base64_encode(sha1($clear_passwordtrue));
        } else {
            return 
false;
        }
    }
    

PHP Code:
/*
$groups = array(
    'group' = array('user', 'user'),
);
*/

class Htgroup {
    
    private 
$file '';
    
    public function 
__construct($file) {
        if (
file_exists($file)) {
            
$this -> file $file;
        } else {
            return 
false;
        }
    }
    
    private function 
write($groups = array()) {
        
$str '';
        foreach (
$groups as $group => $users) {
            
$users_str '';
            foreach (
$users as $user) {
                if (!empty(
$users_str)) {
                    
$users_str .= ' ';
                }
                
$users_str .= $user;
            }
            
$str .= "$group$users_str\n";
        }
        
file_put_contents($this -> file$str);
    }
    
    private function 
read() {
        
$groups = array();
        
$groups_str file($this -> fileFILE_IGNORE_NEW_LINES);
        foreach (
$groups_str as $group_str) {
            if (!empty(
$group_str)) {
                
$group_str_array explode(': '$group_str);
                if (
count($group_str_array) == 2) {
                    
$users_array explode(' '$group_str_array[1]);
                    
$groups[$group_str_array[0]] = $users_array;
                }
            }
        }
        return 
$groups;
    }
    
    public function 
addUserToGroup($username ''$group '') {
        if (!empty(
$username) && !empty($group)) {
            
$all $this -> read();
            if (isset(
$all[$group])) {
                if (!
in_array($username$all[$group])) {
                    
$all[$group][] = $username;
                }
            } else {
                
$all[$group][] = $username;
            }
            
$this -> write($all);
        } else {
            return 
false;
        }
    }
    
    public function 
deleteUserFromGroup($username ''$group '') {
        
$all $this -> read();
        if (
array_key_exists($group$all)) {
            
$user_index array_search($username$all[$group]);
            if (
$user_index !== false) {
                unset(
$all[$group][$user_index]);
                if (
count($all[$group]) == 0) {
                    unset(
$all[$group]);
                }
                
$this -> write($all);
            }
        } else {
            return 
false;
        }
    }


Usage Examples

After you have created instances of the classes:

PHP Code:
$htp = new Htpasswd('.htpasswd');
$htg = new Htgroup('.htgroup'); 
You can use Htpasswd to:

PHP Code:
// add username and password to .htpasswd
$htp -> addUser('username1''clearpassword1'); 
PHP Code:
// delete a user
$htp -> deleteUser('username1'); 
PHP Code:
// check if a certain username exists
if ($htp -> doesUserExist('username1')) {
  
// user exists

And use Htgroup to:

PHP Code:
// add a user to a group
$htg -> addUserToGroup('username1''group1'); 
PHP Code:
// delete a user from a group
$htg -> deleteUserFromGroup('username1''group1'); 
Note that as no file lock is implemented, no concurrency support. If your site is a fairly busy one and concurrency is a must for you, use a database for storing authentication details rather than text files such as .htpasswd and .htgroup.