与购物电子商务相关的网站。该网站有大量数据存储在DB中。到目前为止,db中的产品表具有近18K的记录和20个字段。我已经创建了db结构,如下所示
- brands
- products
- shopslist
- shopping_details
该网站拥有100多页与产品和品牌相关的所有内容。
eg.pages are
www.example.com/nokia-mobile-phones.php , www.example.com/samsung-mobile-phones.php
www.example.com/samsung-galaxy-s3-price.php,www.example.com/android-mobile-phones.php
我已经编写了查询以动态获取与页面对应的产品详细信息。这使我的网站在从db ans显示中获取数据时变得更慢。
目前,网站每天访问量接近14k到15k。网站突然变得很慢,每天停止响应超过10小时。托管方面的技术人员表示,问题是由于一天内请求数量增加而您的数据库占用了75%的内存,优化了您的站点和数据库以获得更好的结果。该网站托管在VPS中,具有更好的配置。
请提供优化网站,查询和数据库的解决方案。
答案 0 :(得分:2)
使用缓存系统
避免在HTML中调整图像大小,如果图像的尺寸最初为1280x900px。 (即<img width="400" height="280" src="myimage.jpg" />
)
使用外部JS和CSS文件
优化您编写代码的方式 - 例如,您可以使用字体样式属性轻松使用CSS制作标题斜体
<h1><em>Your heading</em></h1>
。
使用内容分发网络(CDN)
答案 1 :(得分:2)
描述您的代码以查明瓶颈
Hoare的格言指出,过早优化是所有邪恶的根源,在尝试提高网站速度时要记住这一点很重要。在更改代码之前,您需要确定导致代码变慢的原因。当问题可能与数据库相关或与网络相关时,您可以阅读本指南以及许多其他有关优化PHP的内容。通过分析PHP代码,您可以尝试查明瓶颈。
升级您的PHP版本
维护PHP引擎的开发团队多年来在性能方面取得了显着进步。如果您的Web服务器仍在运行旧版本(例如PHP 3或PHP 4),则可能需要在尝试优化代码之前调查升级。
使用缓存
使用缓存模块(如Memcache)或支持缓存的模板系统(如Smarty)可以通过缓存数据库结果和呈现的页面来帮助提高网站的性能。
使用输出缓冲
PHP使用内存缓冲区来存储脚本尝试打印的所有数据。此缓冲区可能会使您的页面看起来很慢,因为您的用户必须等待缓冲区填充它才能向其发送任何数据。幸运的是,您可以进行一些更改,这将使PHP更快地刷新输出缓冲区,并且更经常地使您的网站对用户感觉更快。
避免写天真的设定者和吸气剂
在PHP中编写类时,您可以通过直接使用对象属性来节省时间并加快脚本速度,而不是编写天真的setter和getter。在以下示例中,dog类使用setName()
和getName()
方法来访问name属性。
class dog {
public $name = '';
public function setName($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
}
请注意setName()
和getName()
分别只存储和返回name属性。
$rover = new dog();
$rover->setName('rover');
echo $rover->getName();
直接设置和调用name属性可以快100%,并缩短开发时间。
$rover = new dog();
$rover->name = 'rover';
echo $rover->name;
不要无故复制变量
有时,PHP新手会尝试通过将预定义变量复制到名称较短的变量来使其代码“更清晰”,然后再使用它们。实际上导致的是内存消耗增加一倍(变量变化时),因此脚本速度慢。在以下示例中,如果用户在textarea字段中插入了512KB的字符。这种实现将导致使用近1MB的内存。
$description = strip_tags($_POST['description']);
echo $description;
没有理由复制上面的变量。您可以简单地内联执行此操作并避免额外的内存消耗:
echo strip_tags($_POST['description']);
避免在循环中进行SQL查询
常见的错误是在循环中放置SQL查询。这导致多次往返数据库,并且脚本显着减慢。在下面的示例中,您可以更改循环以构建单个SQL查询并一次插入所有用户。
foreach ($userList as $user) {
$query = 'INSERT INTO users (first_name,last_name) VALUES("' . $user['first_name'] . '", "' . $user['last_name'] . '")';
mysql_query($query);
}
产地:
INSERT INTO users (first_name,last_name) VALUES("John", "Doe")
您可以将数据组合到单个数据库查询中,而不是使用循环。
$userData = array();
foreach ($userList as $user) {
$userData[] = '("' . $user['first_name'] . '", "' . $user['last_name'] . '")';
}
$query = 'INSERT INTO users (first_name,last_name) VALUES' . implode(',', $userData);
mysql_query($query);
产地:
INSERT INTO users (first_name,last_name) VALUES("John", "Doe"),("Jane", "Doe")...
处理SQL
优化时的一个好方法是选择您需要的字段,而不是所有字段。这几乎总是会对性能产生巨大影响,尤其是当字段为BLOB
时。并且,索引也非常重要,但前提是您已正确创建它。如果您不需要一次显示结果,那么在查询中使用LIMIT
子句也是个好主意。
答案 2 :(得分:1)
我可以向您保证,您的数据库设置,索引等正在受到影响。如果您提供有关数据库表的更多信息,那么我们将帮助您获得更好的答案;)