starting a websockets server in php on shared host

2019-04-08 23:50发布

I have a chat application implemented in PHP using WebSockets (http://code.google.com/p/phpwebsocket/), and on my localhost when i test it i have to run the WebSockets server through a command "php server.php", which starts the server on localhost and the file keeps running till i press "Ctrl + c" on my Ubuntu terminal. I mean it keeps on running the while loop, which is quite normal bcoz the server should be up to listen to the requests.

Now my doubt is that i have hosted this application on a shared hosting, which does not give me SSH access, i mean i cannot get a terminal like interface where i used to run my command, so HOW will i run that server.php script to start my server now?

And yes one thing that i mentioned i just need to run the script once, then the script will keep on running, and also the hosting provider allows to set up cron jobs.

Please help, thanks in advance.

2条回答
兄弟一词,经得起流年.
2楼-- · 2019-04-08 23:59

Actually there's lots of ways to get a daemon running without shell access, but the hosting companies will have blocked shell access because they don't want you running daemons !

You have to make it on shell accessed server. I mean, you must have VPS for your application, and shared hosting not useful for you.

查看更多
SAY GOODBYE
3楼-- · 2019-04-09 00:11

Not having SSH access to your shared hosting is pretty flaky. That said...

You can use exec to run something on the command line from a triggered script. For instance, if you have a controller action that you call from a URL like http://mysite.com/server/start, you could embed the line:

$lastLine = exec("php server.php");

Of course, this command will not return until the command finishes, so you will never get a response from this script (unless it fails). So I would use popen, which will fork the process and return right away, allowing your controller to return a response.

$handle = popen("php server.php", "r");

At some point, you are probably going to want to stop this server. You can use passthru and posix_kill with a little unix CLI magic to get this done, maybe in another controller action that you call from a URL like http://mysite.com/server/stop, you could embed:

$output = passthru('ps ax | grep server\.php');
$ar = preg_split('/ /', $output);
if (in_array('/usr/bin/php', $ar)) {
    $pid = (int) $ar[0];
    posix_kill($pid, SIGKILL);
查看更多
登录 后发表回答