$ _POST / $ _ GET提交的URL太大

时间:2019-03-31 11:51:28

标签: php

我有php脚本,可以将数据从一个数据库迁移到另一个数据库。在一个脚本中,我互相调用以从原始数据库中获取数据,然后将其发送到另一个数据库。像这样:

migrateData.php <---> getData.php 然后再迁移data.php <---> putData.php

在putData.php中,我使用$ _GET,但是当它的数据太多时,出现错误消息“请求的URL的长度超出了此服务器的容量限制”。 我见过有人说要使用$ _POST,但是我对此不太确定。 我的migrationData.php:

    <?php

  echo "Migration"; 
  $url = "http://localhost/mig/getData.php";
  $client = curl_init($url);
  curl_setopt($client,CURLOPT_RETURNTRANSFER,true);
  $response = curl_exec($client);
  echo "<br>";
  echo "<br>";
  echo $response; 

  $url = "http://localhost/mig/putData.php?data=".$response;
  $url = str_replace ( ' ', '%20', $url);
  $client = curl_init($url);
  curl_setopt($client,CURLOPT_RETURNTRANSFER,true);
  $response = curl_exec($client);
  echo $response;

?>

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:1)

是的,当您将获取请求发送到服务器(apache,nginx)时,它可能会限制客户端HTTP请求行的允许大小(例如)和HTTP请求标头字段的大小。

例如,如果您有权访问服务器及其Apache服务器,则可以增加limit request line的Apache限制和request field size的限制。

对于nginx,可以在nginx.conf中增加large_client_header_buffers参数。

使用POST方法会将字段发送到客户端的HTTP请求行之外,从而有效地绕过服务器约束。 实际上,POST请求也受到限制,但是默认大小更大。

建议使用POST或PUT方法,而不要更改服务器配置。

<?php
//Your code to get the response here
// ...

$data = ['data' => $response];

// Prepare new cURL resource
$ch = curl_init('http://localhost/mig/putData.php');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

// Submit the POST request
$result = curl_exec($ch);

// Close cURL session handle
curl_close($ch);

//Output the result
echo $result;

?>

答案 1 :(得分:0)

Apache的最大$_GET请求长度为8190字节(https://stackoverflow.com/a/1289611/575047),因此尝试在GET请求中发送数据堆是一个坏主意,因为它可能会被切断。

POST是理想的选择。默认情况下,Apache会将post_max_size设置为8mb。

要进行POST,您只需将我认为的这些行添加到putData curl

curl_setopt($client, CURLOPT_POST, 1);
curl_setopt($client, CURLOPT_POSTFIELDS, $response);