1

我建立了一个网站,我在其中使用了彗星和 php。只要我做了一些研究并找到了教程,它似乎很容易实现,对服务器也没有特殊要求,只是它会使用大量资源。现在,我收到来自托管的通知,说我的脚本正在以 90% 的速度消耗 cpu 资源 :( 我关闭了脚本,但我的问题是现在最好使用什么?我阅读了有关 node.js 的信息,但也阅读了他们会需要一些关于服务器的要求吗?在这种情况下有什么好的且易于实施的解决方案吗?

如果假设我在这个彗星脚本中每天有 2000 个用户,那么 VPS 或专用服务器可以吗?

编辑:

/*CLOSE THE SESSION WITH USER DATA*/
session_write_close();

// set time expire unlimited
set_time_limit(0);  

$OldPostID      = isset($_REQUEST['OldPostID']) ? intval($_REQUEST['OldPostID']) : 0;

$result_set_query_1 = $MClass->MyPostings($PageOwner); 

if (mysql_num_rows($result_set_query_1))
{
    $o = 0;
    while ($r = @mysql_fetch_array($result_set_query_1))
    {
        $PID = $r['PID'];
    }
}

$NewPostID = $PID;

while ($NewPostID <= $OldPostID)    
{
    usleep(10000); // sleep 10ms to unload the CPU
    clearstatcache();

    $result_set_query_2 = $MClass->MyPostings($PageOwner);

    if (mysql_num_rows($result_set_query_2))
    {
        $o = 0;
        while ($rs = @mysql_fetch_array($result_set_query_2))
        {
            $PID = $rs['PID'];
        }
    }

    $NewPostID = $PID;
}

// return a json array
$result_set_posts   = $MClass->GetAllMyPostings( $PageOwner, $OldPostID, 0); 

}
4

3 回答 3

1

2000 个用户/天是一个小数字,除非典型的会话是 1 小时左右。标准 PHP 部署不能用于服务器推送场景,因为每个请求都由不同的进程处理。

如果您不想购买专用服务器,可以尝试回退到重复轮询(如果可以接受 30 秒的延迟)。但是,这是否真的有助于 CPU 使用取决于您的实际导航模式,所以这只是一个尝试。

否则,如果您负担得起专用硬件,请使用您更熟悉的语言。既然你命名为 Node.js,我猜你可以用 Javascript 编写代码,那么学习 Node 可能不是那么难的任务。Python (Twisted)、Java、Scala 以及任何你精通的语言都有替代方案。只需选择语言,然后相应地选择框架。

于 2012-12-22T16:46:12.463 回答
1

Comet 本身不会使用大量资源,除非得到指示——它是脚本。如果您要在 JavaScript 中为 Node.js 服务器重写看似 CPU 密集型的脚本,它很可能会以相同的方式执行。

将“推送”系统组合在一起通常涉及设置一个云实例——例如,从 Heroku 中免费——或者设置一个可以访问 shell 的专用/VPS 服务器。

Node.Js 是一种较新的,虽然“推送”技术的实现相对不成熟。为了让节点运行,您需要安装一个 node.Js 服务器。很少有主机可以安装——但可以通过一些简单的 shell 命令轻松安装。

但从上述情况来看,很少有用户能够同时使用你的应用程序,因为它已经以 90% 的 CPU 运行,只有一个用户。如果用户在每个会话中使用该应用程序的时间很短,那么可以肯定,每天 2000 个用户是可行的,具体取决于同时使用的用户数量和时间。也许。

于 2012-12-22T16:52:34.247 回答
0

PHP 服务器脚本通常通过循环运行服务器逻辑来保持活动状态。当我添加到循环末尾时,当我在运行 24/7 的 bcakground 脚本中遇到类似问题时,CPU 使用率从 90% 以上下降到 1% 以下time_nanosleep(0, 10000000);。这不是万无一失的方法,但它对我有用。

于 2012-12-22T17:06:28.393 回答