Mam kod, który jest trochę tak:Wywołanie funkcji w wątku tła/procesu (rozwidlone)
($i=0; $i < 100; $i++)
{
do ($foo[$i]);
}
Powyższe jest czasochłonne zadanie, i miałem nadzieję, aby móc utworzyć funkcję, i nazywają go dwa razy jak poniżej
function wrapper($start;$end)
{
($i=$start; $i < $end; $i++)
{
do ($foo[$i]);
}
}
//have both of these run in parallel
wrapper(0,50);
wrapper(51,100);
Spojrzałem na gearman ale nie mogę go używać, ponieważ nie można zainstalować serwer gearman (ponieważ jestem na wspólnym serwerze). Wydaje się, że sposobem na osiągnięcie tego byłoby rozwidlenie. Próbowałem dużo czytać na ten temat, ale dokumentacja i wsparcie są znikome. Przydałaby się każda pomoc/kod szkieletowy.
Aby zdefiniować moje pytanie, w jaki sposób mogę wywołać wrapper()
przekazując argumenty takie, że są wykonywane w procesie potomnym. Ponadto ważne jest, aby móc zarejestrować funkcję zwrotną.
Dodatkowe szczegóły: PHP 5.3, działające na serwerze Linux. Skrypt jest wykonywany przez cgi-fcgi.
Myślę, że w ten sposób mam odrodzić proces potomny, ale w jaki sposób mogę go użyć do odrodzenia wielu procesów podrzędnych? A jak zarejestrować funkcję zwrotną?
$pid = pcntl_fork();
if ($pid == -1) {
// Fork failed
exit(1);
} else if ($pid) {
// The parent process
//should I repeat this same code here to spawn another child process?
} else {
// the child process
//can I call wrapper from here and will it run in this child process?
Dzięki. Wygląda to jak genialne opakowanie. Zajmuję się teraz kodem – xbonez
Link, do którego się odwołujesz, mówi także, że źle jest używać pustej pętli do sprawdzenia, czy wątki są żywe, ponieważ wykorzystają cały procesor. Powinieneś dołączyć do snu w pętli. – Kelvin
@ Kelvin, lepszym rozwiązaniem jest zaimplementowanie funkcji 'join' w bibliotece, powinno być dość proste. –