我在PHP
中使用WebSockets
(http://code.google.com/p/phpwebsocket/)实现了聊天应用程序,在我测试它的本地主机上,我必须通过命令{{1}运行WebSockets服务器在localhost上启动服务器,文件一直运行,直到我在Ubuntu终端上按“Ctrl + c”。我的意思是它继续运行while循环,这是非常正常的bcoz服务器应该听取请求。
现在我的疑问是我已经在共享主机上托管了这个应用程序,它没有给我"php server.php"
访问权限,我的意思是我不能得到一个终端,就像我曾经运行我的命令的接口,所以HOW将如何我运行SSH
脚本现在启动我的服务器?
是的,我提到的一件事我只需要运行一次脚本,然后脚本将继续运行,托管服务提供商也可以设置server.php
。
请提前帮助,谢谢。
答案 0 :(得分:8)
没有SSH访问您的共享主机是非常不稳定的。那说......
您可以使用exec
在触发脚本的命令行上运行某些内容。例如,如果您有来自http://mysite.com/server/start之类的网址的控制器操作,则可以嵌入该行:
$lastLine = exec("php server.php");
当然,在命令完成之前,此命令不会返回,因此您永远不会从此脚本获得响应(除非它失败)。所以我会使用popen
,它会分叉进程并立即返回,让你的控制器返回一个响应。
$handle = popen("php server.php", "r");
在某些时候,您可能想要停止此服务器。您可以使用passthru
和posix_kill
使用一点unix CLI魔法来完成此操作,也许可以使用您从http://mysite.com/server/stop这样的网址调用的另一个控制器操作,您可以嵌入:
$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);
答案 1 :(得分:0)
实际上有很多方法可以让守护进程在没有shell访问的情况下运行,但托管公司会阻止shell访问,因为他们不希望你运行守护进程!
你必须在shell访问的服务器上进行。我的意思是,你必须为你的应用程序提供VPS,共享主机对你没用。
答案 2 :(得分:0)
使用shell_exec从可以触发的脚本中运行命令。代码应该像这样:
shell_exec("php -q server.php");