Объяснение: Часть приложение, которое я создаю требует проверки тысяч записей и действующих на них в своевременно образом. Поэтому для каждой записи я хочу разблокировать новый процесс. Тем не менее, мне нужно соединение с БД, чтобы выполнить некоторую проверку этой записи. Насколько я понимаю, он наследует соединение БД. Поэтому последующие вилки имеют ошибки БД.pcntl_fork, а затем pcntl_exec или pcntl_exec, а затем pcntl_fork
Я думал, что могу pcntl_exec ('php /path/script.php'); а затем pcntl_fork, чтобы вызывающий процесс не задерживался.
Или я могу pcntl_fork, а затем pcntl_exec в дочернем процессе. Или, может быть, я должен использовать exec() вместо pcntl_exec().
Мой вопрос: Есть ли недостатки или преимущества для любого заказа?
Примечание: Может быть, я себе этот вопрос, как я думал, что вызывающий процесс PHP будет ждать pcntl_exec вернуться. Но это не то, что говорится в документах:
Возвращает FALSE при ошибке и не возвращается к успеху.
Как функция может возвращать значение иногда и в другое время? Это звучит как плохо написанные документы.
fahadsadah в комментарии состояние:
После того, как выполняется процесс завершается, управление возвращается к процессу веб-сервера.
Если это так, то мне нужно использовать вилку.
Edit: код запутанный - включая меня;)
<?php
class Process
{
public function __construct($arg = false)
{
if ($arg == "child")
{
$this->act();
}
else
{
$this->run();
}
}
public function run()
{
echo "parent before fork:", getmypid(), PHP_EOL;
$pid = @ pcntl_fork();
echo $pid, PHP_EOL;
if ($pid == -1)
{
throw new Exception(self::COULD_NOT_FORK);
}
if ($pid)
{
// parent
echo "parent after fork:", getmypid(), PHP_EOL;
}
elseif ($pid == 0)
{
// child
echo "child after fork:", getmypid(), PHP_EOL;
//echo exec('php Process.php child');
echo pcntl_exec('/usr/bin/php', array('Process.php', 'child'));
}
return 0;
}
private function act()
{
sleep(1);
echo "forked child new process:", getmypid(), PHP_EOL;
return 0;
}
}
$proc = new Process($argv[1]);
Если вы раскомментировать ехес и комментировать pcntl_exec, вы увидите, что pcntl_exec заменяет процесс. Я предполагаю, что это экономит ресурсы.
* (учебник) * [Control Process] (http://www.tuxradar.com/practicalphp/16/1/ 0 «Практический PHP-файл TuxRadar»). В качестве побочного элемента вам нужно использовать расширение 'pcntl' или что-то вроде [Gearman] (http://de2.php.net/manual/en/book.gearman.php) лучше подходить? – Gordon
Хорошая статья. Однако не ответил на все вопросы. Я знаю о Гирмене. Я не думаю, что хочу представить новую зависимость, но, возможно, это путь в будущее. Мне нужен мой процесс, чтобы получить доступ ко всему, что делает родитель. Он должен иметь доступ к БД и всем тем же классам - скажем: Zend lazy loading. Я не знаю, сможет ли Гирман справиться с этим. –
Я предложил бы голосование людям, которые помогли вам. :/ – Madbreaks