【问题标题】:Among $_REQUEST, $_GET and $_POST which one is the fastest?在 $_REQUEST、$_GET 和 $_POST 中,哪一个最快?
【发布时间】:2010-12-27 20:26:37
【问题描述】:

哪些代码会更快?

$temp = $_REQUEST['s'];

if (isset($_GET['s'])) {
  $temp = $_GET['s'];
}
else {
  $temp = $_POST['s'];
}

【问题讨论】:

  • 还有第三种情况,你知道的。 !isset($_REQUEST['s']).
  • 其他人清楚地理解你的代码有多重要? POST 和 GET 是显式的,而 REQUEST 可能来自各种来源。我认为效率可以忽略不计,因为 REQUEST、POST 和 GET 超全局变量总是为每个请求加载。

标签: php


【解决方案1】:

$_REQUEST默认包含$_GET$_POST$_COOKIE的内容。

但这只是一个默认值,取决于variables_order;并且不确定是否要使用 cookie。

如果我必须选择,我可能不会使用$_REQUEST,我会选择$_GET$_POST -- 取决于我的应用程序应该做什么 (即一个或另一个,但不是两者兼而有之):一般来说:

  • 当有人您的应用程序请求数据时,您应该使用$_GET
  • 当有人推送(插入或更新;或删除)数据你的应用程序时,你应该使用$_POST

无论哪种方式,性能不会有太大差异:与脚本的其余部分相比,差异可以忽略不计。

【讨论】:

  • 理想情况下,您应该始终能够使用 $_REQUEST。但这当然只是一个完美的世界。
  • $_REQUEST 据说(或至少曾经是)比直接使用 $_POST 和 $_GET 更昂贵。
  • +1 表示性能差异可以忽略不计,维护视角更重要:$_GET 和 $_POST 以 $_REQUEST 无法传达的方式传达意义。
  • 使用 $_REQUEST 不会导致 XSS/XSRF。不了解 XSS/XSRF 的细微差别会导致 XSS/XSRF。只要您使用令牌进行缓解,就没有问题并且您可以获得使用 $_REQUEST 的好处(您的所有变量都在一个超全局中)。由于'variables_order',我实际上在基于其他超全局变量使用它之前重建了$_REQUEST。我处理 $_COOKIE,然后是 $_GET,然后是 $_POST。这样,POST vars 的优先级最高,cookie vars 的优先级最低,这让我可以隐式修复一些错误(例如 Adob​​e Flash 和魔术引号)。
  • 它的名字,Get = get from , Post = post to
【解决方案2】:

GET 与 POST

1) GET 和 POST 都创建一个数组(例如,array(key => value, key2 => value2, key3 => value3, ...))。该数组包含键/值对,其中键是表单控件的名称,值是来自用户的输入数据。

2) GET 和 POST 都被视为 $_GET 和 $_POST。这些是超全局变量,这意味着无论范围如何,它们始终是可访问的 - 您可以从任何函数、类或文件访问它们,而无需执行任何特殊操作。

3) $_GET 是通过 URL 参数传递给当前脚本的变量数组。

4) $_POST 是通过 HTTP POST 方法传递给当前脚本的变量数组。

何时使用 GET?

使用 GET 方法从表单发送的信息对每个人都是可见的(所有变量名称和值都显示在 URL 中)。 GET 对发送的信息量也有限制。限制为大约 2000 个字符。但是,由于变量显示在 URL 中,因此可以为页面添加书签。这在某些情况下很有用。

GET 可用于发送非敏感数据。

注意:GET 绝不能用于发送密码或其他敏感信息!

何时使用 POST?

使用 POST 方法从表单发送的信息对其他人不可见(所有名称/值都嵌入在 HTTP 请求的正文中),并且对发送的信息量没有限制。

此外,POST 支持高级功能,例如在将文件上传到服务器时支持多部分二进制输入。

但是,由于变量未显示在 URL 中,因此无法为页面添加书签。

【讨论】:

  • 请也添加一些关于 REQUEST 的内容。
  • $_REQUEST 怎么样?
【解决方案3】:

$_GET 从查询字符串或您的 URL 中检索变量。>

$_POST 从 POST 方法中检索变量,例如(通常)表单。

