【问题标题】:php comet: eating the CPU resourcesphp彗星:吃CPU资源
【发布时间】:2012-12-22 16:35:29
【问题描述】:

我建立了一个网站,我在其中使用了comet 和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); 

}

【问题讨论】:

    标签: php comet


    【解决方案1】:

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

    将“推送”系统组合在一起通常需要设置一个云实例(例如,无需 Heroku)或设置一个可以访问 shell 的专用/VPS 服务器。

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

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

    【讨论】:

    • 谢谢。我刚刚用我用于彗星的代码更新了问题。我使用 set_time_limit 无限。我不确定这段代码是否有问题。谢谢
    • @99Points 这很好-但它仍然没有说太多! CPU去哪儿了?是MYSQL查询吗?查询是搜索索引还是探索性的?具有 10 行或 1000 万行的 SQL 数据库?不暴露胆量就很难说。但是,尝试下面的 nanosleep 想法,如果是因为 SQL,请尝试限制 sql 结果。
    • 我只提到 SQL 作为一种可能性,因为它是脚本速度变慢的最大原因,除了 IO 之外——这也与 SQL 的使用直接相关。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-21
        • 2010-10-10
        • 1970-01-01
        • 2011-03-27
        • 1970-01-01
        相关资源
        最近更新 更多