Не правильно работают отложенные сообщения

добрый день. Настроена отправка отложенных сообщений клиенту (через Cron), через две недели после покупки, но ему почему-то отправляется большое количество этих писем http://bit.ly/1Tl2dSz

Подскажите в чем может быть проблема, как исправить?

6 ответов

  • 1
    Vitaliy pp 16 февраля 2016 07:06 #

    вот в истории заказа эти письма http://bit.ly/1Tl4kFX


  • 1
    Эрик Webasyst 18 февраля 2016 08:49 #

    Проверьте логи, возможно в них есть ошибки, поясняющие причины такого поведения. Для просмотра логов используйте бесплатное приложение Логи.

  • 2
    Eugen Nichikov 18 февраля 2016 09:19 #

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


    Скорее всего PHP у вас работает как модуль Апача. С mod_apache проблема следующая.

    1. Движок записывает в wa-cache какие-то данные.

    2. Если это происходит при запуске "из браузера", php запускается от имени www-data

    3. Запуск cli-скриптов происходит от имени вашего пользователя.

    4. Права на файлы и папки устанавливаются без записи для всех кроме конкретного пользователя (755).

    5. Кто первый встал (записал), того и тапки :)


    Так вот к чему это.... При проверке времени последнего запуска скрипта из кэша берётся переменная last_cron_check (или что-то вроде того).

    И тут же записывается назад. В базе значение изменяется, но кэш не сбрасывается, т.к. записан через вебсервер.

    При следующем запуске скрипта переменная опять берётся из кэша (старая).


    Самый простой вариант решения, который я нашёл - перевести PHP в режим CGI.

    Если php работает в режиме CGI, то в п.2 используется тот же пользователь, что и в п.3.


    Есть ещё вариант настройки mod_apache, но я не силён в этом.


    Временно может помочь установка прав на wa-cache в 777 рекурсивно. Но при следующей очистке кэша всё опять сломается.

    • +1
      Vitaliy pp Vitaliy pp 18 февраля 2016 10:19 #
      Так вот к чему это.... При проверке времени последнего запуска скрипта из кэша берётся переменная last_cron_check (или что-то вроде того).

      похоже так и есть

      class shopFollowupCli extends waCliController
      {
          public function execute()
          {
              $fm = new shopFollowupModel();
              $opm = new shopOrderParamsModel();
              $asm = new waAppSettingsModel();
              $cm = new shopCustomerModel();
              $om = new shopOrderModel();
      
              $asm->set('shop', 'last_followup_cli', time());
      
              $view = wa()->getView();
              $empty_customer = $cm->getEmptyRow();
      
              foreach($fm->getAllEnabled() as $f) {
      
                  $between_from = date('Y-m-d', strtotime($f['last_cron_time']) - 24*3600);
                  $between_to = date('Y-m-d 23:59:59', time() - $f['delay'] - 10*3600);
                  $orders = $om->where('paid_date >= ? AND paid_date < ?', $between_from, $between_to)->fetchAll('id');
                  if ($orders) { ...

      а если папке wa-cache поменять права доступа?

    • +1
      Vitaliy pp Vitaliy pp 18 февраля 2016 10:45 #
      Права на файлы и папки устанавливаются без записи для всех кроме конкретного пользователя (755).

      да действительно 755

      drwxr-xr-x    6 500      48           4096 Feb 17 14:20 wa-cache

      спасибо за совет, попробую сделать

  • 1
    Vitaliy pp 18 февраля 2016 09:53 #

    вот нашел в логах такую запись (в файле cli.log)

    Call stack:
    #0 ...
    
    #3 /web/wa-apps/shop/lib/cli/shopFollowup.cli.php(17): waAppSettingsModel->set('shop', 'last_followup_c...', 1453272603)
    #4 /web/wa-system/controller/waController.class.php(21): shopFollowupCli->execute()
    #5 /web/wa-system/waSystem.class.php(634): waController->run()
    #6 /web/wa-system/cli.php(14): waSystem->dispatchCli(Array)
    #7 /web/cli.php(3): require_once('/web...') #8 {main} 2016-01-20 08:50:04: 2016-01-20 08:50:04 php /web/cli.php shop followup Error: Query Error Query: INSERT INTO wa_app_settings (`app_id`, `name`, `value`) VALUES ('shop', 'last_followup_cli', '1453272603') Error: 1062 Message: Duplicate entry 'shop-last_followup_cli' for key 'PRIMARY' with code 1062 in '/web/wa-system/database/waModel.class.php' around line 251: 246 (isset($row['class']) ? $row['class'] : ''). 247 (isset($row['type']) ? $row['type'] : ''). 248 $row['function']."()\n"; 249 } 250 waLog::log($error."\nStack:\n".$stack, 'db.log'); >>251 throw new waDbException($error, $this->adapter->errorCode()); 252 } 253 254 return $result; 255 } 256

    и из файла db.log

    2016-01-20 08:50:04:
    Query Error
    Query: INSERT  INTO wa_app_settings
                       (`app_id`, `name`, `value`) VALUES ('shop', 'last_followup_cli', '1453272603')
    Error: 1062
    Message: Duplicate entry 'shop-last_followup_cli' for key 'PRIMARY'
    Stack:
    0. n/a:n/a
    waModel->run()
    1. n/a:n/a
    waModel->exec()
    2. n/a:n/a
    waModel->insert()
    3. n/a:n/a
    waAppSettingsModel->set()
    4. n/a:n/a
    shopFollowupCli->execute()
    5. n/a:n/a
    waController->run()
    6. n/a:n/a
    waSystem->dispatchCli()
    7. n/a:n/a
    require_once()

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите