【问题标题】:How to pass many (over 100) variables into PHP如何将许多(超过 100 个)变量传递给 PHP
【发布时间】:2012-08-15 06:55:41
【问题描述】:

我知道将变量导入 PHP 的常规 $_POST 方法。但是,如果变量数量如此之多,这仍然是传递变量的最有效解决方案吗?

目前在我的代码中,用户将信息输入到 100 多个输入文本中,然后使用 $_POST 方法将此信息传递给 PHP。但是,我认为这对于许多服务器来说不会太好。

基本上,如果有人能告诉我将大量变量传递到服务器的理想方式,那就太好了。提前致谢。

编辑:

对于所有说这只是 UI 灾难的人来说,这是多次咨询过的问题。然而,提交页面本质上是网站的核心,用户不会被大量输入劝阻是有原因的——事实上,默认数字是 20,但列表可以扩展到 100 个输入,即为用户实现的选项。

感谢所有建设性的回复,他们非常有帮助。

【问题讨论】:

  • 通常不是数量,而是数据量。 100 个 1 个字符的 vars 基本上与 100 个字符的 1 个 vars 没有什么不同。
  • 如果您必须在 20 个问题的 5 个选项之间进行选择,那已经很可行了
  • @Tessmore:完全正确。如果 UI 合理的话,100 个字段并不是很多。问题是表单是如何设计的,但这个问题不是关于 UI,而是关于传递此类数据的技术方面。

标签: php jquery variables


【解决方案1】:

将其分解为多个请求,通过多个步骤划分的表单不是更好吗?

从用户体验的角度来看,向用户显示 100 个字段听起来真的很糟糕。把它分成多个步骤怎么样?对用户来说不那么不堪重负,从服务器端的角度来看,您可能也更容易管理。

假设用户不小心关闭了窗口、失去了 Internet 连接或发生了其他问题,导致数据无法发送到服务器。如果我在完成 100 个输入字段后发生这种情况,我可能会离开页面并且永远不会回来。

从性能的角度来看,我认为这不会有太大的不同,但我真的建议采用另一种方法。

【讨论】:

  • 让我们想象一下包含 100 多个字段的表单,但它们不会立即显示给用户,而是部分显示。然后用户编辑各种数据,并将这些数据保存到例如。本地存储 (HTML5)、cookie 或以其他方式保存在客户端上。甚至允许用户展开/折叠表单的各个部分。如果合理呈现,100 个字段并不算多。这样用户体验就不会受到影响。换句话说,向服务器发送数据不会对用户体验产生太大影响。在不需要时发送数据也会增加服务器上的负载,可能会降低 UX。所以我不同意你的观点。
  • @Tadeck 这是一个有效的观点,使用本地存储来临时保存数据将有助于这种情况,并且在处理大型表单时是一个好方法。现在问题有点澄清了,输入字段的数量也更加合理。但我不同意你的观点,即 100 个输入字段“并不多”——我会说很多!
  • “很多”以什么方式?正如我提到的in my answer,每个答案 50 字节仍然只有 5K,这在某些浏览器中作为 GET 上的 QUERY_STRING 可能是个问题,但作为 POST 则没有问题。
  • @ghoti 好吧,我关心的不是数据量,正如我在答案的最后一段中提到的那样,100 个输入字段是用户要完成的大量字段,所以在这种感觉是很多!
【解决方案2】:

这种负载当然是可以管理的,具体取决于您希望每个字段包含多少数据,或者更确切地说,取决于您确定每个字段可以包含的最大数据量。在 PHP 中,HTTP POST 请求正文的最大大小(即包含表单编码值的部分)由ini value post_max_size 确定。它的默认值为 2MB,但您可以在 php.ini 中更改它:

post_max_size = 10M # megabytes

或者在你的.htaccess:

php_value post_max_size 10M

