用php编写的服务停止工作

Posted

技术标签:

【中文标题】用php编写的服务停止工作【英文标题】:Service written in php stops working 【发布时间】:2015-11-23 23:16:57 【问题描述】:

我编写了一个充当消息服务器的 php 脚本。消息服务器使用 websockets 在多个移动应用程序之间建立连接,以便在不同应用程序之间提供实时聊天功能。

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 编码员的时代(很久以前),PHP 进程自然是短暂的。 Http 服务器要么延长进程的生命周期,要么为新的 Http 请求启动一个新进程。如果前一个进程没有关闭监听套接字并且资源没有被释放,那么启动一个新进程可能会失败...... PHP 有它的优势,但长时间运行的进程不是其中之一。我会考虑为 websocket 层切换到 Ruby、node.js 或 Python。 【参考方案1】:

首先,不要在 PHP 进程中使用 nohup。如果你想让它活着?使用屏幕。如前所述,在整个代码中添加一些调试语句。

使用 screen 的另一个优点:您可以重新附加到会话 (screen -r) 并查看输出/其他内容。所以,这样做: screen 。然后运行您的程序 - phpwhatever.php。然后关闭您的连接并继续您的方式。什么时候断?登录并执行“screen -r”重新连接,看看为什么它弄脏了裤子。

另外,你为什么要用 PHP 写这个? :) 我的意思是,我不反对 PHP。我经常使用它,我非常喜欢它。但是每种语言都只是工具箱中的一个工具,我当然不会使用钢锯来砍掉整棵树。如果要成为规模较小的服务器,则使用 Node.JS;如果要拥有数十万用户,则使用 C。 PHP 不是合适的语言,恕我直言。

【讨论】:

以上是关于用php编写的服务停止工作的主要内容,如果未能解决你的问题,请参考以下文章

mysql停止工作

通过梨安装邮件后Require_once停止工作[重复]

我运行了 apt-get dist-upgrade 并且我的 php 停止工作

win7打开某个软件提示“clickonce已停止工作”怎么解决

PHP Mail停止工作[重复]

PHP-cgi 随机停止工作而没有错误日志