在高负载站点中使用 PHP 的策略

2024-06-04

在你回答这个问题之前,我从未开发过任何足够流行的东西来达到高服务器负载。把我当作(叹气)一个刚刚登陆地球的外星人,尽管我了解 PHP 和一些优化技术。


我正在开发一个工具PHP如果效果好的话,可以吸引相当多的用户。然而,虽然我完全有能力开发该程序,但在制作可以处理巨大流量的东西时,我几乎一无所知。所以这里有几个关于它的问题(也可以随意将这个问题变成资源线程)。

数据库

目前我计划在 PHP5 中使用 MySQLi 功能。但是,我应该如何设置与用户和内容相关的数据库?我真的吗need多个数据库?目前,所有内容都混杂在一个数据库中 - 尽管我一直在考虑将用户数据传播到一个数据库,将实际内容传播到另一个数据库,最后将核心网站内容(模板母版等)传播到另一个数据库。我的理由是,将查询发送到不同的数据库将减轻它们的负载,因为一个数据库 = 3 个负载源。如果它们都在同一服务器上,这仍然有效吗?

Caching

我有一个模板系统,用于构建页面和交换变量。主模板存储在数据库中,每次调用模板时,都会调用其缓存副本(html 文档)。目前,我在这些模板中有两种类型的变量 - 静态变量和动态变量。静态变量通常是页面名称、站点名称等不经常更改的内容;动态变量是在每次页面加载时发生变化的东西。

我对此的问题是:

假设我对不同的文章有评论。哪个是更好的解决方案:每次加载页面时存储简单的评论模板并呈现评论(来自数据库调用)或将评论页面的缓存副本存储为 html 页面 - 每次添加/编辑/删除评论时该页面被重新缓存。

Finally

有谁有关于在 PHP 上运行高负载网站的任何提示/指示吗?我非常确定这是一种可行的语言 - Facebook 和 Yahoo!给予它极大的优先权 - 但有什么我应该注意的经历吗?


没有两个网站是相同的。你真的需要一个像这样的工具jmeter http://jakarta.apache.org/jmeter/并进行基准测试,看看您的问题点在哪里。您可以花费大量时间猜测和改进,但只有在衡量和比较您的更改之前,您才会看到真正的结果。

例如,多年来,MySQL 查询缓存是我们所有性能问题的解决方案。如果您的网站速度很慢,MySQL 专家建议打开查询缓存。事实证明,如果写入负载很高,缓存实际上会严重损坏。如果你在没有测试的情况下打开它,你永远不会知道。

并且不要忘记,你永远不会完成扩展。处理 10req/s 的站点需要进行更改才能支持 1000req/s。如果您足够幸运,需要支持 10,000req/s,您的架构也可能看起来完全不同。

数据库

  • 不要使用 MySQLi --PDO http://ca.php.net/pdo是“现代”OO 数据库访问层。要使用的最重要的功能是查询中的占位符。它足够智能,可以为您使用服务器端准备和其他优化。
  • 此时您可能不想破坏数据库。如果您确实发现某个数据库无法缩减,可以采用多种技术进行扩展,具体取决于您的应用程序。如果读取次数多于写入次数,则复制到其他服务器通常效果很好。分片是一种将数据分割到多台机器上的技术。

