我建立了一个网站,其中我使用了彗星与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);
}
答案 0 :(得分:1)
2000用户/天是一个小数字,除非典型的会话是1小时左右。标准PHP部署不能在服务器推送方案中使用,因为每个请求都使用不同的进程处理。
如果您不想购买专用服务器,可以尝试回退重复轮询(如果,假设可以接受30秒延迟)。但是,如果这确实有助于CPU的使用取决于您的实际导航模式,那么这只是一次尝试。
否则,如果您能负担得起专用硬件,请使用您更熟悉的语言。既然你命名了Node.js,我想你可以用Javascript编写代码,那么学习Node可能不是一件很困难的事。 Python(Twisted),Java,Scala以及您熟练掌握的任何内容都有其他选择。只需选择语言,然后相应地选择框架。
答案 1 :(得分:1)
Comet本身并没有使用大量资源,除非指示它是脚本。如果您在javascript中为Node.js服务器重写看似CPU密集型的脚本,它很可能会以相同的方式执行。
将“推送”系统放在一起通常需要设置一个云实例 - 例如,从Heroku免费设置 - 或者设置一个可以访问shell的专用/ VPS服务器。
而Node.Js是一种较新的,虽然相对不成熟的“推”技术的实现。为了使节点运行,您需要安装node.Js服务器。很少有主机可以安装 - 但可以通过一些简单的shell命令轻松安装。
但从上述情况来看,很少有用户可以同时使用您的应用,因为它已经只为一个用户以90%的CPU运行。如果用户在每个会话中使用该应用程序的时间很短,那么肯定,每天有2000个用户是可行的,这取决于有多少用户同时和何时使用它。也许
答案 2 :(得分:0)
通过在循环中运行服务器逻辑,PHP服务器脚本通常会保持活跃状态。
当我在运行24/7 bcakground脚本时出现了一个类似的问题,当我将time_nanosleep(0, 10000000);
添加到循环结束时,CPU使用率从90%降到1%以下。这不是万无一失的方式,但它对我有用。