Многие задаются вопросом - как сделать так, что бы скрипт после завершения работы выполнялся снова и так по кругу и до бесконечности. Причём без необходимости держать открытой вкладку браузера - запустил и он там на сервере тихо себе вертится в loop'е, так сказать, задача - сделать "залупленный" скрипт.
Давайте разбираться.
Итак, у нас есть обычный говёный хостинг за 100 рублей без доступа к всяким новомодным SSH, Bash и прочей ВПСной приблуде. Иначе мы бы могли не ебаться в телевизор и сделать всё на демонах, ибо статей под это дохрена (
полутык).
Мы понимаем, что наш любимый обычный цикличный while сдохнет через 30 секунд, поэтому нужно что-то намудрить.
На ум приходит
способ 1:
Заставить скрипт выполняться 59 секунд и дёргать его каждую минуту кроном. За эти 59 секунд в while-цикле будет делаться то, что нам нужно. Пример:
<?php
ini_set('max_execution_time', '59');
set_time_limit(59);
ignore_user_abort(true);
$zbs = 'crabs';
while ($zbs == 'crabs') {
//что-то делаем
}
Такой себе вариант, да и время лучше поставить секунд на 57. Да и на многих говнохостах нельзя изменить лимиты времени выполнения.
Тогда думаем
второй способ:
В умный ум приходит мысль - в конце скрипта вызывать его самого же через wget. Вот пример кода:
<?php
//тут что-то делаем
exec("wget --delete-after http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']." > /dev/null 2>&1 &"); exit;
Казалось бы, идеально, но хрен, скрипт перестаёт крутить сам себя через минуты 3. Без параметра
--delete-after всё отлично работает, скрипт запускает себя конкретно и чётко пока не отключите сайт, чтобы он не смог себя запустить в очередной раз. Но есть одно "но", а именно куча говёных копий исполняемого файла с точками и цифрами в конце, ну и весом в 0 байт. Ибо вгет просто скачивает, например, тот же index.php и у вас в папке будет валяться миллион копий по типу: index.php.2929, index.php.2930 - вы их заебётесь удалять, однако метод рабочий.
Можно конечно в конце нашего скрипта написать код, который удаляет ссаные копии по маске - хорошая идея. Вот конечный код:
<?php
//тут что-то делаем
$path = 'index.php.*';
foreach (glob($path) as $file){
@unlink($file);
}
exec("wget http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']." > /dev/null 2>&1 &"); exit;
Итак, всё работает, но опишем ещё
способ 3:
Это сокеты. Полный пример
тут. Так же полно екзампелов в интернетах. Но мне этот метод не подошёл, так как совсем нихрена никоим образом не хотел работать.
И
способ 4:
Суть - ставим на крон задание на каждые 10 сек. Да, так можно, через
wget; sleep 10; wget; sleep 10; - тоесть вгет запрос, точка с запятой, опять вгет запрос и так по кругу. При начале выполнения скрипта создаём файл
crabs.lock, в конце выполнения удаляем. Так же при запуске скрипта проверяем, существует ли
crabs.lock и если есть, значит скрипт ещё выполняется в другом экземпляре и делаем сразу die;. Соответственно, что если лока нет, то создаём лок, выполняем скрипт и удаляем лок. Конечный код:
<?php
if (file_exists('crabs.lock')) die();
file_put_contents('crabs.lock', 'LOCKED');
//тут что-то делаем
unlink('crabs.lock');
?>
Код крона (в одно задание, все звёздочки, чтобы выполнялся раз в минуту, всё в одну строку, просто для удобства чтения перенёс построчно):
/usr/bin/wget -O /dev/null "https://crabs.money/index.php"; sleep 10;
/usr/bin/wget -O /dev/null "https://crabs.money/index.php"; sleep 10;
/usr/bin/wget -O /dev/null "https://crabs.money/index.php"; sleep 10;
/usr/bin/wget -O /dev/null "https://crabs.money/index.php"; sleep 10;
/usr/bin/wget -O /dev/null "https://crabs.money/index.php"; sleep 10;
/usr/bin/wget -O /dev/null "https://crabs.money/index.php";
Плюсом создаём файл чекинга старого лока, чтобы он его удалил, если где-то скрипт завис и не удалил за собой лок. И этот файл на крон
ежеминутно. Код crabs_checkdate.php:
<?php
if (!file_exists('crabs.lock')) die();
$filedate = filectime('crabs.lock')+30;
if ($filedate<time()) { unlink('crabs.lock'); exit; }
Итог: способ 1 - костыль, способ 2 - может вылететь сам по себе через 5 минут либо час (хуй угадаешь когда) и ничего не будет крутиться, способ 3 - нерабочее говно, способ 4 - пиздатая тема с лок-файлом.
Не забываем про:
Канал в Телеграм:
@crabs_channel
Канал магазина:
@crabs_money_shop
Чат в Телеграм:
@crabsmoney
Группа для реклам:
@crabs_ads