Your second implementation
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
Should work if you have the extension installed and properly configured. I would look into that if I were you.
You can check your PHP’s configuration using
phpinfo() to check if the sodium is enabled.
And, If you haven’t installed, install using:
sudo pecl install -f libsodium