有许多因素影响你的 Web 应用程序的性能。有些是环境, 有些是你的代码。 在本节中,将列举这些因素并解释如何通过调整这些因素来提高应用程序的性能。
一个好的 PHP 环境是非常重要的。为了得到最大的性能。
对于运行在生产环境中的应用程序,你应该禁用调试模式。 使用名为DEBUG
的常量来定义调试模式是否应被激活。 若启用了调试模式,将需要额外的时间来产生和记录调试信息。
你可以将下面的代码行放在 入口脚本 的开头来禁用调试模式:
'debug' => false,
提示:
debug
的默认值是 false 。所以如果你确信你不在你应用程序代码中别的地方更改其默认值, 你可以简单地删除上述行来禁用调试模式。建议:强烈建议在开发阶段始终开启调试模式(直到正式部署后关闭调试模式),方便及时发现隐患问题和分析、解决问题。
你可以使用各种缓存技术来提高应用程序的性能。例如,如果你的应用程序允许用户以 Markdown 格式输入文字, 你可以考虑缓存解析后的 Markdown 内容,避免每个请求都重复解析相同的 Markdown 文本。
Schema 缓存是一个特殊的缓存功能, 每当你使用ORM时应该要开启这个缓存功能。如你所知, ORM能智能检测数据库对象的集合(例如列名、列类型、约束)而不需要手动地描述它们。
ORM是通过执行额外的 SQL 查询来获得该信息。通过启用 Schema 缓存,检索到的数据库对象的集合将被保存在缓存中并在将来的请求中重用。
例如你在使用 ThinkORM 可以通过以下命令生成数据表字段信息缓存,提升数据库查询的性能,避免多余的查询。
php think optimize:schema
一个复杂的网页往往包括许多 CSS 和 JavaScript 资源文件。 为减少 HTTP 请求的数量和这些资源总下载的大小,应考虑将它们合并成一个单一的文件并压缩。 这可大大提高页面加载时间,且减少了服务器负载。
默认会话数据被存储在文件中。 这是好的对处于发展项目或小型项目。 但是,当涉及要处理大量并发请求时,最好使用其他的会话存储方式,比如 Redis。
return [
'store' => 'redis',
]
表示使用redis
作为session
类型。
执行数据库查询并从数据库中取出数据往往是一个 Web 应用程序主要的性能瓶颈。 尽管使用数据缓存技术可以缓解性能下降,但它并不完全解决这个问题。 当数据库包含大量的数据且缓存数据是无效的, 获取最新的数据可能是最耗性能的假如在没有适当地设计数据库和查询条件。
一般来说,提高数据库查询的性能是创建索引。例如:如果你需要找一个用户表的 “用户名”, 你应该为 “用户名” 创建一个索引。 注意,尽管索引可以使选择查询的速度快得多,但它会减慢插入、更新和删除的查询。
对于复杂的数据库查询,建议你创建数据库视图来保存查询分析和准备的时间。最后,在
SELECT
中使用LIMIT
查询。 这可以避免从数据库中取出大量数据。
User::where('status',1)->limit(10)->select();
因为 Composer 自动加载用于加载大多数第三方类文件, 应考虑对其进行优化,通过执行以下命令:
composer dumpautoload -o
另外,您可以考虑使用 APCu 缓存。 请注意,这两种选择可能适用于您的特定情况,也可能不适合您。
注意:APCu 性能仅次于 array,支持跨进程共享缓存数据,不支持多服务器共享缓存数据,进程重启后失效,一般用于缓存数据量小的项目。
当一个请求涉及到一些资源密集操作,你应该想办法在无需用户等待他们完成脱机模式时来执行这些操作。
有两种方法可以离线数据处理:推和拉。
在拉中,只要有请求涉及到一些复杂的操作,你创建一个任务,并将其保存在永久存储,例如数据库。然后, 使用一个单独的进程(如 cron 作业)拉任务,并进行处理。 这种方法很容易实现,但它也有一些缺点。 例如,该任务过程中需要定期地从任务存储拉。如果拉频率太低,这些任务可以延迟处理; 但是如果频率过高,将引起的高开销。
在推中,你可以使用消息队列(如 RabbitMQ ,ActiveMQ , Amazon SQS 等)来管理任务。 每当一个新的任务放在队列中,它会启动或者通知任务处理过程去触发任务处理。
你应该配置你的代码来找出性能缺陷,并相应地采取适当措施。 以下分析工具可能是有用的: