Максимальный UpTime PHP скрипта

Discussion in 'PHP' started by НTL, 5 Feb 2012.

  1. НTL

    НTL Elder - Старейшина

    Joined:
    26 Jan 2008
    Messages:
    715
    Likes Received:
    205
    Reputations:
    -26
    Есть PHP скрипт который в цикле выполнят функцию (Время выполнение функции 1-60сек)
    Как обеспечить максимальный UpTime данному скрипту?

    Одна из моих идей:
    1) Поставить крон на каждую минуту
    2) Из скрипта раз в 30-60 сек записывать контрольную точку в memcached/mysql/в файл
    3) При каждом из запуске проверять контрольную точку, если она устарела более чем на 2-5мин, запускать скрипт
     
  2. waik

    waik Elder - Старейшина

    Joined:
    2 Nov 2008
    Messages:
    405
    Likes Received:
    163
    Reputations:
    12
    по мне дак Cron/
     
  3. -SX-

    -SX- Elder - Старейшина

    Joined:
    4 Oct 2004
    Messages:
    92
    Likes Received:
    8
    Reputations:
    5
    В плане uptime? uptime это непрерывная работа чего-то... У тебя скрипт не является демоном.

    Зачем 3-тий пункт? Ты себе жизнь усложняешь.

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

    Во время работы скрипта, можно сделать так, чтобы скрипт создавал pid файл для предотвращения запуска скрипта одновременно двух и больше раз.


    Как вариант можно скрипт переделать под демона и научить сигналам . Тогда его с кронтаба вообще не нужно вызывать.
     
  4. НTL

    НTL Elder - Старейшина

    Joined:
    26 Jan 2008
    Messages:
    715
    Likes Received:
    205
    Reputations:
    -26
    С демоном очень интересно. Есть какие нибудь просты способы реализовать? Передавать сигналы не нужно. Скрипт примерно такой:
    PHP:
    while(1){
    $Temp f(); //Параметров нету
    if($Temp == 0){sleep(5);}
    }
     
  5. -SX-

    -SX- Elder - Старейшина

    Joined:
    4 Oct 2004
    Messages:
    92
    Likes Received:
    8
    Reputations:
    5
    Что-то вроде такого:

    PHP:
    <?php

    $child_pid 
    pcntl_fork();

    if( 
    $child_pid ) exit;  

    posix_setsid();

    while(
    1)
    {
     
    $Temp f(); 

     if(
    $Temp == 0sleep(5);
    }

    ?>

    Если есть на руках консоль и лень править код, как вариант еще можно заюзать программу screen и запустить скрипт с бесконечным циклом непосредственно внутри screen. Неплохой вариант.


    Если все же интересна демонизация родными средствами интерпретатора PHP, советую почитать вот эти статьи:
    _habrahabr.ru/blogs/php/134620/
    _habrahabr.ru/blogs/php/40432/
     
  6. НTL

    НTL Elder - Старейшина

    Joined:
    26 Jan 2008
    Messages:
    715
    Likes Received:
    205
    Reputations:
    -26
    Прочитал, подумал, немного практики. И примерно такой вариант:
    1) Cron каждую минуту который запускает демона
    2) Запись и проверка PID сдерживают повторный запуск

    Я правильно понимаю?
     
  7. -SX-

    -SX- Elder - Старейшина

    Joined:
    4 Oct 2004
    Messages:
    92
    Likes Received:
    8
    Reputations:
    5
    Не понял тебя.

    Если скрипт писать/переписывать под демон, никакого cron'а ненужно.
    Один раз запускаем типа так:
    Code:
    php myscript.php start
    скрипт форкается и все. Консоль свободна, а скрипт висит в процессах как и любой другой демон.

    crontab нужен только в тех случаях, если скрипт после того как отработал закрывается.

    Не обязательно, но в случае если скрипт из кронтаба вызывается, то да, это основная идея.

    У меня была такая ситуация.... запускается скрипт и начинает работать. За 1-3 минуты он должен завершать свою работу, но в один прекрасный солнечный день, из-за большого потока данных он проработал около 6 минут. В кронтабе скрипт вызывается каждую 5-тую минуту, и получается такая ситуация:
    Вызывается этот скрипт во время того, как первый экземпляр скрипта еще работает.
     
  8. НTL

    НTL Elder - Старейшина

    Joined:
    26 Jan 2008
    Messages:
    715
    Likes Received:
    205
    Reputations:
    -26
    Сlodo.ru сделает системный reboot и скрипт уже не работает, а я тихо сплю и не подозреваю об этом. Поэтому решил подстраховаться и запускать его каждую минуту.

    Интересную вещь заметил:
    1) Запускаю скрипт из консоли
    2) Скрипт отвязывается и начинает работать
    3) Ошибки которые возникают в процессе выполнения (Например Time Out) падают в консоль.

    Так должно быть?
     
  9. -SX-

    -SX- Elder - Старейшина

    Joined:
    4 Oct 2004
    Messages:
    92
    Likes Received:
    8
    Reputations:
    5
    В этих случаях демоны вносятся в автозагрузку init.d дистрибутива.

    Зависит от настройки интерпретатор PHP.
     
  10. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,170
    Likes Received:
    1,155
    Reputations:
    202
    перенаправьте вывод stdout stderr в /dev/null (2>&1)
     
  11. rrforum

    rrforum New Member

    Joined:
    23 Dec 2011
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    set_time_limit(0);
     
  12. НTL

    НTL Elder - Старейшина

    Joined:
    26 Jan 2008
    Messages:
    715
    Likes Received:
    205
    Reputations:
    -26
    Я имел ввиду timeout от например file_get_contents();
     
  13. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,170
    Likes Received:
    1,155
    Reputations:
    202
    Не понял что нужно, задать таймоут или подавить ошибку? Если подавить ошибку то через собачку.

    Code:
    @file_get_contents("http://example.com/", 0, $ctx); 
    PHP:
    <?php 
     $ctx 
    stream_context_create(array( 
         
    'http' => array( 
             
    'timeout' => 10 
             

         ) 
     ); 
    file_get_contents("http://example.com/"0$ctx); 
    ?>
     
  14. НTL

    НTL Elder - Старейшина

    Joined:
    26 Jan 2008
    Messages:
    715
    Likes Received:
    205
    Reputations:
    -26
    Нужно было избавится от вывода сообщений/ошибок в консоль после создание демона и отвязки от консоли, STDOUT и STDERR помоги решить эту проблему