Looping скриптов

Для повторного выполнение важных скриптов или процессов, подойдут системные инструменты и простые скрипты, в том числе на PHP. Cron loop

Bash и crontab

Обычно достаточно задействовать возможности bash:

#!/bin/bash 
while [ "true" ]; do 
/path/to/script.php 
sleep 15 
done

# Бесконечный bash-скрипт выполнения нужного PHP скрипта каждые 15 секунд

Делаем то же, но без использования отдельного скрипта bash:

while [ "true" ]; do /path/to/script.php; sleep 15; done

# Повторение скрипта PHP каждые 15 секунд консольной командой

Для этой цели подходит демон cron, который поставляется с UNIX-системами:

# crontab -e
*/5  * * * * /usr/bin/php -f /usr/local/bin/script.php &> /dev/null

# Добавить путь к скрипту в файл конфигурации crontab, выполнять каждые 5 минут, без логирования

Учтите, что желательно предотвращать одновременное выполнение нескольких образцов скрипта. Для этого можно использовать проверку временного файла:

if(file_exists('/tmp/script.lock')){
  exit();
}
file_put_contents('/tmp/script.lock','');


# Здесь выполняется нужный код

unlink('/tmp/script.lock');

# Внутрь можно поместить сам код скрипта или ссылку на выполнение нужного скрипта

И уже созданный новый скрипт помещаете в crontab.

Примечательно, что можно проверять список процессов ОС, чтобы нужная программа не повторялась:

#!/bin/sh
if ps -ef | grep -v grep | grep script.php ; then
        exit 0
else
        /home/user/bin/script.php >> /home/user/bin/script_php.log &
        exit 0
fi

# Проверяет script.php в выполняющихся процессах, запускает, если не выполняется

Полученный скрипт нужно запустить в cron на повторение.

Средствами PHP (pcntl)

Повторное выполнение скриптов возможно доступными средствами PHP. PHP script loop

Пригодится расширение для управления процессами pcntl. Следующий скрипт перезапускается автоматически после выполнения:

<?php
    echo ++$argv[1];     # подсчет перезапусков
    $_ = $_SERVER['_']; 

    echo "\n=Запуск=\n";
    
    # Здесь размещается нужный код для выполнения

    $cnt = 0;
    while( $cnt++ < 10000000 ){}
    echo "\n= Выполнено =\n";

    # Перезапуск скрипта
    pcntl_exec($_, $argv);

# Также можно указать полный путь к скрипту

Такой подход используется для перезапуска скрипта в случае непредвиденного завершения:

<?php
    echo ++$argv[1];    
    $_ = $_SERVER['_']; 

    register_shutdown_function(function () {
        global $_, $argv; # Ссылка на глобальные переменные
        # Перезапуск
        pcntl_exec($_, $argv);
    });

    echo "\n=Запуск=\n";

    # Здесь размещается нужный код для выполнения

    $cnt = 0;
    while( $cnt++ < 10000000 ){}
    echo "\n= Выполнено =\n";

    die;
    
    pcntl_exec($_, $argv);

# В этом случае необходимо правильно завершить выполнение (die)

Еще один вариант автоматического перезапуска скриптов — отлавливание сигналов, описанное в статье об отказоустойчивости в PHP.


Подпишитесь на Хайлоад с помощью Google аккаунта
или закройте эту хрень