【问题标题】:PHP: transfer a large array between two sitesPHP:在两个站点之间传输一个大数组
【发布时间】:2010-12-22 22:42:51
【问题描述】:

我正在尝试在 PHP 中的两个站点之间传输一个大型数组。我是两者的管理员。 该数组是在一个站点上创建的,创建后我希望自动将用户重定向到另一个站点,并传递处理后的数组。

我不能使用 SESSION 超全局,因为它仅限于特定域。 GET 不适合,因为数组太长。 我不确定 POST 是否合适,以及是否有办法自动发送数据而不强制用户单击按钮并提交一些表单。我知道 javascript 可以用于此,但更喜欢有更强大的东西。

我对 PHP 比较陌生,很想知道执行此操作的任何其他方式。 谢谢!

【问题讨论】:

    标签: php session post get superglobals


    【解决方案1】:

    我会这样做:

    • 在服务器 A 上生成令牌(例如 sha1(timestamp + session id + random()))
    • 使用 cURL 将序列化数组发布到服务器 B,并传递您生成的令牌
    • 在服务器 B 上,将序列化的数据和令牌存储在数据库表中 - 字段:令牌 (CHAR)、数据 (BLOB)
    • 将用户重定向到http://ServerB/?data_token=[TOKEN GENERATED IN STEP 1]
    • 服务器 B 从 db 中获取与令牌关联的数据,删除 db 条目,并将数组存储在新的用户会话中。

    【讨论】:

      【解决方案2】:

      你的问题:

      array(ar)Server(a) 发送到 Server(b)

      我的解决方案:

      1. Server(a)Server(b) 生成一个唯一的 url(url),其中包含 Array(ar) 使用 json_encode(ar) 在例如 json 中编码。此 Array(ar) 应存储在 url 中,例如使用 mysql 或只是一个简单的文本文件。

        $uid = md5(uniqid(mt_rand(), true)); // to generate unique id
        
      2. Server(a) 将浏览器重定向到同样包含 $uid

        Server(b)
        $url = "http://server-b/page"; // url to page
        header('Location: $url?uid=$uid');
        
      3. Server(b)Server(a) 上的 url 获取内容并将内容解码回 Array(ar)

        $uid = $_GET['uid']; // uid
        $url_server_a = "http://server-a/webservice?uid=$uid";
        $ar = json_decode(file_get_contents($url_server_a));
        

      【讨论】:

        【解决方案3】:

        您可以将数组解码为 JSON 并将链接发送到第二个服务器,其中包含临时 JSON 文件的下载,只需将 JSON 文件重新解码回 PHP,您不必使用长 URL。

        【讨论】:

          【解决方案4】:

          最简单的方法是使用像 cURL 这样的 HTTP 库并设置并向其他站点发送 POST 请求。还包括用户 IP 地址将允许您关联发布的数据。如果没有 JavaScript,您将无法使用 POST 数据重定向用户。

          对于上述方法,您可能需要注意的一件事是,根据其实现方式,用户可能会在数据到达之前到达。

          HTTP 规范中定义的 POST 没有限制,但您可能会遇到在其他服务器上处理它的问题(取决于您的意思),具体取决于 php 配置。 (我相信 POST 限制默认设置为 8MB)

          【讨论】:

          • IE 的限制是针对 GET 的,无论如何这不会影响服务器 :-) support.microsoft.com/kb/208427
          • 通过 IP 地址关联是个坏主意。许多用户可能共享同一个地址。
          【解决方案5】:

          通过cURL functions 发送一个HTTP POST 请求,并将serialize()ed 数组添加到请求正文中。

          【讨论】:

            【解决方案6】:

            创建数组后,您可以快速生成一个页面,该页面的表单包含隐藏字段中的数据。然后,此页面可以自动将表单(使用 method="POST")提交到您的重定向。

            【讨论】:

              【解决方案7】:

              如果是我,我会将信息存储在其他介质中:例如 memcache 类型的环境,或者两者都可以访问的数据库。

              【讨论】:

                【解决方案8】:

                我建议在创建“数组”后将其与 ID 关联(​​并存储在某处),然后使用此 ID 重定向到另一个。从站点 2 使用 ID,您可以调用站点 1 上的页面,该页面返回“数组”

                【讨论】:

                  【解决方案9】:

                  我猜你可以序列化它,将它保存为一个可以从另一台服务器访问的文件,然后从另一台服务器再次加载它。这样一来,无需用户操作,但您必须保护保存文件的目录以避免隐私问题。

                  编辑:我假设他们在不同的服务器上,否则会更容易......

                  【讨论】:

                    【解决方案10】:

                    好吧,如果他们都在同一个服务器上,你可以让一个劫持另一个会话。我之前用这个跳转到安全服务器,在第一台主机上使用 session_id() 函数获取会话,然后在第二台主机上使用相同的函数设置。

                    http://www.php.net/manual/en/function.session-id.php

                    【讨论】:

                      猜你喜欢
                      • 2012-09-12
                      • 1970-01-01
                      • 2011-09-21
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2012-09-28
                      相关资源
                      最近更新 更多