2009-09-10 2 views
0

Эй, у меня есть простой скрипт, который предположительно загружает 2 отдельные страницы одновременно и извлекает из них какой-то текст, однако он загружает либо родительский процесс, либо дочерний процесс в зависимости от того, что заканчивается первым, что я делать не так? Я хочу, чтобы 2 процесса работали одновременно, вот пример кода:PHP Forking Randomly Does Parent or Child Process зависит от того, что закончилось. Сначала я делаю неправильно?

<?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>"; 

?> 

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

ответ

0

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

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

Вы должны:

  • Использование 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"; 
} 

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

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


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

Если вам нужно сделать это, вы можете посмотреть на Shared Memory Functions - или просто использовать обычные файлы ^^


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

+0

эй, спасибо за ввод, я попробовал запустить код примера, который вы предоставили, но он выводит только «Child Done», я не получил «от отца» или «все готово». То, что я пытаюсь сделать, - это одновременно запустить как родительский, так и дочерний процессы. Целью проекта является запуск искателя, который будет захватывать по 2 страницы за раз и обрабатывать их одновременно, а не один за другим. – 2009-09-10 21:14:43

+0

О :-(Странно ... Я работал на меня ... Ах, подождите, пытаетесь ли вы разблокировать страницу PHP, запущенную под Apache? Это может объяснить это: я попробовал свой код из командной строки ... И , на самом деле, я всегда слышал, что вскрытие от Apache было не так просто/просто/безопасно, как из командной строки ... –

0

от поддержки управления технологических процессов Process Control Extension Introduction

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

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

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

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

+0

Чтобы увидеть stream_select в действии, проверьте код в http://drupal.org/project/httprl. С некоторыми незначительными изменениями этот код можно запустить за пределами Drupal. HTTPRL позволит вам одновременно загружать 2 потока. – mikeytown2

 Смежные вопросы

  • Нет связанных вопросов^_^