ФорумПрограммированиеPHP для идиотов → Кроновый скрипт и "лишние" форки

Кроновый скрипт и "лишние" форки

  • Cheese

    Сообщения: 74 Репутация: N Группа: Кто попало

    Spritz 30 марта 2009 г. 7:07

    По крону стартует скрипт рассылающий письма пользователям (около 7К) отправка писем в скрипту внутри цикла функцией mail. Где-то на второй третьей сотне скрипт выпадает с криком "Can`t fork: allocate memory" и так много раз. У меня две гипотезы:
    1. Либо скрипт форкает столько сендмайлов одновременно что серваку становится плохо
    2. Либо не освобождается память от запущенных сендмейлов.

    Либо 1 и 2 одновременно…

    В связи с этим возникает вопрос как можно по-умному ограничить число запущенных одновременно сендмайлов исходя из доступной в данный момент памяти, вместо того чтобы определять это количество на глаз…?
  • md5

    Сообщения: 11960 Репутация: N Группа: в ухо

    Spritz 30 марта 2009 г. 7:15, спустя 8 минут 35 секунд

    отправляй порциями, а не все сразу
    все умрут, а я изумруд
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 30 марта 2009 г. 7:17, спустя 1 минуту 43 секунды

    порциями, или посмотреть что реально глючит, а именно я думаю что у пхп память течет. ВЕДЬ! кеннот алокейт - все таки к доступной ТВОЕМУ СКРИПТУ памяти относится, а не к системной. за системную не переживай, линух справится с ее управлением см, поверь ;)
    Сапожник без сапог
  • Cheese

    Сообщения: 74 Репутация: N Группа: Кто попало

    Spritz 30 марта 2009 г. 7:20, спустя 3 минуты 17 секунд


    отправляй порциями, а не все сразу

    А как угадать размер порции? З раза отработало с порцией в 200 писем а на 4-й заткнулось на 199-м письме… И как посчитать сколько ждать после порции?

    А насчет памяти пхп - увеличение доступной памяти скрипту видимых изменений не дало…
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 30 марта 2009 г. 7:28, спустя 8 минут 9 секунд

    ну шли по 50-100
    Сапожник без сапог
  • Cheese

    Сообщения: 74 Репутация: N Группа: Кто попало

    Spritz 30 марта 2009 г. 7:33, спустя 4 минуты 46 секунд


    В связи с этим возникает вопрос как можно по-умному ограничить число запущенных одновременно сендмайлов исходя из доступной в данный момент памяти, вместо того чтобы определять это количество на глаз…?



    ну шли по 50-100

    Тоесть только "на глаз"?
  • md5

    Сообщения: 11960 Репутация: N Группа: в ухо

    Spritz 30 марта 2009 г. 7:35, спустя 2 минуты 1 секунду

    а как ты ждешь?
    sleep? :)
    или по крону след. запуск?
    все умрут, а я изумруд
  • Cheese

    Сообщения: 74 Репутация: N Группа: Кто попало

    Spritz 30 марта 2009 г. 7:37, спустя 1 минуту 18 секунд


    а как ты ждешь?
    sleep? :)
    или по крону след. запуск?

    По sleep Мне же надо за один проход скрипта разослаться всем…
  • md5

    Сообщения: 11960 Репутация: N Группа: в ухо

    Spritz 30 марта 2009 г. 8:52, спустя 1 час 15 минут 58 секунд



    а как ты ждешь?
    sleep? :)
    или по крону след. запуск?

    По sleep Мне же надо за один проход скрипта разослаться всем…
    разбивай на несколько заходов
    все умрут, а я изумруд
  • Cheese

    Сообщения: 74 Репутация: N Группа: Кто попало

    Spritz 30 марта 2009 г. 9:34, спустя 41 минуту 12 секунд


    разбивай на несколько заходов

    А смысл? Чтобы каждую часть отдельным скриптом со своей памятью? Я же писал что увеличение памяти для скрипта не дает толку никакого….
  • Givi

    Сообщения: 2284 Репутация: N Группа: Адекваты

    Spritz 30 марта 2009 г. 9:59, спустя 24 минуты 57 секунд

    Cheese, ну как вариант:
    1. Запуск скрипта на отдачу 100 писем. В конце скрипта редирект на этот же скрипт с параметром отправленных писем (например, mylnitsa.php?send_ok=100).
    2. При запуске проверять есть ли данный параметр, и если есть, то отправку делать из списка, начиная с 101-ого адреса. Если параметра нет (вначале его нет), то с начала.

    В таком случае не будет превышен лимит времени на выполнение скрипта, ну и память по идее должна после окончания выполнения скрипта (после редиректа) очиститься.

Пожалуйста, авторизуйтесь, чтобы написать комментарий!