Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menggunakan fungsi kawalan proses PHP?

Bagaimana untuk menggunakan fungsi kawalan proses PHP?

王林
王林asal
2023-06-04 08:21:02998semak imbas

PHP ialah bahasa pengaturcaraan yang sangat popular yang boleh dilaksanakan di bahagian pelayan. Apabila menjalankan skrip PHP pada bahagian pelayan, kita selalunya perlu mengawal perjalanan proses untuk menyelaraskan pelaksanaan tugas yang berbeza dan memastikan kebolehpercayaan program. PHP menyediakan satu set fungsi kawalan proses yang ringkas dan mudah digunakan yang boleh membantu kami mencapai matlamat ini. Dalam artikel ini, kami akan memperkenalkan prinsip asas, penggunaan dan langkah berjaga-jaga kawalan proses PHP.

1. Konsep asas kawalan proses PHP

Kawalan proses PHP terutamanya merangkumi fungsi seperti penciptaan proses, penamatan, menunggu dan menangkap isyarat. Antaranya, penciptaan proses adalah fungsi paling asas Ia boleh mencipta sub-proses baharu dalam konteks proses semasa supaya tugas-tugas seterusnya dapat dilaksanakan dalam sub-proses untuk mencapai pemprosesan serentak. Fungsi penamatan proses membolehkan kami menamatkan secara aktif proses anak selepas pelaksanaan program selesai. Fungsi proses menunggu membolehkan proses induk menunggu selesainya proses anak dan mendapatkan nilai pulangan proses anak untuk pemprosesan seterusnya berdasarkan hasil pelaksanaan proses anak. Fungsi penangkapan isyarat membolehkan kami mengawal tingkah laku program dengan menghantar isyarat, seperti mengganggu proses anak pelaksana atau menamatkan pelaksanaan program secara paksa.

2. Cara menggunakan kawalan proses PHP

  1. Penciptaan proses

PHP menyediakan fungsi pcntl_fork untuk merealisasikan fungsi penciptaan proses. Fungsi ini akan mencipta proses anak baharu dan mengembalikan nilai integer yang digunakan untuk membezakan antara proses induk dan proses anak. Dalam proses anak, nilai pulangan fungsi ini ialah 0 dalam proses induk, fungsi ini mengembalikan ID proses proses baharu. Berikut ialah contoh kod penciptaan proses:

$pid = pcntl_fork();
if ($pid == -1) {
  // 进程创建失败
  exit(1);
} else if ($pid) {
  // 父进程
  echo "父进程,子进程ID:$pid
";
} else {
  // 子进程
  echo "子进程,ID:" . getmypid() . "
";
}

Dalam contoh ini, kami mencipta proses anak baharu melalui fungsi pcntl_fork, dan mengeluarkan maklumat yang berbeza dalam proses induk dan proses anak. Perlu diingat bahawa apabila fungsi pcntl_fork dipanggil, proses induk dan proses anak akan menyalin salinan persekitaran pelaksanaan program, termasuk pembolehubah, deskriptor fail, status berjalan dan maklumat lain. Memandangkan proses anak mewarisi maklumat ini daripada proses induk, kita perlu lebih berhati-hati untuk mengelakkan ralat yang tidak dijangka.

  1. Proses penamatan

PHP menyediakan fungsi pcntl_exit untuk menamatkan proses. Fungsi ini membolehkan kami menamatkan secara aktif proses anak selepas program dilaksanakan. Anda boleh menghantar nilai integer sebagai nilai pulangan untuk menghantar hasil pelaksanaan proses anak kepada proses induk. Berikut ialah contoh kod penamatan proses:

$pid = pcntl_fork();
if ($pid == -1) {
  // 进程创建失败
  exit(1);
} else if ($pid) {
  // 父进程
  pcntl_wait($status); // 等待子进程执行完毕
  echo "子进程执行完成,返回值:".$status."
";
} else {
  // 子进程
  echo "子进程执行中...
";
  pcntl_exit(123); // 终止子进程,并返回123
}

Dalam contoh ini, kami menamatkan larian proses anak melalui fungsi pcntl_exit dan lulus nilai pulangan 123. Proses induk memanggil fungsi pcntl_wait untuk menunggu penghujung proses anak dan menggunakan pembolehubah $status untuk menerima nilai pulangan proses anak. Perlu diingatkan bahawa fungsi pcntl_exit hanya boleh digunakan untuk menamatkan proses semasa dan tidak boleh menamatkan proses lain.

  1. Proses menunggu

