У моїй програмі з'явилася помилка змінної $ _GET, що не існує в Windows 2008 R2 з 4 ядрами процесора.
Тому я створив цей простий код для тестування.
<?php
if(!isset($_GET)){
error_log("_GET is not set");
echo "ERROR";
}else{
echo "OK";
}
І створив простий тест JMeter, щоб викликати його з 15 потоками, приблизно 2500 об / хв.
Коли я запускаю його в єдиному ядерному процесорі, він працює для мільйонів запитів без помилок, але при запуску на сервері з 4 процесорами після приблизно 10 000 запитів змінна $ _GET більше не встановлюється.
Я також повторив тест з $ _POST, $ _SERVER, $ _COOKIE та $ _SESSION. І результат був таким самим.
При зниженні PHP до версії 5.6 він працює добре (з 4 процесорами).
Якщо встановити спорідненість процесора Apache до одного процесора, він також працює.
Я бігаю: Apache / 2.4.18 (Win64) з PHP / 7.0.8. У VM з Windows 2008 R2 з 4 процесорами та 4 Гб оперативної пам’яті, SSD, розміщений на Vultr.com.
Це проблема з PHP 7?
Відповіді:
1 для відповіді № 1Яку збірку PHP ви використовуєте?
Від PHP.net сторінка завантаження Windows :
Apache
Будь ласка, використовуйте конструкції Apache, надані Apache Lounge. Вони забезпечують складання VC9,> VC11 і VC14 Apache для x86 і x64. Ми використовуємо їх двійкові файли для створення SAPI Apache.
Якщо ви використовуєте PHP як модуль зі збіркою Apacheз apache.org (не> рекомендовано) вам потрібно використовувати старіші версії PHP VC6, зібрані з> спадковим компілятором Visual Studio 6. НЕ використовуйте версії PHP VC9 + з бінарними файлами apache.org.
З Apache вам потрібно використовувати версії PHP Thread Safe (TS).