0

У меня есть пять рабочих beanstalk, написанных на PHP, каждый из них наблюдает за определенной трубкой и обрабатывает данные, в основном отправляя электронные письма, электронные письма электронной почты, электронные письма с электронными письмами и подписью, каждый рабочий разговаривает с базой данных и получение некоторых данных перед отправкой электронных писем.Рабочие рабочие beanstalk висят на сервере

Я попытался запустить рабочих, используя «Экран» и «crontab», и сейчас я пытаюсь «супервизор», но независимо от того, что я использую, сервер зависает, и он дает мне «ошибку распределения памяти», поэтому мне нужно перезагружайте сервер каждый раз, мой локальный сервер занимает 8 ГБ памяти, что я должен учитывать при запуске рабочих, например, в памяти процессора, может ли кто-нибудь указать мне, где искать?

здесь рабочий образец для отправки сообщений электронных писем

public function actionMessages() { 
    $pheanstalk = new Pheanstalk("127.0.0.1"); 

    while (true) { 
     // worker (performs jobs) 
     $job = $pheanstalk 
       ->watch('MessageEmail') 
       ->ignore('default') 
       ->reserve(); 

     $jobData = json_decode($job->getData(), true); 

     $usersObj = new Users(); 
     $circlesObj = new Circles(); 
     $messageId = NULL; 
     $listUsers = []; 


     $finalDataArray = []; 
     $finalDataUsersArray = []; 
     foreach ($jobData['circlesIds'] as $circle) { 
      // get users in lists 

      foreach ($jobData['lists'] as $list) { 
       $listsObj = new Lists(); 
       $listUsers = $listsObj->getListInfoWithOutsiders($list); 
      } 

      $circleInfo = $circlesObj->getBasicInfoById($circle); 

      if (sizeof($listUsers) > 0) { 

       // send emails to the list 
       foreach ($listUsers as $userInListId) { 
        // check if the user is circlu or outsider 
        if ($userInListId['outsider']) { 
         $circlesProfilesObj = new CirclesMembersManagement(); 
         $userInfo = $circlesProfilesObj->getMemberEmailById($userInListId['user_id']); 


         $finalDataArray[] = ['circle' => $circleInfo, 'email' => $userInfo['email'], 
          'post' => ['html' => $jobData['messageText'], 'date' => $jobData['postDate']]]; 

         // send email 
        } else { 
         $userInfo = $usersObj->getUserEmailById($userInListId['user_id']); 

         // insert the main message 
         $messages = new Messages(); 
         $messageId = $messages->addCircleMessage($jobData['messageText'], $userInListId['user_id'], $circleInfo['id']); 

         $finalDataArray[] = ['circle' => $circleInfo, 'email' => $userInfo['email'], 
          'post' => ['html' => $jobData['messageText'], 'date' => $jobData['postDate']]]; 
        } 
       } 

       EmailHelper::sendMessageEmail($finalDataArray); 
      } 

      // send messages to the the users 
      if (sizeof($jobData['users']) > 0) { 

       foreach ($jobData['users'] as $userId) { 

        // insert the main message 
        if ($messageId) { 
         // send direct message 
         $userMessagesObj = new UserMessages(); 
         $userMessagesObj->sendCircleMessage($circleInfo['id'], $userId, $messageId); 
        } else { 
         $messages = new Messages(); 
         $messages->addCircleMessage($jobData['messageText'], $userId, $circleInfo['id']); 
        } 

        $userInfo = $usersObj->getUserEmailById($userId); 

        $finalDataUsersArray[] = ['circle' => $circleInfo, 'email' => $userInfo['email'], 
         'post' => ['html' => $jobData['messageText'], 'date' => $jobData['postDate']]]; 

        // send email 
       } 
       EmailHelper::sendMessageEmail($finalDataUsersArray); 
      } 
     } 

     $pheanstalk->delete($job); 
    } 
} 

Заранее спасибо

+0

Кажется, проблема с PHP-кодом, а не с планировщиком заданий, который вы используете для его запуска. Вероятно, вы должны добавить к своему сообщению php-код, если это возможно. –

+0

Хорошо, я добавлю пример рабочего –

+0

PHP будет для кого-то другого, чтобы проверить, потому что я не эксперт по PHP. Сказав это, кажется, что есть какое-то время (правда) без перерыва/выхода. Разве это не будет выполняться бесконечно? –

ответ

1

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

В противном случае приемлемой техникой является остановка и перезагрузка рабочего один раз после партии рабочих или времени. Например: после того, как каждое сообщение 10k перезапустит рабочего или каждые 24 часа перезагрузите рабочего. Это закроет обработчиков, освободит память и начнет свежий. Как достичь этого - еще одна интересная тема, ее можно было бы управлять самостоятельно, как выход. Затем супервизор перезапустил его.

Лучшим было бы разместить все это в потоках. И каждая работа будет обрабатываться в ее собственном потоке потомков, вот как мы запускаем рабочих сейчас в PHP, и мы запускаем это так, чтобы избежать утечки памяти и обработчиков.

Также хорошо настроить брокера или ochestrator, который может быть простым PHP-скриптом, который работает вечно, начинается с загрузки, и его задача - запустить и каждую минуту проверять статус ваших работников с помощью сценария процесса, и найти, если они умерли и возобновились. Логика - ваша, вы контролируете, как вы хотите справиться с этим, но сохраняйте ее просто. Этот скрипт брокера может работать вечно из CLI и не должен иметь утечки памяти.

Смежные вопросы