设置时要小心,因为它不应超过系统上可用的 RAM 量。还要考虑到您可能有多个用户请求此页面,如果他们每个人都为他们的请求分配了过多的 RAM,他们可能会挂起或崩溃您的服务器。

但是,请考虑这里的数学。即使您有 100 个字段,每个字段包含 20 个字节,也只有 2000 个字节,大约 2 KB。即使 1 Mbps 的上传速度非常慢,您的用户也可以每秒上传 128 KB。在这个速度下,100 个字段中的每一个都必须包含 1311 字节的数据,上传过程需要 1 秒。

在 Apache 上,the default timeout is 300 seconds,因此在 Apache 超时之前,您的表单字段必须包含总计 37.5 MB 的空间。您的主机(或您的服务器管理员)可能会稍微更改此设置,并且可能设置为更合理的值,例如 30 秒。但仍处于此限制,您将需要 3.75 MB 的数据,这可能比 100 个字段所能包含的数据多得多。

你也不应该关心客户端,因为even the stingiest browser (IE) limits POST uploads to 2 GB

基本上,我的观点是,即使连接速度很慢,HTTP 和您的服务器也能够处理这么多字段。我不确定 PHP 解析所有这些需要多长时间(您必须在服务器上对其进行基准测试),但我想影响可以忽略不计。

从用户的角度来看,我会说 100 个字段将是一个非常令人生畏的景象。如果可能的话,最好将您的表单分成更友好和更小的步骤,引导用户完成填写表单的过程。如果您不想将表单拆分为多个步骤,请至少查看saving the state of the form with javascript。请注意,在W3C recommends 5MB of storage space for localStorage 中,这应该有足够的空间来存储您的所有字段。也看看this fallback that uses cookies,但要疲倦。 Cookie 的限制比localStorage 更多。我读过cookies are limited to 4KB each and 20 cookies per domain。您可能希望将存储的表单字段分配到多个 cookie 中,例如 10 个 cookie 中的 10 个表单字段。您可以使用 encodeURIComponent() 在 cookie 中存储多个输入值:

var inputs = document.forms[0].getElementsByTagName('input')
    i      = 0,
    date   = new Date(),
    expires;

// Expires date (1 day in future)
date.setTime(date.getTime()+(24*60*60*1000));
expires = date.toGMTString();

for(var cookieNumber = 0; cookieNumber < 10; cookieNumber++) {
    var cookie = [];
    for(; i < (cookienumber * 10 + 10); i++) {
        cookie.append(encodeURIComponent(inputs[i].name) + '=' + encodeURIComponent(inputs[i].value));
    }

    document.cookie = 'savedForm' + cookieNumber + '=' + cookie.join('&') + '; expires =' + expires;
}

为确保在用户输入时保存所有内容,您可能需要更新您存储的数据onchange,或者,如果您希望最多保存第二次,请更新onkeyup

另外,为了方便用户,当提交表单时,所有保存的cookie和localStorage表单字段数据都应该被清除,这样当他们再次访问表单时,所有字段都将为空并读取新数据输入。

【讨论】:

  • + 你从哪里得到所有这些故事 :)
【解决方案3】:

毫无疑问,您已经控制了用户体验问题,或者您会在 User Experience 中提出这个问题。

从性能的角度来看,让我们考虑一些传递这些数据的策略。

1. HTTP POST(变量作为 application/x-www-form-urlencoded 传递)

您提交的总大小很容易预测,但取决于表单中的内容。如果您只使用选择和复选框,或者使用整数或布尔值的隐藏变量,那么 100 个元素可能会变成 2KB 的数据。传递 2KB 的数据需要多长时间?不久。显然,文本字段会改变事物(也以您而非我们可以预测的方式),但可能不会显着。编码字符串 var=Pack+my+box+with+five+dozen+liquor+jugs 为 44 个字符。其中 100 个仍然会生成少于 5KB 的数据来上传。即使在模拟调制解调器速度(例如,28.8Kbps 或 2.8KB/s)下,也只需几秒钟。文件附件将我们带入下一个策略。

