• Почему apache создаёт много процессов, что в итоге роняет систему?

    @smple
    если нагрузка на cpu и перекинули часть пользователей туда
    оборудование в вашей сети в основном стучиться на старый сервер и его обработкой занимается старый сервер, поэтому надо мерить не только по пользователям но и по хостам откуда приходит информация от клиентов, это во первых.

    во вторых я бы использовал php-fpm вместо apache+mod_php (это чисто имхо, но совсем не обязательно уверен что apache+mod_php тоже настроить можно просто я чаще настрайваю php-fpm).

    в третих в php могут быть установленны всякие xdebug или не включены opcache что может вызывать нагрузку на cpu поэтому не плохо phpinfo приложить по текущему, а также сравнить его с тем где запускали и проблем не было.

    в четвертых надо посмотреть сколько rps приходит на балансировщик (nginx) и сколько он прокидывает дальше в backend и нужно понять процессы может быть плодятся кривым скриптом или это реальная нагрузка на сервер

    в пятых я бы просто в nginx сделал бы upstream и добавил бы 2 сервера если нагрузка в целом стихла, значит просто ваш сервер не справлялся с ней, если оба сервера стали тормозить значит они не справляются(и тут надо или еще втыкать серваки или уменьшать нагрузку, собирать по реже данные например), если тормозит все тот же сервер а другой работает без проблем то проблема в сервере, после добавления серверов и round robin балансировки нагрузка на двух серверах должна стать примерно одинаковой.

    в 6 возможно косяк в коде и где то бесконечный цикл надо понять воркеры зависают или просто большое количество клиентов

    в 7 на серверах бд и на других серверах надо мониторить io (ввод/вывод) потому что обычно тормоза идут именно от туда, а не только cpu и ram

    я бы начал с 3 пункта, потом 5 а потом по вкусу.
  • Почему apache создаёт много процессов, что в итоге роняет систему?

    @smple
    Виталий Р, нет универсальных показателей где количество людей умножить на показатель на пользователя,везде профили нагрузки разные
    раз при 80 процессах не выдерживаете надо понять что является бутолочным горлышком (скорей всего бд и операции ввода вывода)
    оптимизация производительности делается каждый раз индивидуально
    вам надо масштабироваться и лучше это делать горизонтально подкчючать новые сервера для обработки данных и балансировать нагрузку это не просто процес и его в одном коменте не объяснишь начинать путь отсюда https://nginx.ru/ru/docs/http/ngx_http_upstream_mo...
    я бы сделал следующее
    1. Нашел бы в чем именно проблема(собрал бы показатели по нагрузке io, cpu, ram также собрал бы эти данные с серверов бд)
    2. По возможности запросил бы еще сервера (вынес бд отдельно, 1 фронт сервер на nginx и группа серверов через upstream для обработки запросов)
    3. Посмотрел бы какие сервера тормозят, будет тормозить или бд или backend сервера (или и то и другое)
    4 Начал бы оптимизацию бэкенд серверов начал бы банальных php opcache (потому что банально интерпретировать файлы дорого для cpu) искал бы узкие места и оптимизировал их
    4.2 читал бы про zabbix и про оптимизацию его под нагрузку
    5.Для бд смотрел бы медленные запросы, использовал бы кэш и тд, всячески уменьшал бы нагрузку на io, шардинг и тд

    Для выполнения этих действий нужны квалифицированные люди, можно пытаться ограничить на nginx количество запросов к бэкендам и тогда лишние будут получать ошибки, что не очень.
  • Как написать тест для несуществующего метода?

    @smple
    Александр, получается ты тестируешь мок, а не свой объект что собственно бесполезно, потому что моки уже протестированны.
  • Как написать тест для несуществующего метода?

    @smple
    Александр, он применяется совсем в другой ситуации, для моков, или ты собираешься тестировать мок ?

    пример применения этого метода
    abstract class AbstractSome
    {
        public function trigger($event)
        {
            if ($event && method_exists($this, $event)) {
                return $this->"on".$event();
            }
        }
    }
    
    // Тот объект что мы будем тестировать
    class Magic 
    {
       public function some (AbstractSome $some)
       {
           return $some->trigger('magic');
       }
    }
    
    class MagicTest extends phphunittestcase
    {
        public function someTest()
        {
            $magic = new Magic;
            $some = $this->getMockForAbstractClass(AbstractSome::class);
            $some->method('trigger')
                 ->willReturn('olololo');
            $result = $magic->some($some);
            $this->assertSame('olololo', $result);
        }
    }

    Код не проверял просто для примера написал как это используется обычно, тестировать сам абстрактный класс нету смысла, надо тестировать классы которые наследуются от него.

    также обычно мок создают через getMockBuilder;
  • Вывести значение поля?

    @smple
    Если нет username в посте, вот и notice в лог
  • Вывести значение поля?

    @smple
    Станислав Б, да можно без isset как вы правильно заметили что тут вместо isset вообще лучше использовать array_key_exists
  • Как отправить tcp/xml запрос к ИС из под PHP?

    @smple
    Роман Алексеевич: к сожалению мой ответ не уместен необходимо отправить данные туда а не получить их от туда

    попробуйте следующий пример

    <?php
    $fp = stream_socket_client("tcp://www.example.com:80", $errno, $errstr, 30);
    if (!$fp) {
        echo "$errstr ($errno)<br />\n";
    } else {
        fwrite($fp, "<proto ver="1.0"/>");
        // или так fwrite($fp, "<proto ver="1.0"/>\n");
        while (!feof($fp)) {
            echo fgets($fp, 1024);
        }
        fclose($fp);
    }
    ?>
  • Как ставить между двумя массивами неизвестный математический знак?

    @smple
    alex88a: в каком именно примере?
    если речь о eval то используй {} для переменных
    <?php
    $a['a'] = 5;
    $a['b'] = 6;
    $c = '+';
    
    echo eval("return {$a['a']} $c {$a['b']};");

    на сайте php.net есть документация, книги и обучение вполне неплохие.
  • Как взять с ответа json только одно значение, и вернуть его на страницу?

    @smple
    pw0ned: да точно media_id Надо указать подправлю стартовое сообщение
    echo json_decode($result, true)['media_id'];
  • Как улучшить архитектуру сервиса отложенных задач?

    @smple
    bladeofsteel: сам крон мне очень нравиться, была ситуаций когда делали подобное и потом был race condition и для борьбы с ним в начале создавали файлик pid (что обработка задача уже запущенна)

    Потом переписали на простейщий цикл и хватало с головой.

    Сейчас у нас на node обычный цикл который дергает php код в бесконечном цикле, а демон написанный на node в systemd лежит (supervizord или forever аналогичные штуки можно почитать)
    supervisord.org
    https://github.com/foreverjs/forever
    Это гораздо лучше cron подходит
    Сам по себе крон хорош но не в текущем контексте.
  • Как найти соседние объекты зная x и y?

    @smple
    marenco_victor: 100 000 для компьютера не проблема особенно если язык компилируемый.
    вопрос в том в какое время надо уложиться.
    Лучше всего взять самый очевидный алгоритм и посмотреть какие результаты он выдает, если не устраивает пытаться оптимизировать и тут уже нужны детали.
  • Как улучшить архитектуру сервиса отложенных задач?

    @smple
    bladeofsteel: нету цели убедить.
    Выбирать надо вариант который больше подходит в текущий момент.

    И вам логичней использовать вариант с cron это не хорошо и не плохо это решение, надо у него лишь учитывать race condition (делать файлик когда запущен и не позволять запускать повторную копию).

    Теперь к тому варианту что я предложил:
    1. Принимать задачи может кто угодно и складывать их куда и как удобней, надо лишь послать сигнал процессу что список задач изменен, определять что задача в далеком будущем или сейчас в том месте не логично (не он отвечает за выполнения отложенных задач).
    2. Мы не храним весь список задач в памяти процесса, мы храним ближайшую дат, наступления задачи и id это задачи например (ну или задачу целиком), эта задача вычисляется в момент добавления новой задачи в очередь(он может быть как раньше так и позже).
    3. Про горизонтальное масштабирование, вариант с кроном еще хуже если он запущен на нескольких серверах.

    Я лишь привел другой пример у которого есть несомненно минусы и плюсы.
  • Как улучшить архитектуру сервиса отложенных задач?

    @smple
    bladeofsteel: смысл в том что он один раз получает задачу из очереди и если новая не добавлялась он результат держит у себя(в памяти и повторно не лезет в базу).

    Минус крона в том что он указывается с точностью до минуты.
    Еще существенный минус подхода в cron, что есть race condition и соответсвенно надо делать файлик что процесс запущен чтобы не выполнить случайно дважды одну и туже задачу (теоритически такая штука может быть)