0

与购物电子商务相关的网站。该网站有大量数据要存储在数据库中。到目前为止,db 中的 products 表有近 18K 条记录,有 20 个字段。我创建了如下的数据库结构

 - 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 中。

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

4

3 回答 3

2
  1. 使用缓存系统

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

  3. 使用外部 JS 和 CSS 文件

  4. 优化编写代码的方式 - 例如<h1><em>Your heading</em></h1>,您可以轻松地使用 CSS 使用 font-style 属性使标题变为斜体,而不是使用

  5. 使用内容交付网络 ( CDN )

于 2012-07-02T11:49:02.643 回答
2

分析您的代码以查明瓶颈

Hoare 的格言指出,过早的优化是万恶之源,在试图使您的网站更快时要牢记这一点。在更改代码之前,您需要确定导致代码变慢的原因。当问题可能与数据库或网络相关时,您可以阅读本指南以及许多其他关于优化 PHP 的指南。通过分析您的 PHP 代码,您可以尝试查明瓶颈。

升级您的 PHP 版本

多年来,维护 PHP 引擎的开发人员团队取得了许多显着的性能改进。如果您的 Web 服务器仍在运行旧版本,例如 PHP 3 或 PHP 4,您可能需要在尝试优化代码之前研究升级。

使用缓存

使用缓存模块(如 Memcache)或支持缓存的模板系统(如 Smarty)可以通过缓存数据库结果和渲染页面来帮助提高网站的性能。

使用输出缓冲

PHP 使用内存缓冲区来存储脚本尝试打印的所有数据。这个缓冲区会使您的页面看起来很慢,因为您的用户必须等待缓冲区填满才能向他们发送任何数据。幸运的是,您可以进行一些更改,强制 PHP 更快、更频繁地刷新输出缓冲区,从而让您的用户感觉您的网站更快。

避免编写幼稚的 setter 和 getter

在 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()andgetName()仅分别存储和返回 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's 时。而且,索引也非常重要,但前提是您已正确创建它。LIMIT如果您不需要立即显示结果,在查询中使用 of子句也是一个好主意。

这里是关于优化JavaScript代码的更多信息,这里是关于优化网络图形的信息。

于 2012-07-02T12:15:35.297 回答
1
  • 从静态域中获取图像、样式等。
  • 为您的数据库使用 Master & Slave
  • 检查表中的索引、模式和数据类型。

我可以向您保证,您的数据库设置、索引等正在遭受痛苦。如果您提供有关数据库表的更多信息,那么我们将为您提供更好的答案;)

于 2012-07-02T11:57:24.603 回答