Bagaimana cara membuat pekerjaan cron menggunakan PHP?

100

Saya baru menggunakan cron job. Saya bahkan tidak tahu bagaimana menulisnya. Saya sudah mencoba mencari dari internet, tetapi saya masih belum memahaminya dengan baik. Saya ingin membuat tugas cron yang akan mengeksekusi kode saya setiap menit. Saya menggunakan PHP untuk membuatnya. Ini tidak bekerja.

Contoh

run.php (Kode yang akan dieksekusi setiap menit)

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

?>

Misalkan kedua file ini berada di folder yang sama.

Apakah kode yang saya lakukan salah? Jika salah, mohon beri tahu saya cara memperbaikinya.

pengguna2738520
sumber
apakah Anda memiliki akses shell di server?
8
Anda tidak bisa hanya menggemakan omong kosong dan mengharapkan cronjob dibuat. Baca di sini cara membuat cronjobs (dengan asumsi Anda berada di server yang menjalankan linux) thesitewizard.com/general/set-cron-job.shtml
tlenss
@Dagon: Saya tidak tahu tentang ini. Saya akan mengeceknya.
pengguna2738520
Ini adalah acara satu kali jadi gunakancrontab
Ed Heal

Jawaban:

66

Ini adalah penjelasan terbaik dengan kode dalam PHP yang saya temukan sejauh ini:

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

Pendeknya:

Meskipun sintaks penjadwalan pekerjaan baru pada pandangan pertama mungkin tampak menakutkan, sebenarnya relatif mudah dipahami setelah Anda memecahnya. Pekerjaan cron akan selalu memiliki lima kolom yang masing-masing mewakili 'operator' kronologis diikuti oleh jalur lengkap dan perintah untuk dieksekusi:

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

Setiap kolom kronologis memiliki relevansi khusus dengan jadwal tugas. Mereka adalah sebagai berikut:

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.

masukkan deskripsi gambar di sini

Jadi, misalnya, jika seseorang ingin menjadwalkan tugas untuk jam 12 pagi pada hari pertama setiap bulan, akan terlihat seperti ini:

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

Jika kami ingin menjadwalkan tugas untuk dijalankan setiap hari Sabtu pada jam 8:30 pagi, kami akan menuliskannya sebagai berikut:

30 8 * * 6 beranda / jalur / ke / command / the_command.sh

Ada juga sejumlah operator yang dapat digunakan untuk menyesuaikan jadwal lebih jauh:

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

Kunjungi tautan untuk artikel lengkap, itu menjelaskan:

  1. Bagaimana format dari cronjob tersebut jika ingin masuk / edit secara manual.
  2. Cara menggunakan PHP dengan pustaka SSH2 untuk mengotentikasi sebagai pengguna, crontab mana yang akan Anda edit.
  3. Kelas PHP lengkap dengan semua metode yang diperlukan untuk otentikasi, mengedit, dan menghapus entri crontab.
Nikolay Ivanov
sumber
34

Dengan cara yang sama Anda mencoba menjalankan cron.php, Anda dapat menjalankan skrip PHP lain. Anda harus melakukannya melalui antarmuka CLI.

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

Kemudian, tambahkan entri ke crontab:

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

Jika skrip run.php memiliki izin yang dapat dieksekusi, itu bisa didaftarkan langsung di crontab, tanpa bagian / usr / bin / php juga. Bagian 'env php', dalam skrip, akan menemukan program yang sesuai untuk menjalankan kode PHP. Jadi, untuk versi 'yang dapat dieksekusi' - tambahkan izin yang dapat dieksekusi ke file:

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

lalu, tambahkan entri berikut ke crontab:

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

Ditambahkan ke Alister, Anda dapat mengedit crontab biasanya (tidak selalu demikian) dengan memasukkan crontab -e dalam sesi ssh di server.

Bintang-bintang mewakili (* berarti setiap unit ini):

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

Anda dapat membaca lebih banyak tentang ini di sini .

Nerd Jahe Besar
sumber
2

Ketik yang berikut ini di terminal linux / ubuntu

 crontab -e 

pilih editor (terkadang meminta editor) dan ini dijalankan setiap menit

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

