PHP juga dapat langsung memulai dan menghentikan proses daemon. Dibandingkan dengan shell, jauh lebih sederhana dan lebih nyaman untuk dipahami. Tentu saja, jika daemon php perlu restart secara otomatis, itu masih tergantung pada jadwal crontab shell. Jalankan skrip sesekali untuk melihat apakah skrip perlu dimulai ulang. Jika perlu, bunuh prosesnya dan hapus file runfile, restart dan tulis PID di file runfile.
Salinan kode adalah sebagai berikut:
<? php
fungsi start ($ file) {
$ path = dirname (__ file __). '/';
$ runfile = $ path. $ file. '. run';
$ diefile = $ path. $ file. '. Die';
$ file = $ path. "Data/{$ file} .php";
clearstatcache ();
if (file_exists ($ runfile)) {
$ oldpid = file_get_contents ($ runfile);
$ nowpid = shell_exec ("ps aux | grep 'php -f proses.php' | grep $ {oldpid} | awk '{cetak $ 2}'");
// Jika nomor PID di runfile dapat cocok dengan yang berjalan, dan perbedaan antara terakhir kali Anda mengakses runfile dan perbedaan saat ini kurang dari 5 menit, lalu kembali
if (($ oldpid == $ nowpid) && (time () - fileatime ($ runfile) <300)) {
echo "$ File adalah lingkaran berjalan tidak";
kembali;
}kalau tidak{
// Nomor PID tidak cocok atau pernyataan loop belum dijalankan selama 300 detik. Bunuh saja prosesnya dan mulai ulang
$ pid = file_get_contents ($ runfile);
shell_exec ("ps aux | grep 'php -f proses.php' | grep {$ pid} | xargs --if-no-run-empty kill");
}
}kalau tidak{
// Tulis file pid ke file run
if (! ($ newPid = getMypid ()) ||! File_put_contents ($ runfile, $ newPid)) {
kembali;
}
while (true) {
// Terima nomor proses akhir yang baru, akhiri proses, dan hapus file yang relevan
if (file_exists ($ diefile) && unlink ($ runfile) && unlink ($ diefile)) {
kembali;
}
/*Inilah yang perlu dilakukan daemon*/
file_put_contents ($ file, "Saya sedang menjalankan sekarang" .php_eol, file_append);
/************************/
sentuh ($ runfile);
tidur (5);
}
}
}
mulai ("tes");
Beberapa poin untuk memperhatikan saat menulis daemon dengan HP:
1. Hal pertama adalah fungsi fungsi clearstatcache (). Melihat manual resmi, Anda dapat mengetahui bahwa fungsi tersebut menghapus cache status file. Saat memeriksa status cache dari file yang sama beberapa kali dalam skrip, kesalahan akan terjadi jika fungsi tidak digunakan. Fungsi yang terkena dampak adalah: stat (), lstat (), file_exists (), is_writable (), is_readable (), is_executable (), is_file (), is_dir (), is_link (), filectime (), fileAtime (), filemtime (), fileinode (), filegroup (), fileatime (), filemtime (), fileinode (), filegroup (), fileatime (), filemtime (), fileinode (), filectime (), fileatime (filemtime (), fileinode (), filectime (), fileatime (filemtime (), fileinode (), fileGroup (), fileatime (), filemtime (), fileinode (), fileGroup (), fileatime (), filemtime (), fileinode (), fileGroup Fileperms ().
2. Saat skrip dijalankan beberapa kali, itu akan terdeteksi sebelum berjalan. Jarak waktu dari loop terakhir sekarang lebih besar dari 300 -an atau nomor PID tidak cocok akan dimulai ulang (waktu harus diperbarui di setiap eksekusi loop).
3. Restart otomatis juga menggunakan jadwal Crontab, tambahkan file ke jadwal:
Salinan kode adalah sebagai berikut:
crontab -e
#Buka jadwal, mode inset
*/3 * * * */usr/bin/php -f Process.php
#Execute setiap 3 menit, letakkan prosesnya untuk digantung
Ini pada dasarnya ok. Jika ada fungsi tertentu, Anda perlu mengubah kode.