【问题标题】:POST thousands of vars vs. a long JSON string: what is preferrable? [closed]POST 数千个变量与长 JSON 字符串:什么是可取的? [关闭]
【发布时间】:2013-10-07 04:07:14
【问题描述】:

我需要将大约 200x50(行、列)的表值从 jQuery 发布到 PHP。两种选择:

1) 将其作为包含 10,000 个变量的数组发送(增加 php.ini max_input_vars)。

2) 将数组序列化为 JSON 字符串,将其作为字符串发布并在服务器端的 PHP 中解码。

什么是可取的?选项 1 有任何潜在问题吗?

谢谢


附言。更新。在高达 250x50 单元格的大型输入表上测试这两种药水后,看起来第一个选项要快得多:JSON 字符串为 1-2 秒 vs ~17-20 秒。

瓶颈是到服务器的数据传输时间,因为对象到 JSON 和反向事务几乎是即时的(几毫秒)。

【问题讨论】:

  • 您为什么不尝试两者,然后告诉我们哪个更适合您?
  • 我刚刚在 180 x 15 的表上测试了这两个选项。使用 JSON 字符串会使到服务器的事务太慢:17 秒对 1-2 秒的 POST 数组选项。事务数组-JSON 字符串和返回非常快,几毫秒。有人可以对此发表评论吗?
  • 其实你可以编辑你的问题,你可以回答自己的问题并将其标记为答案
  • 很难相信 json 编码它更慢。也很难相信您有一个需要提交 10,000 个变量的合法案例。这是某种数据库编辑器,您可以在其中向用户显示数千行并在保存时提交整个内容?
  • 你应该只在修改后发送并且只修改那些数据......重新保存这么多未更改的数据只是糟糕的设计......

标签: php jquery arrays post


【解决方案1】:

我用正文中的二进制数据向我们的服务器发送 PUT 请求,大概相当于 10k 条文本记录,并且传输非常快。我可能想知道那里发生了什么,在一对一的转移时间中是否有什么东西会误导你。例如,post vars 可能认为“传输”是请求的不同阶段。或者,如果您在带有行/列名称或其他内容的 json 结构中添加了很多无关紧要的包袱?

如果事实证明这是真的,并且每种方法都具有相同的性能 - 我个人会在正文中使用结构化 JSON,因为与一堆编码后的变量名称相比,它看起来更清晰、更容易查看/调试。

另外——我不知道你的应用是做什么的,所以你的方法可能是完全合适的。但我可能会考虑是否可以根据需要发送数据,而不是一次发送整个表。 (当人们不回答我的问题并试图给我一些替代的做事方法时,我会很生气,所以最后一点要持保留态度!但人类会触及 10k 记录似乎确实不寻常 - 需要它们都被同时发送到服务器)

【讨论】:

    【解决方案2】:

    您已经回答了自己的问题。 在开发软件时应该使用的性能和代码质量之间存在合理的折衷。

    所以 Json 在双方(Javascript 和 PHP)上都受支持,并在您的代码中提供了更好的结构。

    【讨论】:

      【解决方案3】:

      我认为有很多因素。您在哪个环境下工作,服务器和客户端在同一台PC上? 你必须每天或每小时都这样做吗?

      是否有其他项目在同一台服务器上,因此它们的响应速度较慢?在一两个月内你会有超过 10K 的 vars 吗?

      如果您像第一个选项一样发布数据,由于JavascriptPHP 更快,您有时可能会丢失一些数据。

      如果您可以异步执行此操作,请查找 RabitMQ 它是一个消息服务器,在服务器准备好时执行人员操作(它执行速度也很快!) http://www.rabbitmq.com/

      【讨论】:

        【解决方案4】:

        将其序列化为 JSON 字符串,但使用 json_encode() 和 json_decode() 因为它要快得多。将变量放入一个对象中,然后将其序列化。

        另外,javascript 应该做更多的工作,因为它是客户端做的,不会让服务器承受如此沉重的负载。

        【讨论】:

          【解决方案5】:

          我会建议选项 #1 的变体。众所周知,JSON 编码器和解码器存在错误并且存在跨平台问题,但发布数千个变量可能是个问题。相反,您可以将所有 post 变量作为单个 application/x-www-form-urlencoded post 变量传递,然后在 PHP 中使用 parse_str() 对其进行解码。

          Javascript:

          data = "data="+escape("v[0][0]="+escape(v[0][0]));
          

          PHP:

          parse_str($_POST['data'],$data);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-03-15
            • 2014-12-08
            • 2018-02-03
            • 1970-01-01
            • 2019-12-17
            相关资源
            最近更新 更多