Itu mungkin tergantung pada host web Anda jika Anda tidak menghosting konten Anda sendiri. Jika host web Anda mendukung pembuatan tugas chron, mereka mungkin memiliki formulir untuk Anda isi yang memungkinkan Anda memilih frekuensi dan memasukkan jalur absolut ke file untuk dieksekusi. Misalnya, host web saya (DreamHost) memungkinkan saya membuat tugas cron khusus dengan mengetikkan jalur absolut ke file dan memilih frekuensi dari menu pilihan. Ini mungkin tidak dapat dilakukan untuk server Anda, dalam hal ini Anda perlu mengedit crontab secara langsung atau melalui metode khusus host Anda.

Seperti yang dijelaskan Alister Bulman di atas, buat file PHP untuk dijalankan menggunakan CLI (pastikan untuk menyertakan #!/usr/bin/env phpdi awal file sebelum <?phptag. Ini memastikan bahwa shell mengetahui file yang dapat dieksekusi yang harus dipanggil saat menjalankan skrip.

acharris
sumber
0

kenapa kamu tidak menggunakan curl? logisnya, jika Anda menjalankan file php, Anda akan menjalankannya dengan url di browser Anda. ini sangat sederhana jika Anda menjalankan 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
sumber
5
Ini akan bekerja secara teori tetapi skrip-php harus berjalan sepanjang waktu yang bukan hal yang baik.
bestprogrammerintheworld
1
Anda harus menyetel php-max-execution-time menjadi 0 untuk menjalankan ini selamanya. Juga jika beberapa kesalahan terjadi dalam skrip Anda, itu tidak akan dijalankan lagi sampai Anda memulai ulang secara manual.
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
sumber
6
Meskipun saya sangat tertarik dengan kode Anda, dapatkah Anda menjelaskannya?
Precious Tom
0

Pertama buka server SSH Anda dengan nama pengguna dan kata sandi dan ubah ke pengguna root default (Pengguna dengan semua izin) kemudian ikuti langkah-langkah di bawah ini,

  1. masukkan perintah crontab -lsekarang Anda akan melihat daftar semua cronjobs.
  2. masukkan crontab -efile dengan semua pekerjaan cron akan dibuka.
  3. Edit file dengan jadwal cronjob Anda sebagai min hr dayofmonth month dayofweek pathtocronjobfiledan simpan file.
  4. Sekarang Anda akan melihat respons crontab: installing new crontabsekarang, periksa lagi daftar cronjobs, pekerjaan cron Anda akan terdaftar di sana.
Gokulpriya
sumber
0

Lebih baik gunakan proyek Cron yang dikombinasikan dengan Linux cronjob untuk tugas ini. Ini memungkinkan Anda untuk mengkonfigurasi waktu berjalan dalam Kode PHP Anda, mendukung pekerjaan latar belakang dan mudah digunakan.

Langkah pertama panggil Script PHP setiap menit:

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

Langkah Kedua menggunakan Paket cron / cron untuk mengkonfigurasi waktu proses secara langsung di 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'));

Anda menemukan detail cara menggunakan di repositori tertaut.

Thomas Eimers
sumber
-1

Buat cronjob seperti ini untuk dikerjakan setiap menit

*       *       *       *       *       /usr/bin/php path/to/cron.php &> /dev/null
rams0610
sumber
4
Saya rasa kami sedang mencari solusi untuk membuat cronjob menggunakan php dan tidak menggunakan terminal atau cpanel. Saya juga ingin menemukan solusi ini hanya dengan menggunakan php.
pengguna3264863
-1

Ada cara sederhana untuk mengatasi ini: Anda dapat mengeksekusi file php dengan cron setiap 1 menit, dan di dalam file yang dapat dieksekusi php membuat pernyataan "jika" untuk dieksekusi ketika waktu "sekarang" seperti ini

<?/** 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.dll
sumber
4
Ini hanya akan berfungsi jika Anda memuat halaman, pada dasarnya ini bukan solusi!
MD. Atiqur Rahman
Bagaimana jika saya menutup browser? Ini gagal!
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
sumber