PHP menyediakan fungsi pcntl_wait untuk menunggu tamat proses anak dan mendapatkan nilai pulangan proses anak. Fungsi ini boleh dipanggil dalam proses induk untuk mendapatkan hasil pelaksanaan proses anak selepas pelaksanaan proses anak selesai. Berikut ialah contoh kod proses menunggu:

$pid = pcntl_fork();
if ($pid == -1) {
  // 进程创建失败
  exit(1);
} else if ($pid) {
  // 父进程
  pcntl_wait($status); // 等待子进程执行完毕
  echo "子进程执行完成,返回值:".$status."
";
} else {
  // 子进程
  echo "子进程执行中...
";
  sleep(3); // 模拟子进程执行
  pcntl_exit(123); // 终止子进程,并返回123
}

Dalam contoh ini, kami menunggu penghujung proses anak melalui fungsi pcntl_wait dan menggunakan pembolehubah $status untuk menerima nilai pulangan proses anak. Perlu diingatkan bahawa jika terdapat berbilang proses anak dalam proses induk yang perlu menunggu, anda boleh menggunakan fungsi pcntl_waitpid untuk secara khusus menunggu proses anak yang ditentukan.

  1. Tangkap Isyarat

PHP menyediakan fungsi pcntl_signal untuk melaksanakan fungsi tangkap isyarat. Fungsi ini membolehkan kita menentukan isyarat dan mengikat fungsi pemprosesan isyarat untuk memproses isyarat. Berikut ialah contoh kod untuk menangkap isyarat:

function signal_handler($signal)
{
  echo "接收到信号:".$signal."
";
}

pcntl_signal(SIGINT, "signal_handler"); // 捕捉Ctrl+C信号

while (true) {
  // 循环执行
  sleep(1);
}

Dalam contoh ini, kami menangkap isyarat Ctrl+C melalui fungsi pcntl_signal dan mengikat fungsi pemprosesan signal_handler. Apabila pengguna menekan kekunci Ctrl+C, program akan menerima isyarat ini dan melaksanakan kod dalam fungsi signal_handler. Perlu diingatkan bahawa dalam fungsi pemprosesan isyarat, kita tidak boleh memanggil terus fungsi pcntl_exit, kerana ini boleh menyebabkan proses terganggu semasa pelaksanaan, mengakibatkan ralat yang tidak dapat diramalkan. Jika anda ingin menamatkan proses, anda harus menggunakan fungsi posix_kill untuk menghantar isyarat tamat kepada proses dan menamatkannya dengan proses itu sendiri.

3. Nota

Apabila menggunakan fungsi kawalan proses PHP, anda perlu memberi perhatian kepada perkara berikut:

  1. Penciptaan dan penamatan proses akan menduduki sumber sistem . Jika tidak Jika perlu, operasi penciptaan dan penamatan yang berlebihan hendaklah dielakkan sebaik mungkin.
  2. Proses anak perlu mewarisi deskriptor fail dan pembolehubah proses induk, jadi status sumber ini perlu dikendalikan dengan teliti semasa pelaksanaan program.
  3. Apabila menunggu proses anak dalam proses induk, anda harus menunggu semua proses anak yang mungkin untuk mengelakkan proses zombi.
  4. Dalam fungsi pemprosesan isyarat proses, anda harus mengelak daripada memanggil fungsi pcntl_exit secara langsung Sebaliknya, anda harus menggunakan fungsi posix_kill untuk menghantar isyarat tamat kepada proses dan menamatkannya dengan proses itu sendiri.

Ringkasnya, kawalan proses PHP ialah fungsi yang sangat berkuasa. Melalui kawalan proses, kami boleh melaksanakan pemprosesan serentak, komunikasi antara proses, pengendalian pengecualian dan fungsi lain dengan mudah, membantu kami membina program yang lebih dipercayai. Walau bagaimanapun, apabila menggunakan kawalan proses, anda perlu berhati-hati untuk mengelakkan ralat yang tidak dapat diramalkan.

Atas ialah kandungan terperinci Bagaimana untuk menggunakan fungsi kawalan proses PHP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn