如何优化大型内容网站的网页和数据库

时间:2012-07-02 11:26:11

标签: php mysql

与购物电子商务相关的网站。该网站有大量数据存储在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中,具有更好的配置。

请提供优化网站,查询和数据库的解决方案。

3 个答案:

答案 0 :(得分:2)

  1. 使用缓存系统

  2. 避免在HTML中调整图像大小,如果图像的尺寸最初为1280x900px。 (即<img width="400" height="280" src="myimage.jpg" />

  3. 使用外部JS和CSS文件

  4. 优化您编写代码的方式 - 例如,您可以使用字体样式属性轻松使用CSS制作标题斜体

  5. ,而不是使用<h1><em>Your heading</em></h1>
  6. 使用内容分发网络(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子句也是个好主意。

Here是有关优化 JavaScript 代码和here以优化网络图形的更多信息。

答案 2 :(得分:1)

  • 从静态域中获取图像,样式等。
  • 使用Master&amp;数据库的奴隶
  • 检查表中的索引,架构和数据类型。

我可以向您保证,您的数据库设置,索引等正在受到影响。如果您提供有关数据库表的更多信息,那么我们将帮助您获得更好的答案;)