$_REQUEST 是 $_GET 和 $_POST 的合并,其中 $_POST 覆盖 $_GET。最好在自引用表单上使用 $_REQUEST 进行验证。

【讨论】:

  • +1 这基本上是我学到的。不像其他答案那样技术性,但更容易记住(GET 来自查询字符串,POST 来自表单提交)。
【解决方案4】:

我建议明确使用$_POST$_GET

无论如何,对于正确的网站设计来说,使用 $_REQUEST 应该是不必要的,它也有一些缺点,比如让您更容易受到CSRF/XSS 攻击以及在 URL 中存储数据所带来的其他愚蠢行为。

无论哪种方式,速度差异都应该是最小的。

【讨论】:

    【解决方案5】:

    使用请求。没有人关心这么简单的操作速度,而且代码更简洁。

    【讨论】:

    • 很好的答案,但需要注意的是,在许多情况下,应根据情况选择 GET 或 POST,而不是使用其中任何一个。
    • 你是对的,没人关心,但我认为使用$_REQUEST 是错误的结论。看我的回答。
    • 为什么使用 $_REQUEST 比使用 $_GET 或 $_POST 更干净? $_REQUEST 在幕后执行相同的逻辑,选择 GET 或 POST 为您提供更多控制权。
    • _REQUEST 更卫生的说法需要详细说明。
    • 如果您希望用户能够复制 URL 并执行相同的操作,我建议您使用 GET(它的 URL 像 'google.com/q=searchWord' 一样可见,而 POST 应该用于将数据发布到只应插入一次的网站,或者大量数据处于活动状态并且用户不应该像在数据库中插入数据、登录等那样保留 url。
    【解决方案6】:

    别担心。但是您仍然应该使用第二种解决方案(加上对这些变量不存在的额外检查),因为$_REQUEST 存在安全问题(因为$_GET$_POST 不是该数组的唯一来源)。

    我相信昨天有一篇关于$_REQUEST 问题的帖子。让我去找。

    编辑:哦,好吧,不是直接发帖,但无论如何:http://kuza55.blogspot.com/2006/03/request-variable-fixation.html

    【讨论】:

      【解决方案7】:
      if (isset($_GET['s'])) {
        $temp = $_GET['s'];
      }
      else {
        $temp = $_POST['s'];
      }
      

      使用它是因为它更安全,而且不会造成明显的速度差异

      【讨论】:

      • 根本不是一个糟糕的解决方案。它解决了与$_REQUEST 相关的安全漏洞,但仍然允许以任何一种方式访问​​相同的脚本(在我的情况下,相同的脚本用于不同的“操作”,有时 $_GET 可以,但其他时候我需要 $_POST 来隐藏/保护数据)。
      【解决方案8】:

      由于黑客可以设置一个覆盖 $_POST 或 $_GET 值的 cookie,因此涉及某些安全问题。如果您处理敏感数据,我不建议使用 $_REQUEST。 – Xandor

      在某些情况下,您不能使用 $_GET 替代 $_POST

      什么时候??

      • 当您要上传文件时。
      • 当你不想在 url 中显示数据时。

      GET 对发送的信息量也有限制。限制为大约 2000 个字符。

      还有一些情况是您无法使用$_POST检索数据

      什么时候?

      • 在 URL 中传递数据时。

      休息服务

      `GET` - Provides a read only access to a resource.
      
      `PUT` - Used to create a new resource.
      

      使用$_REQUEST没有什么问题。

      但是这样做的方法是明确检查 $_SERVER['REQUEST_METHOD'],而不是依赖 $_POST 为空来获取 GET。

      【讨论】:

      • 关于使用$_SERVER['REQUEST_METHOD'] 检查脚本是否会被其中任何一个调用的好建议。但要说$_REQUEST 没有错,这并不是 100% 正确的。由于黑客可以设置将覆盖 $_POST 或 $_GET 值的 cookie,因此涉及某些安全问题。如果您处理敏感数据,我不建议您使用$_REQUEST
      • 我已在我的回答中添加了您的评论,这对您有帮助,谢谢
      【解决方案9】:

      $_GET 从查询字符串或您的 URL 中检索变量。>

      $_POST 从 POST 方法中检索变量,例如(通常)表单。

      $_REQUEST 是 $_GET 和 $_POST 的合并,其中 $_POST 覆盖 $_GET。最好在自引用表单上使用 $_REQUEST 进行验证。

      【讨论】:

      • 覆盖依赖于request_order 并且可能还包含cookie值,这就是为什么它不是一个非常可靠和有用的功能。
      【解决方案10】:

      我会使用第二种方法,因为它更明确。否则你不知道变量来自哪里。

      为什么还要同时检查 GET 和 POST?当然,使用其中一个更有意义。

      【讨论】:

      • 我以前见过这种情况,GET 仅用于一个项目(例如移动它),POST 用于多个项目(带有复选框的表单......)。跨度>
      【解决方案11】:

      我只使用 _GET 或 _POST。我更喜欢控制。

      我不喜欢 OP 中的任何一个代码片段,因为它们丢弃了有关使用哪种 HTTP 方法的信息。这些信息对于输入净化很重要。

      例如,如果脚本从要输入数据库的表单中接受数据,那么表单最好使用 POST (use GET only for idempotent actions)。但是如果脚本通过 GET 方法接收输入数据,那么它应该(通常)被拒绝。对我来说,这种情况可能需要将安全违规写入错误日志,因为这是有人正在尝试某事的迹象。

      使用 OP 中的任一代码片段,都无法进行这种清理。

      【讨论】:

      • 实际上,编写一个小页面来发布您想要的任何内容非常简单。因此,除非您依赖发送的引用标头,否则 post var 并不比 get var 更安全。我想显式$_POST 的最大优势是防止搜索引擎爬虫做这样的事情:thedailywtf.com/Articles/WellIntentioned-Destruction.aspx
      • 我没有相反的说法。我所说的是,如果 HTML 表单使用 POST 并且处理它的脚本通过 GET 接收表单的数据,那么脚本会想知道它,而不是像 kobra 的示例那样抛弃这个事实。 (顺便说一句:推荐人也不安全。)
      【解决方案12】:

      我会使用$_POST$_GET,因为与$_REQUEST 不同,它们的内容不受variables_order 的影响。
      何时使用$_POST$_GET 取决于正在执行的操作类型。更改从服务器处理的数据的操作应通过 POST 请求完成,而其他操作应通过 GET 请求完成。举个例子,删除用户账号的操作不应该在用户点击链接后直接执行,而查看图片可以通过链接进行。

      【讨论】:

        【解决方案13】:

        我用这个,

        $request = (count($_REQUEST) > 1)?$_REQUEST:$_GET;
        

        该语句验证 $_REQUEST 是否有多个参数($_REQUEST 中的第一个参数将是可以在需要时使用的请求 uri, 一些 PHP 包不会返回 $_GET,所以检查它是否超过 1 个用于 $_GET,默认情况下,它将是 $_POST。

        【讨论】:

          【解决方案14】:

          您过早地进行优化。此外,出于安全原因,您确实应该考虑是否应该将 GET 用于您要发布的内容。

          【讨论】:

          • 请不要试图告诉人们 POST 比 GET 更安全。
          • 我没有。关键是它们的用途应该考虑一下,而不是公然互换使用,因为“只需输入 REQUEST 就容易多了”。
          • 如果您的意思是 kobra 应该检查数据是否使用预期的方法发送,那么我同意。他的任何一个代码示例都无法进行此类测试。
          【解决方案15】:

          它很丑陋,我不建议在实时推送代码时将其作为最终解决方案,但在构建休息函数时,拥有一个“全能”参数抓取器有时会很方便:

          public static function parseParams() {
              $params = array();
              switch($_SERVER['REQUEST_METHOD']) {
                  case "PUT":
                  case "DELETE":
                      parse_str(file_get_contents('php://input'), $params);
                      $GLOBALS["_{$_SERVER['REQUEST_METHOD']}"] = $params;
                      break;
                  case "GET":
                      $params = $_GET;
                      break;
                  case "POST":
                      $params = $_POST;
                      break;
                  default:
                      $params = $_REQUEST;
                      break;
              }
              return $params;
          }
          

          甚至可以添加一些创意来处理命令行参数或来自您的 IDE 的任何内容。一旦你决定了一个给定的 rest-function 正在做什么,你可以为给定的调用选择一个合适的,以确保你得到你需要的部署版本。 这假设设置了“REQUEST_METHOD”。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多