не ответ, но хочу сказать, что, используя PHP 7.2.5 в mod_php с Apache 2.4.33, я не могу воспроизвести вашу проблему, поскольку у меня нет проблем с отправкой чего-либо от 1 байта до 10000 или даже до 100000 байтов в Заголовки:
вот мой продюсер: php:
не ответ, но хочу сказать, что, используя PHP 7.2.5 в mod_php с Apache 2.4.33, я не могу воспроизвести вашу проблему, поскольку у меня нет проблем с отправкой чего-либо от 1 байта до 10000 или даже до 100000 байтов в Заголовки: вот мой продюсер: php:
[110] и ударил ли я http : //127.0.0.1/producer.php? S = 1 или http://127.0.0.1/producer.php?s=10000 или даже http: //127.0. 0.1 / provider.php? S = 100000 , данные возвращаются без проблем, как вы можете видеть на скриншоте выше. Можете ли вы воспроизвести проблему, используя мой код продюсера:
Кстати, интересно, когда я пробую 1 миллион байт, я получаю эту ошибку из curl:
$ curl -I http://127.0.0.1/producer.php?s=1000000
HTTP/1.1 204 No Content
Date: Wed, 16 Jan 2019 20:11:25 GMT
Server: Apache/2.4.33 (Win32) OpenSSL/1.1.0h PHP/7.2.5
X-Powered-By: PHP/7.2.5
X-size: 1000000
curl: (27) Rejected 104960 bytes header (max is 102400)!
GET['s'] ?? 1));
header("X-size: {$size}");
$data=str_repeat("a",$size);
header("X-data: {$data}");
http_response_code(204); // 204 NO CONTENT
и ударил ли я http : //127.0.0.1/producer.php? S = 1 или http://127.0.0.1/producer.php?s=10000 или даже http: //127.0. 0.1 / provider.php? S = 100000 , данные возвращаются без проблем, как вы можете видеть на скриншоте выше. Можете ли вы воспроизвести проблему, используя мой код продюсера:
Кстати, интересно, когда я пробую 1 миллион байт, я получаю эту ошибку из curl:
$ curl -I http://127.0.0.1/producer.php?s=1000000
HTTP/1.1 204 No Content
Date: Wed, 16 Jan 2019 20:11:25 GMT
Server: Apache/2.4.33 (Win32) OpenSSL/1.1.0h PHP/7.2.5
X-Powered-By: PHP/7.2.5
X-size: 1000000
curl: (27) Rejected 104960 bytes header (max is 102400)!
Нет никакого различия при записи самостоятельно (как показано) - в обоих случаях myInt будет увеличен 1.
Но существует различие при использовании его в выражении, например, чем-то вроде этого:
MyFunction(++myInt);
MyFunction(myInt++);
В первом случае myInt увеличен, и новое/увеличенное значение передается MyFunction (). Во втором случае старое значение myInt передается MyFunction () (но myInt все еще увеличен, прежде чем функция вызвана).
Другой пример - это:
int myInt = 1;
int a = ++myInt;
// myInt is incremented by one and then assigned to a.
// Both myInt and a are now 2.
int b = myInt++;
// myInt is assigned to b and then incremented by one.
// b is now 2, myInt is now 3
BTW: как Дон указал в комментарии, те же правила также действительны для декрементных операций, и корректная терминология для этих операций:
++i; // pre-increment
i++; // post-increment
--i; // pre-decrement
i--; // post-decrement
Поскольку Jon Skeet указывает:
Другие показали, где это имеет значение и прокомментировало, что как отдельный оператор не имеет значения.
Я хотел бы добавить, что это - почти всегда плохая идея использовать его, где это имеет значение. Я подозреваю, что может быть несколько раз, где это более читаемо, чтобы иметь код, такой как:
Console.WriteLine("Foo: {0}", foo++);
чем:
Console.WriteLine("Foo: {0}", foo); foo++;
... но они очень редки! Последний этих двух образцов делает упорядочивание совершенно прозрачным сразу - первый требует небольшого количества взглядов (к моему плохому мозгу, так или иначе). Думайте об удобочитаемости сначала.
Другие показали, где это имеет значение и прокомментировало, что как отдельный оператор не имеет значения.
Я хотел бы добавить, что это - почти всегда плохая идея использовать его, где это имеет значение. Я подозреваю, что может быть несколько раз, где это более читаемо, чтобы иметь код, такой как:
Console.WriteLine("Foo: {0}", foo++);
чем:
Console.WriteLine("Foo: {0}", foo);
foo++;
... но они очень редки! Последний этих двух образцов делает упорядочивание совершенно прозрачным сразу - первый требует небольшого количества взглядов (к моему плохому мозгу, так или иначе). Думайте об удобочитаемости сначала.
Это не делает, если это не находится в выражении, т.е.
myInt=1;
x=myInt++;
отличается от:
myInt=1;
x=++myInt;
Первое присваивается 1 к x, потому что присвоение происходит перед инкрементом.
Второе присваивается 2 к x, потому что присвоение происходит после инкремента.
В присвоении или выражениях, например
x = ++myInt; // x = myInt + 1
x = myInt++; // x = myInt
Это может также использоваться в выражениях как для циклов или если операторы. Например, возьмите следующее, где ищут, 0, и количество равняется 3.
while(seek++ < count) {
Console.WriteLine(seek);
}
результаты в выводах 1, 2 и 3, для ищут, и следующее
while(++seek < count) {
Console.WriteLine(seek);
}
Результаты в 1 и 2 для ищут. Так ++ myInt увеличивает myInt, прежде чем его значение будет оценено, где как myInt ++ увеличен после того, как он оценен.
Вот в чем разница, если Вы делаете
int x = 7;
int x2 = x++;
=> x2 is 7 and x is 8
но при выполнении
int x = 7;
int x2 = ++x;
=> x2 is 8 and x is 8
myInt ++ (4 инструкции ЦП)
LOAD AX, #myInt // From myInt memory to a CPU register
COPY AX, BX
INCREMENT BX
STORE BX, #myInt
// Use AX register for the value
++ myInt (3 инструкции ЦП)
LOAD AX, #myInt // From myInt memory to a CPU register
INCREMENT AX
STORE AX, #myInt
// Use AX register for the value
Префиксный оператор ++ myInt является способом уменьшить строки: увеличьте переменную прежде, чем еще передать его куда-нибудь. Это - также хороший способ уменьшить удобочитаемость, так как это редко.
MyMethod(++myInt);
по сравнению с.
myInt++;
MyMethod(myInt);
Мне второе намного легче считать.
Это определяет, когда результат для той операции возвращается.
Вот пример от сайта MSDN:
static void Main()
{
double x;
x = 1.5;
Console.WriteLine(++x);
x = 1.5;
Console.WriteLine(x++);
Console.WriteLine(x);
}
И ouput:
2.5
1.5
2.5
++ myInt добавит, что тот к myInt прежде, чем выполнить рассматриваемую строку, myInt ++ сделает это позже.
Примеры:
int myInt;
myInt = 1;
someFunction(++myInt); // Sends 2 as the parameter
myInt = 1;
someFunction(myInt++); // Sends 1 as the parameter
Я думаю, что является самым простым понять с точки зрения порядка оценки и модификации.
(порядок операций очевиден во введенном порядке оператора и переменной),
Т.е. при использовании в выражении постфиксный оператор оценивает и использует текущее значение переменной в выражении (оператор возврата или вызов метода) прежде, чем применить оператор. С префиксным оператором это наоборот.
Если, например, Вы делаете что-то вроде этого:
int myInt = 5;
Foo(++myInt);
void Foo(int x)
{
Console.WriteLine(x);
}
Это распечатает 6.
Foo(myInt++);
распечатает 5;
В основном ++ myInt увеличивает ПЕРВОЕ использование переменная СЕКУНДА. myInt ++ является противоположным.