За последние 24 часа нас посетили 22290 программистов и 1123 робота. Сейчас ищут 653 программиста ...

Выполнение скрипта без Cron

Тема в разделе "Прочие вопросы по PHP", создана пользователем GLF280, 25 окт 2018.

  1. GLF280

    GLF280 Новичок

    С нами с:
    24 окт 2018
    Сообщения:
    2
    Симпатии:
    0
    Нужно было найти альтернативу Cron когда он не доступен на хостинге для фонового выполнения php скрипта нужное кол-во раз за заданное время.
    Почему это не работает ? Если кому охота разбираться подскажите пожалуйтса


    PHP:
    1. <?php
    2.  
    3. session_start();  // Старт сессии
    4. $num_starts = 960; // Количество запусков скрипта за промежуток времени
    5. $hours = 8; // Количество часов, в течение которых нужно запускать скрипт $num_starts раз.
    6. $time_sec = $hours*3600; // Количество секунд в цикле запусков
    7. $time_to_start = array(); // Собственно, массив с временами запусков
    8. ignore_user_abort(1);   // Игнорировать обрыв связи с браузером
    9.  
    10.  
    11. //Генерируем интервал между запусками.
    12.  
    13. function add_time2start() {
    14.     global $time_sec, $time_to_start;
    15.     $new_time = time()+rand(0, $time_sec);
    16.     if (!in_array($new_time, $time_to_start)) {   // Если такого времени в массиве нет - добавим
    17.         $time_to_start[] = $new_time;
    18.     } else {
    19.         add_time2start(); // Если такое время уже есть - генерируем заново.
    20.     }
    21. }
    22.  
    23.  
    24. //массив времен запуска
    25.  
    26. $k = 1;
    27. if ($_SESSION["num_st"] == "" || $_SESSION["num_st"][$num_starts-1] < time()) {   // проверка, что в сессию не записаны данные и что эти данные не устарели.
    28.     do {
    29.         add_time2start($k);                                      
    30.         $k++;
    31.     } while ($k < = $num_starts);
    32.     sort($time_to_start, SORT_NUMERIC);      
    33.     $_SESSION["num_st"] = $time_to_start;
    34. }
    35.  
    36.  
    37. $start_time = microtime(); // Узнаем время запуска скрипта  
    38. $start_array = explode(" ",$start_time); // Разделяем секунды и миллисекунды
    39. $start_time = $start_array[1]; // получаем стартовое время скрипта
    40. $max_exec = ini_get("max_execution_time"); //Получаем максимально возможное время работы скрипта
    41.  
    42.  
    43. do{
    44.     $nowtime = time();  // Текущее время
    45.     //// Если текущее время есть в массиве с временами выполнения скрипта......
    46.     if (in_array($nowtime, $_SESSION["num_st"])) {
    47.         // Сокетом цепляемся к файлу с основным содержанием действий
    48.         $http = fsockopen('test.ru',80);
    49.         /// заодно передаем ему данные сессии и время когда он должен сработать
    50.         fputs($http, "GET http://test.ru/exec.php?".session_name()."=".session_id()."&nowtime=$nowtime HTTP/1.0\r\n");
    51.         fputs($http, "Host: test.ru\r\n");
    52.         fputs($http, "\r\n");
    53.         fclose($http);
    54.     } //// выполнили заданное действие
    55.     // Узнаем текущее время чтобы проверить, дальше ли вести цикл или перезапустить
    56.         $now_time = microtime();
    57.         $now_array = explode(" ",$now_time);
    58.         $now_time = $now_array[1];
    59.         // вычитаем из текущего времени начальное начальное
    60.         $exec_time = $now_time - $start_time+$exec_time;
    61.         /// тормозимся на секунду
    62.         usleep(1000000);
    63.         //Остановка скрипта, работающего в фоновом режиме. Я другого способа не придумал.
    64.         if (file_exists("stop.txt")) exit;
    65.         //Проверяем время работы, если до конца работы скрипта
    66.         //осталось менее 5 секунд, завершаем работу цикла.
    67. } while($exec_time < ($max_exec - 5));
    68.  
    69.  
    70. // Запускаем этот же скрипт новым процессом и завершаем работу текущего
    71. $http = fsockopen('test.ru',80);
    72. fputs($http, "GET http://test.ru/index.php?".session_name()."=".session_id()."&bu=$max_exec HTTP/1.0\r\n");
    73. fputs($http, "Host: test.ru\r\n");
    74. fputs($http, "\r\n");
    75. fclose($http);
    76.  
    77.  
    78. ?>
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    Веб скрипт имеет максимальную продолжительность жизни, по умолчанию 30 сек. Потом просто сдохнет.
    На локалке или vps ты можешь установить свой лимит или вообще его отменитт , но там нет смысла в подобном скрипте, т.к. доступен полноценный Cron. На шареде ты не сможешь установить свой лимит. И поэтому скрипт сдохнет.

    Короче, если ты владелец сайта, ищи возможность запрограммировать расписание "легальными" средствами. Как правило в панели хостера есть какой-то интерфейс к крону. Если нет - ищи другой хостинг.
     
    #2 artoodetoo, 25 окт 2018
    Последнее редактирование: 25 окт 2018
  3. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510