Rumah >pembangunan bahagian belakang >tutorial php >Cara menggunakan tugas tak segerak untuk melaksanakan pemprosesan latar belakang dalam PHP

Cara menggunakan tugas tak segerak untuk melaksanakan pemprosesan latar belakang dalam PHP

WBOY
WBOYasal
2023-06-27 15:10:421328semak imbas

Dalam pembangunan web, sesetengah tugasan mengambil masa yang lama untuk diselesaikan, seperti pemprosesan data, muat naik fail, penghantaran e-mel, dsb. Jika operasi ini dilakukan di latar depan, ia akan membawa kepada pengalaman pengguna yang lemah dan malah menyebabkan halaman menjadi tidak responsif untuk masa yang lama. Oleh itu, menggunakan tugas tak segerak boleh meletakkan tugas ini di latar belakang, meningkatkan keupayaan serentak sistem, dan juga menjadikan pengalaman pengguna dan interaksi latar depan lebih lancar.

PHP, sebagai bahasa skrip sebelah pelayan yang popular, juga mempunyai sokongan yang baik untuk melaksanakan tugas tak segerak. Artikel ini akan memperkenalkan cara menggunakan tugas tak segerak untuk melaksanakan pemprosesan latar belakang dalam PHP.

Prinsip dan Kaedah

Prinsip pelaksanaan tugas tak segerak adalah untuk memproses tugasan di latar belakang supaya program boleh melaksanakan tugas lain dalam tempoh ini. Ciri ini boleh dicapai melalui modul sambungan PHP berikut:

  1. pcntl: merealisasikan tugas latar belakang melalui proses Fork.
  2. posix: digunakan untuk mengendalikan panggilan sistem yang berkaitan dengan proses, seperti isyarat, kunci, dsb.
  3. swoole: Enjin komunikasi rangkaian tak segerak, selari dan coroutine berprestasi tinggi berdasarkan teknologi epoll.

Antaranya, swoole ialah modul sambungan terkini dan paling disyorkan, yang menyokong kebanyakan ciri, paling pantas, dan mempunyai fungsi paling berkuasa.

Gunakan pcntl untuk melaksanakan tugas latar belakang

pcntl ialah sambungan PHP yang menyediakan satu set fungsi kawalan proses. Melalui fungsi pcntl_fork(), proses anak boleh dibuat untuk mengendalikan tugas latar belakang. Kaedah pelaksanaan khusus adalah seperti berikut:

// 创建子进程
$pid = pcntl_fork();

if ($pid === -1) {
    die('could not fork');
}
// 父进程
elseif ($pid) {
    // 执行父进程代码...
    pcntl_wait($status);
}
// 子进程
else {
  // 执行子进程代码...
  exit;
}

Dalam kod di atas, fungsi pcntl_fork() mengembalikan nilai integer Jika nilainya ialah -1, ini bermakna penciptaan proses anak gagal; ia bermakna pada masa ini proses anak jika nilainya lebih besar daripada 0 , menunjukkan bahawa ia adalah proses induk pada masa ini.

Pada masa ini, proses kanak-kanak boleh melaksanakan tugas latar belakang, seperti tugas berjadual, pemprosesan fail, dll. Perlu diingatkan bahawa penggunaan pcntl harus dielakkan dalam persekitaran dalam talian kerana pcntl hanya berfungsi dengan skrip baris arahan.

Gunakan posix untuk melaksanakan tugas latar belakang

Untuk pelayan web seperti Apache dan Nginx, anda perlu menggunakan sambungan posix untuk pengurusan proses. posix menyediakan beberapa fungsi berkaitan pengurusan proses, seperti posix_kill(), posix_getpid(), dsb. Antaranya, fungsi posix_kill() boleh menghantar isyarat kepada proses untuk mengawal tingkah lakunya.

Kaedah menggunakan posix untuk melaksanakan tugas latar belakang adalah seperti berikut:

// 创建子进程
$pid = posix_getpid();
$child_pid = pcntl_fork();

if (0 === $child_pid) {
  // 子进程代码...
  sleep(10);
  posix_kill($pid, SIGUSR1); //给父进程发送SIGUSR1信号
  exit();
}

// 父进程等待信号
pcntl_signal(SIGUSR1, function ($sig) {
  //在这里执行异步任务
  echo "Received signal: {$sig}
";
  die();
});

Dalam proses anak, fungsi sleep() mewakili masa pelaksanaan tugas tak segerak. Apabila tugas tak segerak selesai, gunakan fungsi posix_kill() untuk menghantar isyarat SIGUSR1 kepada proses induk, menunjukkan bahawa tugasan telah selesai. Dalam proses induk, fungsi pcntl_signal() digunakan untuk menunggu ketibaan isyarat, yang mewakili penyelesaian tugas tak segerak.

Gunakan swoole untuk melaksanakan tugas latar belakang

swoole ialah rangka kerja coroutine PHP tak segerak berprestasi tinggi yang melaksanakan model pengaturcaraan tak segerak dalam cara dipacu peristiwa. swoole menyediakan kelas swoole_process untuk mengurus penciptaan, pelaksanaan dan keluar dari proses anak. Kod pelaksanaan khusus adalah seperti berikut:

$process = new swoole_process(function (swoole_process $worker) {
  // 子进程执行的代码
});

$pid = $process->start();
$swoole_event_add($process->pipe, function ($pipe) use ($process) {
  $recv = $process->read();
  echo "received data: ". $recv;
});

$process->write('hello'); // 向子进程中发送消息

Dalam kod di atas, subproses dibuat menggunakan kelas swoole_process dan subproses boleh dimulakan melalui kaedah start(). Apabila program dalam proses kanak-kanak perlu menghantar mesej ke proses utama, gunakan kaedah write() untuk menulis data ke paip. Proses lain boleh membaca data dalam paip dengan mendengar peristiwa paip. Dengan cara ini, komunikasi antara proses dicapai, dengan itu melaksanakan tugas tak segerak.

Ringkasan

Tugas tak segerak digunakan secara meluas dalam pembangunan web. Tugas tak segerak boleh dilaksanakan dalam PHP melalui sambungan pcntl, posix dan swoole. Antaranya, swole adalah kaedah yang paling komprehensif dan disyorkan. Dengan memahami kaedah ini, pembangun boleh memilih kaedah yang sesuai untuk melaksanakan tugas tak segerak berdasarkan keperluan perniagaan tertentu. Ini akan membantu meningkatkan keupayaan serentak sistem dan pengalaman pengguna.

Atas ialah kandungan terperinci Cara menggunakan tugas tak segerak untuk melaksanakan pemprosesan latar belakang dalam 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