我已经编写了一个充当消息服务器的php脚本。消息服务器使用websocket在多个移动应用程序之间建立连接,以便在不同的应用程序之间提供实时聊天功能。
我的messageserver.php脚本的主要布局如下:
#!/usr/bin/env php
<?php
class chatServer extends WebSocketServer {
var $usersCache = array();
var $userConnectionIds = array();
var $dbconnect;
public function setDatabaseConnection($connect) {
$this->dbconnect = $connect;
}
private function addMessage($convId, $from, $to, $message, $read) {
..
}
protected function process ($user, $message) {
$parsedMessage = json_decode($message, true);
switch($parsedMessage["type"]) {
case "handshake" :
$this->usersCache[$parsedMessage["userId"]] = $user;
$this->userConnectionIds[$user->id] = $parsedMessage["userId"];
break;
case "chatMessage" :
$receivingUser = $this->usersCache[$parsedMessage["to"]];
if ($receivingUser != null) {
$returnValue = $this->send($receivingUser, json_encode($parsedMessage));
}
}
}
protected function connected ($user) {
}
protected function closed ($user) {
$userId = $this->userConnectionIds[$user->id];
unset($this->userConnectionIds[$user->id]);
unset($this->usersCache[$userId]);
var_dump($this->usersCache);
}
}
$chatServer = new chatServer("0.0.0.0","36092");
global $connect;
try {
$chatServer->setDatabaseConnection($connect);
$chatServer->run();
}
catch (Exception $e) {
$echo->stdout($e->getMessage());
}
为了让messageserver.php在我的服务器上运行,我使用
nohup php messageServer.php > php.log 2>&1 &
这应该允许服务继续运行,即使我关闭了与服务器的ssh连接,情况确实如此。现在我的问题是,这个设置按预期工作,没有任何问题。然而,过了一段时间,php脚本就停止运行了,根本没有任何消息。php.log文件不包含任何类型的错误或终止消息。有人知道这里会发生什么吗?有什么方法可以追踪服务停止运行的原因吗?谢谢
首先,不要在PHP进程中使用nohup。如果你想让它活着?使用屏幕。如前所述,在整个代码中添加一些调试语句。
使用screen的另一个优点是:您可以重新附加到会话(screen-r)并查看输出/任何内容。所以,这样做:屏幕。然后运行你的程序php-whatever.php。然后关闭你的连接,继续你的路。什么时候坏了?登录并执行"screen-r"重新连接,看看它弄脏裤子的原因。
另外,你为什么要用PHP写这个??:)我的意思是,我并不反对PHP。我经常使用它,我非常喜欢它。但每种语言都只是工具箱里的一个工具,我当然不会用锯子锯倒整棵树。如果Node.JS将是一个规模较小的服务器,请使用它;如果它将拥有数十万用户,请使用C。PHP不是一种合适的语言,IMHO。