6

我有一个PHP使用WebSocketshttp://code.google.com/p/phpwebsocket/)实现的聊天应用程序,并且在我的本地主机上,当我测试它时,我必须通过命令运行 WebSockets 服务器,该命令"php server.php"在本地主机上启动服务器并且文件一直运行,直到我在我的 Ubuntu 终端上按“Ctrl + c”。我的意思是它继续运行 while 循环,这是很正常的,因为服务器应该准备好监听请求。

现在我怀疑我已经在共享主机上托管了这个应用程序,它没有给我SSH访问权限,我的意思是我无法获得像我曾经运行我的命令的界面这样的终端,所以我将如何运行该server.php脚本来启动我的服务器现在?

是的,我提到的一件事我只需要运行一次脚本,然后脚本将继续运行,并且托管服务提供商允许设置cron jobs

请帮助,提前谢谢。

4

3 回答 3

8

无法通过 SSH 访问您的共享主机非常不稳定。那就是说...

您可以使用exec触发脚本在命令行上运行某些内容。例如,如果您有一个从http://mysite.com/server/start之类的 URL 调用的控制器操作,则可以嵌入以下行:

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

当然,这个命令在命令完成之前不会返回,所以你永远不会得到这个脚本的响应(除非它失败)。所以我会使用popen,它将分叉进程并立即返回,允许您的控制器返回响应。

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

在某些时候,您可能想要停止此服务器。您可以使用passthruposix_kill使用一点 unix CLI 魔术来完成此操作,也许在您从http://mysite.com/server/stop 之类的 URL 调用的另一个控制器操作中,您可以嵌入:

$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);
于 2013-07-17T16:39:56.647 回答
0

实际上有很多方法可以让守护进程在没有 shell 访问权限的情况下运行,但是托管公司会阻止 shell 访问,因为他们不希望你运行守护进程!

您必须在外壳访问的服务器上进行。我的意思是,您的应用程序必须有 VPS,而共享主机对您没有用处。

于 2014-05-08T17:06:24.823 回答
0

使用 shell_exec 从可以触发的脚本运行命令。代码应该是这样的:

shell_exec("php -q server.php");
于 2019-07-25T20:18:08.983 回答