2。 HTTP POST(作为multipart/form-data传递的变量)

如果您要上传文件,您将使用它,而其他用途可能不会。如果您打算使用表单上传 100 个 4MB JPEG 图像,那么我建议您通过实现基于 JavaScript 的后台上传器来简化事情。让用户在搜索他们的下一个文件时进行上传。除此之外,这种格式的总开销远大于 x-www-form-urlencoded,但与附加文件的大小相比,开销仍然可以忽略不计。 p>

3. HTTP GET(作为 HTTP 请求的一部分传递的变量)

这基本上是一个标记在 URL 末尾的 x-www-form-urlencoded 字符串。见#1。

您应该考虑的另一个主要因素是您将处理此表单的速度。上传时间可能很小,但如果每个表单元素需要 3 秒的数据库访问和处理,那么 100 项会导致表单提交后等待 5 分钟。在不知道您的表单内容是什么或您真正想要在这里实现什么的情况下,除了说“考虑一下”之外,我无法就此事提供任何建议。

【讨论】:

  • 还有一个选项用于发布具有不同内容类型的数据(这意味着您可以发送 JSON、XML 或基本上任何基于文本的文档,但不仅限于)。
  • 当然,也可以编写一个 JS 甚至 Flash 上传处理程序来处理几乎任何格式,但我认为这还不够具体,无法包含在答案中。 ;-)
  • 我不会在不需要的情况下使用 Flash(旧方法,现在基本上不支持),但是在 JS 中序列化数据是完全可能的。如果你发送序列化的 JSON,你有更多的灵活性(事实上,你有布尔值、null、整数、浮点数、字符串、列表和字典之间的区别),如果没有任何选项中的噱头,这是不可能实现的您提到的(每次值都将被视为字符串,除非您在服务器上添加自定义逻辑,并且 PHP 广泛支持 POST/GET 中的关联数组,但不一定在其他地方)。
  • 我也不会使用 Flash,但我们正在超越自己;您和我正在谈论的解决方案超出了 OP 问题的范围。显然,必须为问题建立解决方案。 OP 没有描述与上传他的内容相关的任何挑战,因此该领域的解决方案是另一个问题的主题。
  • 我不同意,但你的回答足够正确,可以得到肯定的投票结果,所以 +1 ;)
【解决方案4】:

使用 POST 请求传递数据的标准方法,您可以将它们作为 $_POST 数组的一部分使用。这种方式可以发送的数据量上限非常高。

如果您想要更灵活的东西,您可以先序列化数据,发送它,然后使用http_get_request_body() 检索此数据。但你不应该需要那个。表格非常适合您描述的场景。

【讨论】:

    【解决方案5】:

    100 应该不是什么大问题。但是您可以使用 '[]' 对输入字段进行分组

    因此:

    Apple
    <input type='checkbox' name='fruity[]' value='apple'>
    
    Pear
    <input type='checkbox' name='fruity[]' value='pear'>
    
    Banana
    <input type='checkbox' name='fruity[]' value='banana'>
    

    如果你检查香蕉和梨,然后提交。结果是

    $_POST = array( 
      0 => fruity => array ( 
        0 => 'pear', 
        1 => 'banana'
       ) 
     )
    

    【讨论】:

      【解决方案6】:

      您可以使用通过 ajax 请求发布的 xml 变量,例如 MVC 概念。首先你设置了一个 xml 变量。其次,您将此 xml 变量作为文本发布。通过ajax请求查看php post,model php会接收xml文本数据,用xml查询分解得到等量的变量。

      【讨论】:

      • 欢迎来到stackoverflow,感谢您的回答。你能用一个最小的工作代码示例来编辑你的帖子吗?
      猜你喜欢
      • 2013-08-29
      • 2012-07-24
      • 1970-01-01
      • 2012-07-04
      • 2022-07-08
      • 2012-06-18
      • 2015-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多