【发布时间】:2011-09-16 06:14:22
【问题描述】:
我有一个简单的问题。我使用 php 作为服务器部分并有一个 html 输出。我的站点显示有关其他服务器的状态。所以流程是:
- 浏览器用户继续访问 www.example.com/status
- 浏览器联系人 www.example.com/status
- PHP 服务器收到请求并在 www.statusserver.com/status 上请求状态
- PHP 接收数据,将其转换为可读的 HTML 输出并将其发送回客户端
- 浏览器用户可以看到状态。
现在,我在 php 中创建了一个单例类,它只需 8 秒即可访问状态服务器。所以它会在 8 秒内更新状态。如果用户请求更新,服务器会返回本地(在 www.example.com 上)存储的状态。
很好,不是吗?但后来我做了一个简单的测试并启动了 5 个浏览器窗口,看看它是否有效。到了这里,php 服务器为每个请求创建了一个单例类。所以现在有 5 个客户端在状态服务器上请求所有 8 秒的状态。这意味着我每 8 秒对状态服务器进行 5 次调用,而不是 1 次!
难道不能只为 apache 服务器中的所有用户提供一个实例吗?如果有 1000 个用户连接到 www.example.com/status....
,这将解决问题感谢任何提示
============================== 编辑:
我已经在硬盘上使用了缓存:
public function getFile($filename)
{
$diff = (time()-filemtime($filename));
//echo "diff:$diff<br/>";
if($diff>8){
//echo 'grösser 8<br/>';
self::updateFile($filename);
}
if (is_readable($filename)) {
try {
$returnValue = @ImageCreateFromPNG($filename);
if($returnValue == ''){
sleep(1);
return self::getFile($filename);
}else{
return $returnValue;
}
} catch (Exception $e){
sleep(1);
return self::getFile($filename);
}
} else {
sleep(1);
return self::getFile($filename);
}
}
这是单例中的调用。我要求一个文件并将其保存在硬盘上。但所有请求同时调用它并开始请求状态服务器。
我认为唯一的解决方案是一个独立的应用程序,它每 8 秒对文件进行一次更新......所有请求都应该只读取文件并且不再能够更新它。 这个独立的可能是一个 perl 脚本或类似的东西......
【问题讨论】:
-
所以现在你可以在实践中看到singleton it's anti-pattern.
-
尝试使用this等应用服务器
-
有趣的事情 arnaud.. 通常我不确定这是否适用于我的环境(我的供应商环境)。他们对朝这个方向发展的东西有一些限制……但我会看看它。欢呼
标签: php performance singleton