[Asal] Semua orang mengetahui proses daemon (Daemon) di Linux/Unix, seperti httpd, mysqld, dll. yang biasa kami gunakan, yang merupakan program yang berjalan di memori tetap, mirip dengan layanan di Windows. Umumnya, proses daemon ditulis dalam C/C++, yaitu menghasilkan proses anak melalui fork. Ketika proses induk di bawah shell saat ini dimatikan, proses anak akan berjalan di latar belakang agar tidak menghasilkan informasi keluaran di terminal , fungsi seperti syslog digunakan untuk menulis file log.
Kita tahu bahwa php adalah bahasa scripting dan dijalankan melalui mesin skrip php, sehingga merepotkan untuk membuat proses daemon. Hari ini kita akan menggabungkan perintah Unix/Linux untuk mewujudkan fungsi proses daemon kita.
[Prinsip] Fungsi dari perintah nohup di Unix adalah untuk menjalankan perintah tanpa menutup telepon. Pada saat yang sama, nohup meletakkan semua output program ke dalam file nohup.out di direktori saat ini tidak dapat ditulisi, ia ditempatkan di file <direktori home pengguna> /nohup.out. Jadi setelah mendapat perintah ini, program php kita menulis skrip shell dan menggunakan loop agar skrip kita tetap berjalan. Kemudian, tidak peduli apakah jendela terminal kita ditutup atau tidak, skrip php kita dapat tetap berjalan. Tentu saja, ketika proses php kita dihentikan atau sistem operasi kita di-restart, proses tersebut akan berhenti secara alami.
[Fungsi] Kalian pasti bertanya, apa gunanya menjadikan script php kita sebagai daemon? Tentu saja ada, seperti fungsi yang paling umum, yang pada dasarnya dapat menggantikan fungsi cron. Misalnya, operasi tertentu yang perlu kita lakukan secara rutin dapat dilakukan olehnya, dan tentu saja cron tidak diperlukan lagi server di-restart, tidak ada cara. Namun, server Unix umum tidak mudah untuk di-restart. Selain itu kita juga bisa membuat fungsi server side yang sederhana seperti membuat server yang bisa menggunakan Telnet. Hehe, bisa dibuat menjadi backdoor kecil, tapi implementasinya agak rumit.
[Latihan] Contoh 1: Menghasilkan file secara otomatis Sekarang kita akan melakukan dua contoh untuk membuktikan pernyataan kita di atas. Pertama-tama, yang pertama adalah membuat file secara otomatis setiap tiga puluh detik dan menjalankannya selamanya.
Pertama, Anda harus memastikan bahwa sistem operasinya adalah Unix atau Linux, seperti FreeBSD, Redhat, Fedora atau SUSE. Maka kita harus memastikan bahwa mesin script php kita ada di /usr/local/php/bin/php. Path spesifiknya bisa ditulis sesuai dengan path anda sebenarnya, jika tidak ada script engine silahkan install sendiri.
Misalnya, jika direktori saat ini adalah /home/heiyeluren/, maka kita menggunakan vi atau editor lain untuk menulis file bernama php_daemon1.php:
$vi php_daemon1.php
Kemudian tulis kode berikut:
#!/usr/local/php/bin/php
<?
set_time_limit(0);
sementara(1)
{
@fopen("test_".time().".txt","w");
tidur(30);
}
?>
Kemudian simpan dan keluar dari vi, lalu berikan izin yang dapat dieksekusi pada file php_daemon1.php:
$ chmod +x /home/heiyeluren/php_daemon1.php
Kemudian biarkan skrip kita dijalankan di latar belakang dan jalankan perintah berikut:
$ nohup /home/heiyeluren/php_daemon1.php &
Ingatlah untuk menambahkan simbol & di akhir agar dapat berjalan di latar belakang. Setelah menjalankan perintah di atas, akan muncul prompt berikut:
[1] 82480
menambahkan output ke nohup.out
Setelah kembali ke mobil, prompt shell akan muncul. Jadi tips di atas berarti informasi output dari seluruh eksekusi perintah akan ditempatkan pada file nohup.out yang telah disebutkan di atas. Kemudian setelah menjalankan perintah di atas, kita akan melihat lebih banyak file yang dimulai dengan test_ di direktori saat ini setiap tiga puluh detik, seperti: test_1139901144.txt test_1139901154.txt dan file lainnya, yang membuktikan bahwa program kita berjalan di latar belakang.
Jadi bagaimana kita menghentikan jalannya program? Cara terbaik adalah dengan me-restart sistem operasi. Haha, tentu saja ini tidak disarankan. Kita bisa menggunakan perintah kill untuk mematikan proses, tentu saja kita mengetahui nomor PID dari proses tersebut ID. Anda dapat menggunakan perintah ps untuk melihatnya.
$ps
PERINTAH WAKTU STATUS PID TT
82374 p3 Ss 0:00.14 -bash (bash)
82510 p3 S 0:00.06 /usr/local/php/bin/php /home/heiyeluren/php_daemon1.php
82528 hal3 R+ 0:00.00 hal
Di atas kita telah melihat bahwa ID proses php kita adalah: 82510, jadi kita jalankan perintah kill:
$ bunuh -9 82510
[1]+ Membunuh nohup /home/heiyeluren/php_daemon1.php
Ketika Anda melihat prompt ini, Anda akan mengetahui bahwa prosesnya telah dihentikan. Jika Anda ps lagi, Anda akan menemukan bahwa prosesnya telah hilang:
$ps
PERINTAH WAKTU STATUS PID TT
82374 p3 Ss 0:00.17 -bash (bash)
82535 hal3 R+ 0:00.00 hal
Jika Anda tidak dapat melihat prosesnya secara langsung dengan perintah ps, maka gunakan gabungan dua perintah ps & apos untuk melihatnya, dan Anda pasti dapat melihat prosesnya.
Berdasarkan proses di atas, Anda dapat memperluas proses untuk membuat program cron sendiri, maka Anda tidak memerlukan cron. Tentu saja ini hanya salah satu cara. Contoh 2: Daemon sisi server . Ini secara kasar disimulasikan menggunakan PHP. sisi server, dan kemudian berjalan di latar belakang untuk mencapai efek Daemon sisi server.
Lanjutkan di direktori home kita: /home/heiyeluren dan edit file php_daemon2.php:
$vi php_daemon2.php
Masukkan kode berikut (kode dari manual PHP, komentar sudah saya modifikasi):
#!/usr/local/php/bin/php
<?php
/* Pengaturan http://www.knowsky.com/php.asp tidak menampilkan kesalahan apa pun*/
kesalahan_pelaporan(0);
/* Batas waktu skrip tidak terbatas*/
set_time_limit(0);
/* Memulai penyelesaian tetap */
ob_implisit_flush();
/* IP mesin ini dan port yang perlu dibuka */
$alamat = '192.168.0.1';
$pelabuhan = 10.000;
/* Membuat Soket */
jika (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
echo "socket_create() gagal: alasan: " .
}
/* Mengikat alamat IP dan port */
if (($ret = socket_bind($sock, $alamat, $port)) < 0) {
echo “socket_bind() gagal: alasan: ” .
}
/* Pantau koneksi Soket */
if (($ret = socket_listen($sock, 5)) < 0) {
echo “socket_listen() gagal: alasan: ” .
}
/*Perulangan selamanya untuk memantau koneksi pengguna*/
Mengerjakan {
if (($msgsock = socket_accept($sock)) < 0) {
echo "socket_accept() gagal: alasan: " .
merusak;
}
/* Kirim informasi cepat ke pengguna yang terhubung*/
$pesan = “============rn " .
"Selamat datang di Server Uji PHP. rnrn".
" Untuk keluar, ketik 'keluar'. rn" .
"Untuk mematikan server ketik 'shutdown'.rn" .
"Untuk mendapatkan pesan bantuan, ketik 'help'.rn" .
"============rn" .
"php>";
socket_write($msgsock, $msg, strlen($msg));
Mengerjakan {
if (salah === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) {
echo “socket_read() gagal: alasan: ” .
istirahat 2;
}
jika (!$buf = potong($buf)) {
melanjutkan;
}
/*Menutup koneksi klien ketika klien memasukkan perintah keluar*/
if ($buf == 'keluar') {
merusak;
}
/* Saat klien memasukkan perintah shutdown, server dan klien akan dimatikan*/
if ($buf == 'mematikan') {
socket_close($msgsock);
istirahat 2;
}
/* Menampilkan informasi bantuan ketika klien memasukkan perintah bantuan*/
if ($buf == 'bantuan') {
$msg = “Pesan Bantuan Server PHP rnrn”.
" Untuk keluar, ketik 'keluar'. rn" .
"Untuk mematikan server ketik 'shutdown'.rn" .
"Untuk mendapatkan pesan bantuan, ketik 'help'.rn" .
"php>";
socket_write($msgsock, $msg, strlen($msg));
melanjutkan;
}
/*Pesan cepat ketika perintah input klien tidak ada*/
$talkback = “PHP: perintah tidak diketahui '$buf'.rnphp> “;
socket_write($msgsock, $talkback, strlen($talkback));
gema “$bufn”;
} sementara (benar);
socket_close($msgsock);
} sementara (benar);
/* Tutup koneksi Socket */
socket_close($kaus kaki);
?>
Simpan kode di atas dan keluar.
Kode di atas secara kasar menyelesaikan fungsi yang mirip dengan sisi server Telnet, yaitu ketika sisi server menjalankan program, klien dapat terhubung ke port 10.000 server untuk komunikasi.
Tambahkan izin yang dapat dieksekusi ke file:
$ chmod +x /home/heiyeluren/php_daemon2.php
Jalankan perintah di server:
$ nohup /home/heiyeluren/php_daemon2.php &
Ini memasuki operasi latar belakang, dan kita naik melalui telnet klien Windows:
C:>telnet 192.168.0.1 10.000
Jika diminta:
Menghubungkan ke 192.168.0.188...Tidak dapat membuka koneksi ke host pada port 10000: Jika koneksi gagal berarti server tidak terbuka, atau program di atas tidak dijalankan dengan benar -fungsi soket. Jika diminta:
=============
Selamat datang di Server Uji PHP.
Untuk keluar, ketik 'berhenti'.
Untuk mematikan server ketik 'shutdown'.
Untuk mendapatkan pesan bantuan ketik 'bantuan'.
=============
php>
Artinya kita telah berhasil terhubung ke daemon sisi server yang ditulis dalam PHP. Setelah prompt php>, kita dapat menjalankan tiga perintah seperti help, exit, dan shutdown.
php> asdf
PHP: perintah 'asdf' tidak diketahui.
Jalankan perintah bantuan untuk mendapatkan bantuan php> bantuan
Pesan Bantuan Server PHP
Untuk keluar, ketik 'berhenti'.
Untuk mematikan server ketik 'shutdown'.
Untuk mendapatkan pesan bantuan ketik 'bantuan'.
Sisi server ini tidak akan diperkenalkan dan dapat diperluas sendiri.
Membunuh prosesnya mirip dengan contoh 1.
[Ringkasan] Melalui pembelajaran di atas, kita mengetahui bahwa PHP juga dapat digunakan sebagai proses daemon. Jika dirancang dengan baik, fungsinya akan lebih kuat. Namun, kami baru mempelajarinya di sini dan Anda dapat meneliti dan memperbaruinya sendiri .
Artikel ini mengacu pada manual PHP Mandarin. Membaca lebih banyak manual akan sangat bermanfaat bagi Anda.