I m looking to write a PHP script to act as a mini "daemon" to receive data from a remote socket. The remote server is an Asterisk VoIP server and I ll be connecting to the Asterisk Management Interface (AMI) in an attempt to receive AMI Event notifications. The connection will be through an always-on SSH tunnel (using autossh) which has been stable enough for our use so far.
Here s the plan...
- A PHP script connecting to the local port of the SSH tunnel which forwards to the remote port at the other end using
fsockopen()
or most likelypfsockopen()
- The PHP script will be run from CLI and I guess I should have some sort of shell script on a cron job to check that the PHP script hasn t stopped for any reason
- I ll need this PHP script to be running permanently, and permanently connected to the socket to receive data whenever it s published by the other end
- Memory and CPU is not a problem as we have plenty of resources on our intranet server (criminally under used) but equally I don t want this script spiralling out of control
- The PHP script will hopefully react to occasional data appearing at the other end of the socket and sometimes inserting or updating data in a MySQL database. Obviously I ll open/close the MySQL connection when necessary, not just leave it hanging.
First of all, is this a terrible idea that will never work?
I realise PHP s probably not the best language for a sort of small daemon like this but I ve had success with PHP on CLI before and it s the language I m most comfortable with these days.
Are there any PHP functions that can spring into action when data is published at the other end of the socket?
Or would I just loop using fread()
like this...
while (!feof($socket)) {
$output .= fread($socket, 8192);
}
The loop option seems a bit of a mess so I m just wondering if there s another way that will mean the script stays connected to the socket but basically idle until some data appears.
What cons/pitfalls should I be aware of when thinking about having a permanently running PHP script connected to a socket?
Cheers, B