分析您的代码以查明瓶颈
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代码的更多信息,这里是关于优化网络图形的信息。