Ben bir üst süreç birbirine paralel çalışacak (genellikle yaklaşık 40) çok sayıda çocuk süreç açan bir programı uygulamaya çalışıyorum.
Şimdi, ben sadece ana süreç olan bazı bilgileri ayıklamak için ana süreç konuşurken çocuk süreçler elde edebilmek istiyorum. Planım message queues in php kullanmak oldu ama bazı konularda çalıştırıyorum. İşte benim temel tasarım:
1) Parent process starts 2) Parent process opens multiple child processes 3) Each child process sends multiple messages to the parent process. For example a particular child can send anywhere from 20 to 100 messages to the parent. 4) Parent receives each messages and sends a 'return' message to the child, for each message that the parent receives 5) Child receives the replies from the parent and performs some action
Ne yazık ki, ben bu işe almak mümkün olmamıştır. Ben böyle bana verdi, her çocuk için ayrı bir kuyruk, gibi pek çok farklı şeyler denedim: "msg_get_queue () [function.msg-olsun-kuyruk]: Uyarı aygıtı üzerinde sol anahtarı yok alanı için başarısız oldu ..." Onlarla yapıldı sonra kuyruklar silme olsa bile. Temelde, sistem yaklaşık 10-15 sıraları açıldı ama artık kuyruklar beceremedi sonra görünüyor ve bu hatayı atmaya başladı.
Ben de, ya bir cevap ama bu işe yaramadı gönderirken mesaj ve her ebeveyn mesajı kendi benzersiz desiredmsgtype gönderirken (msg_get_queue () işlevine bakınız), her çocuk süreç kendi desiredmsgtype vererek çalıştı. Bazı mesajlarım kayıp ediliyordu ya ben hata almaya başladım: ya çocuk (çocukların bazı iletiler yoluyla gitti unutmayın) ebeveyn kendi mesajlarını göndermek için çalıştı "msgsnd Kaynak geçici olarak kullanılamıyor".
Yani, örneğin:
Çocuk kodu:
$child_msg = (object)array('unique_msg_id' => $unique_msg_id);
if (!msg_send ($ipc_msg_queue, $child_msg_id, $child_msg, true, true, $msg_err))
{
echo "Msg not sent because $msg_err\n";
}
$parent_msg_id = $unique_msg_id;
if (msg_receive ($ipc_msg_queue, $parent_msg_id, $msg_type, 16384, $msg, true, 0, $msg_error))
{
echo "Msg from parent with id: $parent_msg_id";
}
ebeveyn kodu:
while each child process is running:
while (msg_receive ($ipc_msg_queue, $child_msg_id, $msg_type, 16384, $msg, true, 0, $msg_error))
{
echo "Msg from child with id: $child_msg_id";
}
$parent_msg_id = $msg->unique_msg_id;
$parent_msg = 'perform some action';
if (!msg_send ($ipc_msg_queue, $parent_msg_id, $parent_msg, true, true, $msg_err))
{
echo "Msg not sent because $msg_err\n";
}
Ben bir Linux kutusu üzerinde ve ben bir kuyrukta izin maksimum mesajları için sınırı görmek için / proc / sys / fs / mqueue / msg_max baktı ama bu dosya bile yok bulundu. Benim sorunları için bir sebep olabilir mi?
Yani, ben bilmek istiyorum:
Nasıl php mesaj sıralarını kullanarak bu sorunu çözme hakkında gitmek istiyorsunuz?
Neden ben yukarıda belirledik hataları almak olabilir sizce?
Şimdiden teşekkürler