Tôi đang cố gắng viết một tập lệnh tạo ra một số quy trình con được chia nhỏ bằng cách sử dụng pcntl_*
functions.PHP forking và nhiều tín hiệu con
Về cơ bản, có một tập lệnh chạy trong vòng lặp khoảng một phút, định kỳ thăm dò ý kiến cơ sở dữ liệu để xem có nhiệm vụ nào để chạy hay không. Nếu có một, nó sẽ ngã ba và chạy nhiệm vụ trong một quá trình riêng biệt để cha mẹ không được tổ chức bởi một nhiệm vụ chạy dài.
Vì có thể có một số lượng lớn các tác vụ sẵn sàng để chạy, tôi muốn giới hạn số lượng quy trình con được tạo. Vì vậy, tôi theo dõi số lượng các quá trình bằng cách tăng một biến mỗi lần một được tạo ra (và sau đó tạm dừng nếu có quá nhiều), và sau đó giảm nó trong một trình xử lý tín hiệu. Loại như thế này:
define(ticks = 1);
$openProcesses = 0; // how many we have open
$max = 3; // the most we want open at a time
pcntl_signal(SIGCHLD, "childFinished");
while (!time_is_up()) {
if (there_is_something_to_do()) {
$pid = pcntl_fork();
if (!$pid) { // I am the child
foo(); // run the long-running task
exit(0); // and exit
} else { // I am the parent
++$openProcesses;
if ($openProcesses >= $max) {
pcntl_wait($status); // wait for any child to exit
} // before continuing
}
} else {
sleep(3);
}
}
function childFinished($signo) {
global $openProcesses;
--$openProcesses;
}
này hoạt động khá nhiều ok hầu hết thời gian, trừ khi hai hay nhiều quá trình hoàn thành cùng một lúc - chức năng xử lý tín hiệu chỉ được gọi một lần, mà ném ra truy cập của tôi. Lý do cho điều này được giải thích bằng "Ẩn danh" trong số notes of the PHP manual:
Nhiều trẻ em trả lại ít hơn số trẻ em thoát tại một thời điểm nhất định Tín hiệu SIGCHLD là hành vi bình thường đối với hệ thống Unix (POSIX). SIGCHLD có thể được đọc là "một hoặc nhiều trẻ em thay đổi trạng thái - đi kiểm tra con của bạn và thu hoạch các giá trị trạng thái của chúng".
Câu hỏi của tôi là: Làm cách nào để kiểm tra trẻ em và thu thập trạng thái của chúng? Có cách nào đáng tin cậy để kiểm tra xem có bao nhiêu tiến trình con được mở tại bất kỳ thời điểm nào không?
Sử dụng PHP 5.2.9
có thể chỉ sử dụng https://www.rabbitmq.com/ sẽ khiến toàn bộ mọi thứ dễ bị lỗi hơn –