You CAN list all keys in the keyring, you only have to pass an empty string ''.
<?php
$gpg = new gnupg();
$info = $gpg -> keyinfo('');
print_r($info);
?>
That's it! ;)
(PECL gnupg >= 0.1)
gnupg_keyinfo — Returns an array with information about all keys that matches the given pattern
$identifier
   , string $pattern
   )
identifierThe gnupg identifier, from a call to gnupg_init() or gnupg.
patternThe pattern being checked against the keys.
   Returns an array with information about all keys that matches the given
   pattern or FALSE, if an error has occurred.
  
Example #1 Procedural gnupg_keyinfo() example
<?php
$res = gnupg_init();
$info = gnupg_keyinfo($res, 'test');
print_r($info);
?>
Example #2 OO gnupg_keyinfo() example
<?php
$gpg = new gnupg();
$info = $gpg -> keyinfo("test");
print_r($info);
?>
You CAN list all keys in the keyring, you only have to pass an empty string ''.
<?php
$gpg = new gnupg();
$info = $gpg -> keyinfo('');
print_r($info);
?>
That's it! ;)
Returns an array of information blocks. An information block looks like
<?php
array (
    'disabled' => <bool>,
    'expired' => <bool>,
    'revoked' => <bool>,
    'is_secret' => <bool>,
    'can_sign' => <bool>,
    'can_encrypt' => <bool>,
    'uids' => <array of uid blocks>,
    'subkeys' => <array of subkey blocks>,
)
?>
An uid data block looks like
<?php
array (
    'name' => <string>,
    'comment' => <string>,
    'email' => <string>,
    'uid' => <string>,
    'revoked' => <bool>,
    'invalid' => <bool>,
)
?>
A subkey block looks like
<?php
array (
    'fingerprint' => <string>,
    'keyid' => <string>,
    'timestamp' => <int>,
    'expires' => <int>,
    'is_secret' => <bool>,
    'invalid' => <bool>,
    'can_encrypt' => <bool>,
    'can_sign' => <bool>,
    'disabled' => <bool>,
    'expired' => <bool>,
    'revoked' => <bool>,
),
?>
It appears that listing *all* keys is not possible: 
<?php
$gpg -> keyinfo();   // throws an error
$gpg -> keyinfo('*');  // is matched literally, not treated as a shell wildcard
$gpg -> keyinfo('.*');  // is matched literally, not treated as a regex wildcard
?>
This seems like a glaring omission to me.
