Php 以正确的方式处理高流量

Php 以正确的方式处理高流量,php,mysql,optimization,Php,Mysql,Optimization,我正在使用PHP和MySQL为我的多人iOS游戏(为Android to构建)处理数据,该游戏即将取得成功。在高流量的时候,我有大约3个电话,仅次于我的“move.php”页面。它需要玩家移动并将数据保存在my db中,然后返回“completed”。我需要这个来确保没出什么差错。当存在高压时,我需要大约3-5秒才能“完成”返回,甚至更多。我希望获得的用户数量是现在的10倍,并且担心这会导致响应时间过长或开始失败。。。在我的move.php页面中,我有大约5个不同的选择查询、4个更新查询和2个插

我正在使用PHP和MySQL为我的多人iOS游戏(为Android to构建)处理数据,该游戏即将取得成功。在高流量的时候,我有大约3个电话,仅次于我的“move.php”页面。它需要玩家移动并将数据保存在my db中,然后返回“completed”。我需要这个来确保没出什么差错。当存在高压时,我需要大约3-5秒才能“完成”返回,甚至更多。我希望获得的用户数量是现在的10倍,并且担心这会导致响应时间过长或开始失败。。。在我的move.php页面中,我有大约5个不同的选择查询、4个更新查询和2个插入查询。这部分经过优化,但我使用常规的mysql和php

我想知道在这一点上什么是好的实践,以及如何使其更快,特别是“完成的”将被发回。我不介意以后的长时间执行,只要用户不体验这个。mysqli、pro、存储过程等是否为我做了什么


希望提前得到答案和感谢…

一般来说,让应用程序更快就是找到瓶颈——试着分析脚本,看看哪些部分运行缓慢,然后优化它们。在不同点进行测量-数据库查询、程序模块、web服务器请求。别忘了用不同的负载配置文件(每秒并发请求数、用户总数等)配置应用程序

典型的优化包括:

  • 对SQL查询使用
    EXPLAIN
    ,查看索引是否正确使用
  • 如果可能,限制从数据库返回的结果(使用更多WHERE条件或Limit语句)
  • 如果可能,缓存一些结果
  • 扩展:使用多个服务器和负载平衡器,使用复制的Mysql服务器
无论性能如何,使用PDO或mysqli代替不推荐使用的mysql模块都是一个好主意


如果您真的想立即返回“complete”,您可以研究一下-它将允许您在后台处理SQL。但是,您需要监控工作负载-如果查询排队太多,则选择结果将不再反映当前游戏状态。

当您处理流量时,只有一件事起作用

你需要想象一个虚拟的规模,一端是用户的机器,另一端是服务器的硬盘。因此,找出将数据移动到尽可能靠近用户端的技术。您访问服务器磁盘的次数越少,网站的响应速度就越快。这包括以下技术:

  • 客户端数据存储
  • 服务器端缓存
  • 服务器端
  • 正确索引数据,以便快速检索数据

  • 我可以提供更具体的工具等。但是你可以在网上很容易地找到这些工具(阅读
    memcached
    等),我强调了一般的想法…

    除了到目前为止你得到的非常好的建议之外,别忘了。他们真的可以加快执行时间


    另外,11个查询并不多,但是如果MySQL在每个查询的执行计划中花费时间,那么它就真的可以加起来了。因此,如果准备好的语句是可能的,那么它值得考虑。

    考虑到MySQL查询的数量,我会考虑将它们组合起来。例如,对于多个
    INSERT
    s,可以在同一连接中运行,或者您是否为它们中的每一个发出不同的语句(锁定和解锁数据库)

    此外,查询是否对时间敏感?或者,是否可以将结果发送到客户端,然后将查询放入作业队列中,以便稍后进行处理


    除此之外,我只能建议已经提出的建议:评测代码、缓存位置等。

    除了这些(好的)建议外,还值得检查更新脚本的总时间。可能是您的脚本速度非常快,但由于网络速度太慢而让人失望。有些脚本对时间敏感,有些脚本则不敏感。如果考虑作业队列,我应该看什么?如果它对时间不敏感,并且不需要在那一秒进行处理,那么我会将它添加到队列中,以便在服务器能够处理它时进行处理。两种流行的解决方案是Amazon的SQS和Beanstalkd。由于所有的缓存机制都增加了复杂性(需要运行额外的软件,过时缓存中的奇怪bug),我将“适当的索引”放在列表的首位。到处都有复杂性。你走得越深,它就越复杂。不要逃避。如果需要速度,在每个阶段引入缓存是不可避免的。如果存在状态缓存,请找出处理方法。是的,索引解决了某些情况,但缓存非常重要。