我最近对 WebSocket 技术产生了兴趣。我用 PHP 自己搭建了一个服务器,并在 Windows 上使用 PHP CLI 运行它。这对于开发来说还不错,但现在我需要考虑部署。
我买了一台运行 Ubuntu Server 10.10 的小型 VPS。我对 Linux 有基本的了解,所以我设置了 SSH 客户端,安装了 PHP-CLI,并摆弄了一下以确保它能正常工作,结果确实如此。
现在我可以使用以下命令运行我的服务器
php server.php
但我不认为这是个好办法。有几个问题:
- 一旦我关闭 SSH 客户端,控制台输出会发生什么情况?
- 如果服务器崩溃了怎么办?
- 当服务器在主线程中以这种方式运行时,我无法在 VPS 上执行任何其他操作
关于控制台输出;有没有办法将 STDOUT 或其他内容重定向到文件,这样我仍然可以在 Windows 上看到控制台输出,但在我的 VPS 上它会被记录下来?至于服务器崩溃,有什么好方法可以在服务器启动时自动重新启动某些进程?我想我可以将其作为守护进程或服务或类似的东西运行,这样它就不会挂起主线程?
那么,通常使用哪些方法来解决这些问题呢?有没有什么地方可以让我阅读更多这方面的信息?我想在这个过程中学到一点东西!
答案1
要将输出和任何错误重定向到some_other_file:
php server.php 2>&1 some_other_file
这>&将流重定向到另一个文件描述符(在 BASH shell 中):
- 0 是标准输入
- 1 是标准输出
- 2 是 stderr
或者,2>&1将 2 重定向到 1。然后实时观察输出:
tail -f some_other_file
从启动时开始:你可以从/etc/rc.local或者,更高级的解决方案可能是在/etc/init.d/目录。请参阅/etc/init.d/自述文件如何做到这一点。
如果您将 PHP 文件 server.php 设为可执行文件,则可以在文件顶部(又名文件 magic/shebang/hashbang)添加一行,以如下方式调用它:server.php
而不是php server.php
。如果出于某种原因您想这样做,您甚至可以删除 php 扩展名。像这样:
#!/usr/bin/php
<?php
// PHP code here
暴发户可能是确保服务保持运行的方法。此方法不涉及 /etc/rc*。Upstart 有五个包,全部默认安装:
- Upstart init 守护进程和 initctl 实用程序
- upstart-logd 为 logd 服务提供 logd 守护进程和作业定义文件
- upstart-compat-sysv 为 rc 任务以及提供与 SysVinit 兼容性的重启、运行级别、关闭和 telinit 工具提供作业定义文件
- startup-tasks 提供系统启动任务的作业定义文件
- system-services 为 tty 服务提供作业定义文件
学习过程非常有趣,非常值得。Upstart 有一个网站:http://upstart.ubuntu.com/