PHP произвольно обрабатывает родительский или дочерний процесс в зависимости от того, что закончилось в первую очередь, что я делаю неправильно? - PullRequest
0 голосов
/ 11 сентября 2009

Привет, у меня есть простой скрипт, который предполагает загрузку 2 отдельных страниц одновременно и получение некоторого текста с них, однако он загружает либо родительский процесс, либо дочерний процесс в зависимости от того, что заканчивается первым, что я делаю неправильно? Я хочу, чтобы 2 процесса работали одновременно, вот пример кода:

<?php

$pid = pcntl_fork();

if ($pid == -1) {
    die("could not fork");
}
else if($pid) {

                $url = "http://www.englishpage.com/verbpage/simplepresent.html";
                $readurl = file_get_contents($url);
                $pattern = '#Examples(.*?)Forms#s';
                preg_match($pattern, $readurl, $match);
                echo "Test1:".$match[1];


}
else {
                $url = "http://www.englishpage.com/verbpage/simplepresent.html";
                $readurl = file_get_contents($url);
                $pattern = '#Examples(.*?)Forms#s';
                preg_match($pattern, $readurl, $match);
                echo "Test2:".$match[1];

}

echo "<br>Finished<br>";

?> 

любая помощь будет оценена!

Ответы [ 2 ]

0 голосов
/ 16 июля 2010

Из Расширение управления процессом Введение

Поддержка управления процессами в PHP реализует Unix-стиль создания процессов, выполнения программ, обработки сигналов и завершения процессов. Управление процессом не должно быть включено в среде веб-сервера, и при использовании каких-либо функций управления процессом в среде веб-сервера могут возникнуть непредвиденные результаты.

Так что, по сути, вы не должны использовать какие-либо функции pcntl при запуске PHP-скрипта через модуль apache.

Если вы просто хотите получить данные с этих двух страниц одновременно, вы можете использовать stream_select для достижения этой цели. Вы можете найти пример на http://www.ibm.com/developerworks/web/library/os-php-multitask/.

Кстати, curl, очевидно, также поддерживает это, используя curl_multi_select , пример использования которого можно найти по адресу http://www.somacon.com/p537.php.

0 голосов
/ 11 сентября 2009

Я не совсем уверен, что я действительно понимаю, что вы хотите получить, но если вы хотите, чтобы ваше сообщение "Готово" отображалось:

  • только один раз
  • только когда два процесса выполнили свою работу

Вы должны:

  • Используйте pcntl_wait в родительском процессе, поэтому он ожидает смерти своего потомка
  • Эхо "завершено" из родительского процесса после того, как оно завершило ожидание.

Например, что-то вроде этого должно сделать:

$pid = pcntl_fork();
if ($pid == -1) {
    die("could not fork");
}
else if($pid) { // Father
    sleep(mt_rand(0, 5));
    echo "Father done\n";

    pcntl_wait($status); // Wait for the children to finish / die

    echo "All Finished\n\n";
}
else { // Child
    sleep(mt_rand(0, 5));
    echo "Child done\n";
}

При этом каждый процесс будет выполнять свою работу, и только после завершения обоих родительский процесс будет отображать, что все сделано:

  • если родитель сделан первым, он будет ждать ребенка
  • если ребенок заканчивается первым, родитель не будет ждать ... Но все равно закончит после него.


Как примечание: вы используете два отдельных процесса; разветвившись, вы не сможете «легко» обмениваться данными между ними - поэтому нелегко передать данные от ребенка отцу, равно как и наоборот.

Если вам нужно сделать это, вы можете взглянуть на Функции совместно используемой памяти - или просто использовать простые файлы ^^


Надеюсь, это поможет - и что я правильно понял вопрос ^^

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...