Como criar cron job usando PHP?

100

Eu sou novo no uso do cron job. Eu nem sei como escrever. Tentei pesquisar na internet, mas ainda não entendi bem. Quero criar um cron job que executará meu código a cada minuto. Estou usando PHP para criá-lo. Não está funcionando.

Exemplo

run.php (código que será executado a cada minuto)

<?php

echo "This code will run every minute";

?>

cron.php

<?php

$path = dirname(__FILE__);
$cron = $path . "/run.php";
echo exec("***** php -q ".$cron." &> /dev/null");

?>

Suponha que esses dois arquivos estejam na mesma pasta.

O código que eu fiz está errado? Se estiver errado, por favor, me diga como consertar.

user2738520
fonte
você tem acesso ao shell no servidor?
8
Você não pode simplesmente ecoar *** e esperar que um cronjob seja criado. Leia aqui como criar cronjobs (supondo que você esteja em um servidor executando Linux) thesitewizard.com/general/set-cron-job.shtml
tlenss
@Dagon: eu não sei sobre isso. Vou dar uma olhada.
user2738520
É um evento único, então usecrontab
Ed Heal

Respostas:

66

Esta é a melhor explicação com código em PHP que encontrei até agora:

http://code.tutsplus.com/tutorials/managing-cron-jobs-with-php--net-19428

Em resumo:

Embora a sintaxe de agendamento de um novo trabalho possa parecer assustadora à primeira vista, na verdade é relativamente simples de entender quando você a decompõe. Um cron job sempre terá cinco colunas, cada uma das quais representa um 'operador' cronológico seguido pelo caminho completo e comando para executar:

* * * * * home / path / to / command / the_command.sh

Cada uma das colunas cronológicas tem uma relevância específica para a programação da tarefa. Eles são os seguintes:

Minutes represents the minutes of a given hour, 0-59 respectively.
Hours represents the hours of a given day, 0-23 respectively.
Days represents the days of a given month, 1-31 respectively.
Months represents the months of a given year, 1-12 respectively.
Day of the Week represents the day of the week, Sunday through Saturday, numerically, as 0-6 respectively.

insira a descrição da imagem aqui

Então, por exemplo, se alguém quisesse agendar uma tarefa para as 12h do primeiro dia de cada mês, seria algo assim:

0 0 1 * * home / path / to / command / the_command.sh

Se quiséssemos agendar uma tarefa para ser executada todos os sábados às 8h30, escreveríamos da seguinte maneira:

30 8 * * 6 home / path / to / command / the_command.sh

Existem também vários operadores que podem ser usados ​​para personalizar ainda mais a programação:

Commas is used to create a comma separated list of values for any of the cron columns.
Dashes is used to specify a range of values.
Asterisksis used to specify 'all' or 'every' value

Visite o link para o artigo completo, ele explica:

  1. Qual é o formato do cronjob se você deseja inseri-lo / editá-lo manualmente.
  2. Como usar o PHP com a biblioteca SSH2 para se autenticar como usuário, que crontab você vai editar.
  3. Classe PHP completa com todos os métodos necessários para autenticação, edição e exclusão de entradas crontab.
Nikolay Ivanov
fonte
34

Da mesma forma que você está tentando executar cron.php, você pode executar outro script PHP. Você terá que fazer isso por meio da interface CLI.

#!/usr/bin/env php
<?php
# This file would be say, '/usr/local/bin/run.php'
// code
echo "this was run from CRON";

Em seguida, adicione uma entrada ao crontab:

* * * * * /usr/bin/php -f /usr/local/bin/run.php &> /dev/null

Se o script run.php tivesse permissões executáveis, ele poderia ser listado diretamente no crontab, sem a parte / usr / bin / php também. A parte 'env php', no script, encontrará o programa apropriado para realmente executar o código PHP. Portanto, para a versão 'executável' - adicione permissão executável ao arquivo:

chmod +x /usr/local/bin/run.php

e, em seguida, adicione a seguinte entrada no crontab:

* * * * * /usr/local/bin/run.php &> /dev/null
Alister Bulman
fonte
11

Adicionado ao Alister, você pode editar o crontab normalmente (nem sempre é o caso) inserindo crontab -e em uma sessão ssh no servidor.

As estrelas representam (* significa cada uma desta unidade):

[Minute] [Hour] [Day] [Month] [Day of week (0 =sunday to 6 =saturday)] [Command]

Você pode ler mais sobre isso aqui .

Big Ginger Nerd
fonte
2

Digite o seguinte no terminal linux / ubuntu

 crontab -e 

selecione um editor (às vezes pede o editor) e este deve ser executado a cada minuto

*       *       *       *       *       /usr/bin/php path/to/cron.php &> /dev/null
madhu131313
fonte
1

Isso pode depender do seu host se você não estiver hospedando seu próprio conteúdo. Se o seu host oferecer suporte à criação de tarefas cronológicas, ele pode ter um formulário para você preencher que permite selecionar a frequência e inserir o caminho absoluto para o arquivo a ser executado. Por exemplo, meu host (DreamHost) me permite criar cron jobs personalizados digitando o caminho absoluto para o arquivo e selecionando a frequência em um menu de seleção. Isso pode não ser possível para o seu servidor; nesse caso, você precisa editar o crontab diretamente ou por meio do método específico do seu host.