Caching

  • 您可能不想在数据库中缓存。数据库通常是您的瓶颈,因此向其中添加更多 IO 通常是一件坏事。有几个 PHP 缓存可以完成类似的事情,例如APC http://ca.php.net/apc和禅德。
  • 通过打开和关闭缓存来衡量您的系统。我敢打赌你的缓存比直接提供页面要重。
  • 如果从数据库构建评论和文章数据需要很长时间,请集成memcache http://www.danga.com/memcached/进入您的系统。您可以缓存查询结果并将其存储在 memcached 实例中。重要的是要记住,从内存缓存检索数据必须比从数据库组装数据更快,才能看到任何好处。
  • 如果您的文章不是动态的,或者生成后有简单的动态更改,请考虑将 html 或 php 写入磁盘。您可以有一个在磁盘上查找文章的 index.php 页面,如果存在,则将其流式传输到客户端。如果不是,它会生成文章,将其写入磁盘并将其发送到客户端。从磁盘删除文件会导致页面被重写。如果将评论添加到文章中,请删除缓存的副本 - 它将重新生成。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在高负载站点中使用 PHP 的策略 的相关文章

  • 在方法之间重用PreparedStatement?

    We all know https stackoverflow com questions 2467125 reusing a preparedstatement multiple times that https stackoverflo
  • PHP 有效读取 csv 文件

    有几种使用 PHP 读取 CSV 文件的方法 我以前用过explode函数将每一行放入一个数组中 然后explode逗号并使用trim删除数据周围的任何引号 本来就很乱 PHP 5 现在有fgetcsv和 str getcsv 我猜这是这些
  • 计算两个数字之间的差异

    我想计算两个给定数字之间的差异 例如 1 5 或 24 35 我必须将数组中的数字分开并写出它们之间的差异 如下所示 1 2 3 4 5 或 24 25 26 27 28 29 30 31 32 33 34 35 是否有任何 php 函数可
  • 如何通过键查找最大和最小日期

    我有一个数组 a array 2010 05 03 gt 100 2010 05 04 gt 400 2008 05 01 gt 800 2011 01 01 gt 800 我如何找到最大值和最小值key date 例如 max gt 20
  • 如何在Web服务中传递URL

    我想将此 URL 作为网址中的值传递http localhost h2orn php verify php email emails hash hash但是 我只能在 符号之前传递 我想传递所有 URL 我正在使用java网络服务 代码在这
  • symfony 2 形式的函数 getName 做什么

    这是我的表格类 class CommentType extends AbstractType public function buildForm FormBuilder builder array options builder gt ad
  • FPDF - 内嵌粗体文本

    我正在尝试从 PHP 创建 PDF 出于法律原因 我们需要将免责声明的一部分设为粗体 并且需要概述免责声明 我当前的代码使用 if isset POST optout POST optout yes pdf gt Ln 5 pdf gt S
  • 如何实现具有LinkedHashMap类似功能的ConcurrentHashMap?

    我用过LinkedHashMap with accessOrdertrue 并同时允许最多 500 个条目作为数据的 LRU 缓存 但由于可扩展性问题 我想转向一些线程安全的替代方案 ConcurrentHashMap在这方面似乎不错 但缺
  • WHERE 子句或 ON 子句中的 INNER JOIN 条件?

    我今天输错了一个查询 但它仍然有效并给出了预期的结果 我的意思是运行这个查询 SELECT e id FROM employees e JOIN users u ON u email e email WHERE u id 139840 但我
  • jQuery和PHP中如何知道返回数据是Json还是String?

    我想在客户端 jQuery 检查 PHP 函数返回的数据是否是 Json 对象或 String 来分配不同的函数 如果 json 的格式不正确 jQuery 的 parseJson 将生成异常 您可以将调用包装在 try catch 块中
  • 如何在 Laravel 5 中处理嵌套的 JSON 对象请求?

    我们在 Laravel 5 和 AngularJs Ionic 中运行此 Web 服务来处理 Web 当我们将请求从 Web 客户端 发送到 Web 服务 后端 时 我们传递了嵌套的 JSON 对象 我们在读取服务器端父对象下的所有子对象时
  • 需要 mysqli_fetch_all 的替代方案

    我有一个 php mysqli 代码 可以找到一个我的本地服务器 但是在我的服务器上使用它时 我得到了一个 Fatal error Call to undefined function mysqli fetch all in home3 t
  • cURL '格式错误的网址'

    This url 在浏览器中工作得很好 但 cURL 返回错误 3 格式错误的 url 关于解决方法有什么想法吗 EDIT 卷曲代码 function get web page url options array CURLOPT RETUR
  • 疯狂的 crond 行为。不断使 bash 进程失效

    我有一个看起来像这样的 crontab SHELL bin bash PATH sbin bin usr sbin usr bin MAILTO root HOME 0 59 var www html private fivemin zda
  • 从多个选择列表中插入数据到mysql数据库(html形式)

    我制作了一个表格 其中有商店的 ID
  • php向多个收件人发送邮件

    我可以通过在邮件程序中定义 id 来将电子邮件发送到一个电子邮件 id 但是当用户在表单中键入 消息和电子邮件 id 时 我无法理解如何发送到多个收件人 例如 我正在显示一个带有两个文本区域的表单 一个用于电子邮件 ID 一个用于自定义消息
  • sqlsrv_num_rows 不返回任何值

    我正在尝试获取查询中返回的行数 while 循环遍历结果有效 但由于某种原因 sqlsrv num rows 不返回任何值 result SELECT from dtable WHERE id2 apple query sqlsrv que
  • 如何显示不同页眉的页面? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在为我的学校项目开发网站 但我遇到了一个问题 我在每个页面上显示一个标题 我的标题之一包含登录表单 另一标题包含用户名 搜索栏等 问题是
  • 哪个 PHP 5 版本最常用?

    当我开发将在不同配置的客户端 Web 服务 通常使用共享托管 上使用的应用程序时 我应该假设大多数 Web 服务器都具有哪个 PHP 5 版本 例如 5 2 x 5 3 x 等 在所有使用 PHP 版本 5 的网站中 有 84 9 使用版本
  • Java 可变 BigInteger 类

    我正在使用 BigIntegers 进行计算 该计算使用一个调用 multiply 大约 1000 亿次的循环 并且从 BigInteger 创建新对象使其非常慢 我希望有人编写或找到了 MutableBigInteger 类 我在 jav

