Comment créer un travail cron en utilisant PHP?

100

Je suis nouveau dans l'utilisation du travail cron. Je ne sais même pas comment l'écrire. J'ai essayé de rechercher sur Internet, mais je ne comprends toujours pas bien. Je veux créer un travail cron qui exécutera mon code toutes les minutes. J'utilise PHP pour le créer. Ça ne marche pas.

Exemple

run.php (Code qui sera exécuté toutes les minutes)

<?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");

?>

Supposons que ces deux fichiers se trouvent dans le même dossier.

Le code que j'ai fait est-il erroné? En cas de problème, veuillez me dire comment le réparer.

user2738520
la source
avez-vous un accès shell sur le serveur?
8
Vous ne pouvez pas simplement faire écho *** et vous attendre à ce qu'un cronjob soit créé. Lisez ici comment créer des cronjobs (en supposant que vous soyez sur un serveur exécutant Linux) thesitewizard.com/general/set-cron-job.shtml
tlenss
@Dagon: je ne sais pas à ce sujet. Je vérifierai.
user2738520
Il s'agit d'un événement unique, alors utilisez-lecrontab
Ed Heal

Réponses:

66

C'est la meilleure explication avec le code en PHP que j'ai trouvée jusqu'à présent:

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

En bref:

Bien que la syntaxe de la planification d'un nouveau travail puisse sembler décourageante à première vue, elle est en fait relativement simple à comprendre une fois que vous la décomposez. Une tâche cron aura toujours cinq colonnes dont chacune représente un 'opérateur' chronologique suivi du chemin complet et de la commande à exécuter:

* * * * * home / chemin / vers / commande / the_command.sh

Chacune des colonnes chronologiques a une pertinence spécifique par rapport au calendrier de la tâche. Ils sont les suivants:

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.

entrez la description de l'image ici

Ainsi, par exemple, si l'on voulait planifier une tâche à 12h le premier jour de chaque mois, cela ressemblerait à ceci:

0 0 1 * * home / chemin / vers / commande / the_command.sh

Si nous voulions planifier une tâche à exécuter tous les samedis à 8h30, nous l'écririons comme suit:

30 8 * * 6 home / chemin / vers / commande / the_command.sh

Il existe également un certain nombre d'opérateurs qui peuvent être utilisés pour personnaliser encore plus le calendrier:

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

Visitez le lien pour l'article complet, il explique:

  1. Quel est le format du cronjob si vous souhaitez le saisir / le modifier manuellement.
  2. Comment utiliser PHP avec la bibliothèque SSH2 pour s'authentifier en tant qu'utilisateur, quelle crontab vous allez modifier.
  3. Classe PHP complète avec toutes les méthodes nécessaires pour l'authentification, l'édition et la suppression des entrées crontab.
Nikolay Ivanov
la source
34

De la même manière que vous essayez d'exécuter cron.php, vous pouvez exécuter un autre script PHP. Vous devrez cependant le faire via l'interface CLI.

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

Ensuite, ajoutez une entrée à la crontab:

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

Si le script run.php avait des autorisations exécutables, il pourrait être répertorié directement dans le crontab, sans la partie / usr / bin / php également. La partie 'env php', dans le script, trouverait le programme approprié pour exécuter réellement le code PHP. Donc, pour la version 'exécutable' - ajoutez l'autorisation exécutable au fichier:

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

puis, ajoutez l'entrée suivante dans crontab:

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

Ajouté à Alister, vous pouvez généralement éditer la crontab (pas toujours le cas) en entrant crontab -e dans une session ssh sur le serveur.

Les étoiles représentent (* signifie chacune de ces unités):

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

Vous pouvez en savoir plus ici .

Gros nerd au gingembre
la source
2

Tapez ce qui suit dans le terminal linux / ubuntu

 crontab -e 

sélectionnez un éditeur (parfois il demande l'éditeur) et celui-ci s'exécute toutes les minutes

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

Cela peut dépendre de votre hébergeur si vous n'hébergez pas votre propre contenu. Si votre hébergeur prend en charge la création de tâches chronologiques, il peut avoir un formulaire à remplir qui vous permet de sélectionner la fréquence et de saisir le chemin absolu du fichier à exécuter. Par exemple, mon hébergeur (DreamHost) me permet de créer des tâches cron personnalisées en tapant le chemin absolu du fichier et en sélectionnant la fréquence dans un menu de sélection. Cela peut ne pas être possible pour votre serveur, auquel cas vous devez éditer la crontab directement ou via la méthode spécifique à votre hôte.

Comme le détaille Alister Bulman ci-dessus, créez un fichier PHP à exécuter en utilisant CLI (en veillant à inclure #!/usr/bin/env phpau tout début du fichier avant la <?phpbalise. Cela garantit que le shell sait quel exécutable doit être appelé lors de l'exécution du script.

acharris
la source
0

pourquoi n'utilisez-vous pas curl? logiquement, si vous exécutez un fichier php, vous l'exécuterez par url sur votre navigateur. c'est très simple si vous exécutez 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
la source
5
Cela fonctionnerait en théorie mais le script php devrait fonctionner tout le temps, ce qui n'est pas une bonne chose.
bestprogrammerintheworld
1
Vous devez définir php-max-execution-time sur 0 pour l'exécuter pour toujours. De plus, si une erreur se produit dans votre script, il ne s'exécutera pas tant que vous ne le redémarrerez pas manuellement.
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
la source
6
Autant que je m'intéresse beaucoup à vos codes, pouvez-vous expliquer?
Precious Tom
0

Ouvrez d'abord votre serveur SSH avec nom d'utilisateur et mot de passe et passez à l'utilisateur root par défaut (utilisateur avec toutes les autorisations), puis suivez les étapes ci-dessous,

  1. entrez la commande crontab -lmaintenant, vous verrez la liste de tous les cronjobs.
  2. entrez crontab -eun fichier avec tous les travaux cron seront ouverts.
  3. Modifiez le fichier avec votre calendrier de tâches cron min hr dayofmonth month dayofweek pathtocronjobfileet enregistrez le fichier.
  4. Maintenant, vous verrez une réponse crontab: installing new crontab, vérifiez à nouveau la liste des tâches cron que votre tâche cron y sera répertoriée.
Gokulpriya
la source
0

Mieux vaut utiliser le projet Cron en combinaison avec le cronjob Linux pour cette tâche. Il vous permet de configurer les temps d'exécution dans votre code PHP, prend en charge les tâches en arrière-plan et est facile à utiliser.

Première étape, appelez un script PHP toutes les minutes:

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

Deuxième étape, utilisez le package cron / cron pour configurer les temps d'exécution directement en 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'));

Vous avez trouvé les détails de l'utilisation dans le référentiel lié.

Thomas Eimers
la source
-1

Créez un cronjob comme celui-ci pour travailler à chaque minute

*       *       *       *       *       /usr/bin/php path/to/cron.php &> /dev/null
béliers0610
la source
4
Je pense que nous cherchons des solutions pour créer cronjob en utilisant php et en n'utilisant aucun terminal ou cpanel. Je souhaite également trouver ces solutions en utilisant uniquement php.
user3264863
-1

Il y a un moyen simple de résoudre ceci: vous pouvez exécuter le fichier php par cron toutes les 1 minute, et à l'intérieur du fichier exécutable php, faites une instruction "if" à exécuter quand le temps "maintenant" comme ceci

<?/** 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
la source
4
Cela ne fonctionnera que si vous chargez la page, ce n'est fondamentalement pas une solution!
MD. Atiqur Rahman
Et si je ferme le navigateur? Cela échoue!
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
la source