Большой POST запрос

327
10 декабря 2016, 10:05

Бьюсь второй день над следующей задачей: есть база данных адресов типа "область", "город", "улица", "дом" и т.д. необходимо сделать механизм добавления комментариев, к которым будет привязан список адресов, причём к комментарию может быть привязан любой уровень, например:

  1. "не назначать подключение в субботу", связанный с адресом "московская область, г.Королёв"
  2. "не назначать на воскресенье", связанный с адресами
    "московская область, г.Королёв, пр. Космонавтов д5"
    "московская область, г.Королёв, пр. Космонавтов д6"
    "московская область, г.Королёв, пр. Космонавтов д7"
    "московская область, г.Королёв, пр. Космонавтов д8"

Соответственно, при передачи комментария с кучей привязанных адресов я имею огромный $_POST, который просто рубится.
Пробовал протащить через $_COOKIE — результат тот же.

Рассматриваю в качестве варианта разделение запросов на куски — по одному на адрес и передача таковых аяксом...
Единственной ли это вариант или можно сделать более красиво?

UP: извиняюсь, ввёл в заблуждение, апач выдаёт ошибку 414, не заметил сразу её в логах в конце запроса.

post_max_size 64M
upload_max_filesize 32M
memory_limit 128M...
причём размер пришедших данных постоянно разный! Что за бред такой? Может, дело в Phalcon`е, который установлен?

Answer 1

Проблема решается через php.ini свойства:

post_max_size - Общий размер POST запроса по умолчанию 8Мб

upload_max_filesize - размер файла который можно загрузить на сервер через POST.

Очень важно что бы значения были:

memory_limit > post_max_size > upload_max_filesize

Так же, не збываем, что бы скрипту хватило времени "пережевать" данные max_execution_time

http://php.net/manual/en/info.configuration.php

UPD

1) Если верить этим двум ссылкам то похоже данные приходят через GET. Попробуйте посмотреть в apache access.log URL запросов.

http://stackoverflow.com/questions/2891574/how-do-i-resolve-a-http-414-request-uri-too-long-error

https://docs.phalconphp.com/en/latest/reference/apache.html

2) Можете попробовать получить тело запроса напрямую через:

$data = file_get_contents('php://input');
parse_str($data, $result)
var_dump($result);

и посмотреть всё ли пришло.

3) Ну и apache тоже умеет "обрезать" POST запросы посмотрите:

http://httpd.apache.org/docs/2.0/mod/core.html#limitrequestbody

Answer 2

У меня было подобная проблема но в другой задаче. Нужно было синхронизировать таблицы базы данных. В конечно счёте сделали так. Массив с данными делили на куски и отправляли в цикле . Вот пример кода.

$recordChunks = array_chunk($rd[0]['RECORDS'], 7000); 
            foreach ($recordChunks as $chunk) {
                $rd[0]['RECORDS'] = $chunk;
                $request = array(
                    'TOKEN' => $this->getContainer()->getParameter('cdb_token'),
                    'DATA' => json_encode(array(
                        "DB_VERSION" => $dbVersion,
                        "DATA" => $rd,
                    )),
                );
                $size += strlen($request['DATA']);
                //отправка данных на ЦБД
                $ch = curl_init();
                curl_setopt($ch, CURLOPT_URL, $this->getContainer()->getParameter('https_cdb_from'));
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($ch, CURLOPT_HEADER, 0);
                curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
                curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
                curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0);
                curl_setopt($ch, CURLOPT_TIMEOUT, 0);
                curl_setopt($ch, CURLOPT_SSLVERSION, 3);
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                curl_setopt($ch, CURLOPT_CAINFO, $this->getContainer()->get('kernel')->getRootDir() . '/адрес.pem');
                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
                // получить json ответ
                $response = curl_exec($ch);
                curl_close($ch);
                $data = json_decode($response);
                if (($data->STATUS != 1) || (is_null($data))) {
                    var_dump($table, count($chunk),$rd);
                    $this->em->getFilters()->enable('softdeleteable');
                    throw new \Exception('Ошибка на ЦБД');
                }
                unset($request);
            }
            unset($rd);
READ ALSO
implode и многомерные массивы

implode и многомерные массивы

Мне нужно в логах красиво, С ОТСТУПАМИ выводить многомерные массивыПока у меня есть функция для вывода без отступов:

412
Get сurrent URL

Get сurrent URL

Есть ajax форма на которую переходят по ссылке с видео (жалоба), ссылка вида: http://sitecom/abuse/index

320
Почему Symfony3 forwarding уходит в цикл?

Почему Symfony3 forwarding уходит в цикл?

Открываю site/app_devphp/s/text, выводит капчу

231