If you only plan to send bulk messages to your audiences--e.g. promotions or engagement campaigns--you can compose and send them entirely in the Firebase admin console and without a custom server.
However, if you plan to send any sort of transactional messages, such as notifying a user when a friend signs in or when a new message arrives, these require a server side component to manage your admin API keys and credentials and actually send the request to FCM's APIs--documented
here. Our currently supported server SDKs are Node, Java, Python, Go, and C#--note that PHP isn't in that list although you can get things running with PHP through our HTTP REST endpoints if needed.
One alternative to maintaining your own server is to
send messages using Cloud Functions triggers. This means you just need to write and deploy a minimal Node script. I'd recommend evaluating this when working small development teams and third party developers, since you aren't tied to server maintenance with this approach (Google manages the server and scale).