Como Alister Bulman detalha acima, crie um arquivo PHP para ser executado usando CLI (certificando-se de incluir #!/usr/bin/env phpno início do arquivo antes da <?phptag. Isso garante que o shell saiba qual executável deve ser invocado ao executar o script.

Acharris
fonte
0

por que você não usa curl? logicamente, se você executar um arquivo php, você o executará por url no seu navegador. é muito simples se você executar curl

while(true)
{
    sleep(60); // sleep for 60 sec = 1 minute

    $s = curl_init();
    curl_setopt($s,CURLOPT_URL, $your_php_url_to_cron); 
    curl_exec($s); 
    curl_getinfo($s,CURLINFO_HTTP_CODE); 
    curl_close($s);
}
Ecko Santoso
fonte
5
Isso funcionaria em teoria, mas o script php teria que ser executado o tempo todo, o que não é uma coisa boa.
bestprogrammerintheworld
1
Você tem que definir php-max-execution-time como 0 para executar isso para sempre. Além disso, se ocorrer algum erro em seu script, ele não será executado novamente até que você reinicie manualmente.
Hassan Raza
0

$command = "php ".CRON_PATH.php ";
if(substr(php_uname(), 0, 7) == "Windows"){
pclose(popen("start /B ". $command, "r"));
}else{
shell_exec($command ." > /dev/null &");
}

shubhi agrawal
fonte
6
Por mais que esteja interessado em seus códigos, você pode explicar?
Precioso Tom
0

Primeiro abra seu servidor SSH com nome de usuário e senha e mude para o usuário root padrão (usuário com todas as permissões) e siga as etapas abaixo,

  1. digite o comando crontab -l agora você verá a lista de todos os cronjobs.
  2. entrar crontab -e um arquivo com todos os trabalhos do cron serão abertos.
  3. Edite o arquivo com sua programação de cronjob como min hr dayofmonth month dayofweek pathtocronjobfile e salve o arquivo.
  4. Agora você verá uma resposta, crontab: installing new crontabverifique novamente a lista de cronjobs que seu cron job estará listado lá.
Gokulpriya
fonte
0

Melhor usar o projeto Cron em combinação com o cronjob do Linux para esta tarefa. Ele permite que você configure tempos de execução em seu código PHP, oferece suporte a trabalhos em segundo plano e é fácil de usar.

A primeira etapa chama um script PHP a cada minuto:

* * * * * /usr/local/bin/run.php &> /dev/null

A segunda etapa usa o pacote cron / cron para configurar os tempos de execução diretamente no PHP.

$deprecatedStatus = new ShellJob();
$deprecatedStatus->setCommand('cd /app && /usr/local/bin/php cron/updateDeprecatedStatus.php');
$deprecatedStatus->setSchedule(new CrontabSchedule('* * * * */2'));


$displayDate = new ShellJob();
$displayDate->setCommand('cd /app && /usr/local/bin/php cron/updateDisplayDate.php');
$displayDate->setSchedule(new CrontabSchedule('* * * * */5'));

Você encontrou os detalhes de como usar no repositório vinculado.

Thomas Eimers
fonte
-1

Crie um cronjob como este para funcionar a cada minuto

*       *       *       *       *       /usr/bin/php path/to/cron.php &> /dev/null
rams0610
fonte
4
Acho que estamos procurando soluções para criar cronjob usando php e não usando nenhum terminal ou cpanel. Eu também quero encontrar essas soluções usando apenas php.
user3264863
-1

Há uma maneira simples de resolver isso: você pode executar o arquivo php pelo cron a cada 1 minuto, e dentro do arquivo executável php fazer a instrução "if" para executar quando "agora" como este

<?/** suppose we have 1 hour and 1 minute inteval 01:01 */

$interval_source = "01:01";
$time_now = strtotime( "now" ) / 60;
$interval = substr($interval_source,0,2) * 60 + substr($interval_source,3,2);


if( $time_now % $interval == 0){
/** do cronjob */
}
maxkuku
fonte
4
Isso só funcionará se você carregar a página, basicamente, essa não é uma solução!
MD. Atiqur Rahman
E se eu fechar o navegador? Isso falha!
Resheil Agarwal
-2
function _cron_exe($schedules) {
        if ($obj->get_option('cronenabledisable') == "yes") {
            // $interval = 1*20;
            $interval = $obj->get_option('cronhowtime');
            if ($obj->get_option('crontiming') == 'minutes') {
                $interval = $interval * 60;
            } else if ($obj->get_option('crontiming') == 'hours') {
                $interval = $interval * 3600;
            } else if ($obj->get_option('crontiming') == 'days') {
                $interval = $interval * 86400;
            }
            $schedules['hourlys'] = array(
                'interval' => $interval,
                'display' => 'cronjob'
            );
            return $schedules;
        }

}
Ranjith
fonte