随机推荐

  • 将 Rails 应用程序从 3.2.6 升级到 3.2.8

    我有一个使用 Rails 创建的 Rails 应用程序3 2 6 现在3 2 8已经发布了 这就是我更新应用程序所需要做的一切吗 Edit Gemfile 改变线路gem rails 3 2 6 to gem rails 3 2 8 Run
  • 当对话框打开时如何处理屏幕方向变化?

    我有一个 Android 应用程序 它已经在处理方向的更改 即有一个android configChanges orientation 在清单和onConfigurationChange 活动中的处理程序切换到适当的布局并准备它 我有一个横
  • 为不同用户隐藏 Django 管理站点中的某些字段

    我有一个管理网站 需要向更多管理员开放 目前我的模型看起来像 class YouTube models Model name models CharField max length 100 credit card number models
  • ruby 1.8.7 和 2.1 之间的 DBI 行/委托行为

    我在 ruby 1 8 7 中执行以下代码以从数据库中读取行 require dbi db conn handle DBI connect DBI Mysql host localhost database mydb port 3306 r
  • Django外键:获取相关模型?

    是否可以通过外键字段本身获取外键的相关模型 例如 如果我有 3 个模型 class ModelA models Model field1 models CharField max length 10 class ModelB models
  • Spring Boot - 如何在开发过程中禁用@Cacheable?

    我正在寻找两件事 如何在开发过程中使用 Spring boot dev 配置文件禁用所有缓存 application properties 中似乎没有通用设置可以将其全部关闭 最简单的方法是什么 如何禁用特定方法的缓存 我尝试像这样使用 S
  • Google 脚本过滤一个值的范围

    我想过滤第 1 列中仅包含 Bob 特定值的行的 google 工作表范围 到目前为止 我的代码允许我过滤out第 1 列中有 Bob 的行 我需要相反 我想返回第 1 列中只有 Bob 的行 因此 其中 filterSettings 不是
  • 有没有适用于 Eclipse 的 SQL 格式化插件?

    我在网上没有找到任何标准的开源 sql 格式化程序 eclipse 插件 我正在使用日食太阳神 我可以找到编辑 gt 格式化SQL但这似乎不起作用 找到一个在http ventralnet blogspot in 2010 11 sql b
  • DLR 返回类型

    我需要 DLR 的帮助 我正在实现 IDynamicMetaObjectProvider 和 DynamicMetaObject 但在获取预期返回类型时遇到一些问题 我在元对象中覆盖 BindInvokeMember 我可以看到所有参数类型
  • 神经网络误差随每个训练示例而振荡

    我已经实现了一个反向传播神经网络并根据我的数据对其进行了训练 数据在英语和非洲语句子之间交替 神经网络应该识别输入的语言 网络结构为27 16 2 输入层对于字母表中的每个字母都有 26 个输入加上一个偏置单元 我的问题是 当遇到每个新的训
  • 如何将张量推送到 TensorFlow 队列并从另一个进程中提取它们?

    我有一个 TensorFlow 集群已启动并正在运行 我正在尝试使用一个客户端进程将数据入队 并将其从另一进程中出队 我无法让它工作 我做错了什么 这是我的推送数据的程序 queue push py import tensorflow as
  • oracle.jdbc.driver.OracleDriver ClassNotFoundException

    这是我收到错误的代码 我的classes12 jar已作为外部 jar 导入 import java io IOException import java io PrintWriter import java sql Connection
  • 继承类中的python __init__方法[重复]

    这个问题在这里已经有答案了 我想为子类提供一些额外的属性 而不必显式调用新方法 那么有没有办法给继承的类一个 init 不重写的类型方法 init 父类的方法 我编写下面的代码纯粹是为了说明我的问题 因此属性等的命名很糟糕 class in
  • 我们可以在 Objective-C 中创建可空/非空属性吗?

    我们可以在 Objective C 中创建可空 非空属性吗 如果可以 那么如何创建 您可以使用 Nullable and Nonnull预选赛 property copy nullable NSString name property co
  • Angular JS:当我们已经有了具有作用域的指令控制器时,指令的链接函数需要什么?

    我需要对范围和模板执行一些操作 看来我可以在以下任何一个中做到这一点link函数或controller函数 因为两者都可以访问该范围 什么时候我必须使用link功能而不是控制器 angular module myApp directive
  • keycloak - 基于用户名(电子邮件地址)的领域解析

    我正在开发一个多租户项目 其中用户名实际上是他们的电子邮件地址 而电子邮件的域用作租户标识符 现在在 keycloak 中 每个租户都有不同的领域 但我希望为所有租户提供一个登录页面 并且实际领域将通过用户名 电子邮件地址 以某种方式解析身
  • Hibernate 中的 UserType 加入

    在这种情况下 是否有可能让 hibernate 为某些 正确 值做 正确的事情 from ClassA a ClassB b where a prop b prop 问题是 prop 是一个 UserType 在连接表中具有不同的表示形式
  • 但为什么浏览器 DOM 经过 10 年的努力仍然这么慢?

    Web 浏览器 DOM 自 90 年代末以来就已存在 但它仍然是性能 速度方面最大的限制之一 我们拥有来自 Google Mozilla Microsoft Opera W3C 和其他各种组织的一些世界上最聪明的人才 为我们所有人致力于 W
  • 有什么办法可以将2个数组添加到一个数组中吗?

    有没有一种简单通用的方法可以将两个数组添加到一个数组中 在下面的情况下 不可能简单地使用C A B陈述 我想避免每次都为它制定算法 TPerson record Birthday Tdate Name Surname string end
  • 在高负载站点中使用 PHP 的策略

    在你回答这个问题之前 我从未开发过任何足够流行的东西来达到高服务器负载 把我当作 叹气 一个刚刚登陆地球的外星人 尽管我了解 PHP 和一些优化技术 我正在开发一个工具PHP如果效果好的话 可以吸引相当多的用户 然而 虽然我完全有能力开发该