如何将许多(超过100个)变量传递到PHP中


How to pass many (over 100) variables into PHP

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

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

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

编辑:

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

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

按几个步骤划分的形式将其分解为几个请求不是更好吗?

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

比方说,用户意外关闭了窗口,失去了互联网连接或发生了其他问题,导致数据无法发送到服务器。如果在完成100个输入字段后发生这种情况,我可能会离开页面,再也不会回来了。

从性能的角度来看,我不认为这会有多大区别,但无论如何,我真的建议采取另一种方法。

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

post_max_size = 10M # megabytes

或者在您的.htaccess:中

php_value post_max_size 10M

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

然而,考虑一下这里的数学。即使您有100个字段,每个字段中有20个字节,也只有2000个字节,大约是2KB。即使有1Mbps的上传速度,这是非常慢的,你的用户将能够上传128 KB/秒。以这种速度,100个字段中的每个字段都必须包含1311字节的数据,以便上传过程耗时1秒。

在Apache上,默认超时为300秒,因此在Apache超时之前,表单字段必须包含总共37.5 MB。主机(或服务器管理员)可能会稍微更改此设置,并可能将其设置为更合理的值,例如30秒。但在这个限制下,您需要3.75MB的数据,这可能远远超过100个字段所能包含的数据。

您也不应该关心客户端,因为即使是最吝啬的浏览器(IE)也将POST上传限制在2GB。

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

从用户的角度来看,我认为100个字段将是一个相当令人生畏的景象。如果可能的话,最好将表单分成更友好、更小的步骤,引导用户完成填写表单的过程。如果你不想将表单分成多个步骤,至少可以考虑用javascript保存表单的状态。请注意,W3C建议localStorage有5MB的存储空间,因此应该有足够的空间来存储所有字段。还要看看这个使用cookie的后备方案,但要感到厌倦。Cookie比localStorage有更多的限制。我读到cookie每个限制为4KB,每个域限制为20个cookie。您可能希望将存储的表单字段分配到多个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表单字段数据都应该被清除,因此当他们再次访问表单时,这些字段都将为空,并读取以输入新的数据。

毫无疑问,您已经控制住了用户体验问题,否则您将在用户体验中提出这个问题。

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

1.HTTP POST(作为应用程序/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(作为多部分/表单数据传递的变量)

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

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

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

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

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

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

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'
   ) 
 )

您可以使用通过ajax请求发布的xml变量,例如MVC概念。首先,您设置了一个xml变量的装载。其次,将这个xml变量作为文本发布。通过ajax请求查看PHP post-in,model PHP会接收xml文本数据,并用xml查询进行分解,得到相同数量的变量。