Объяснение: Часть создаваемого мною приложения требует проверки тысяч записей и своевременного выполнения действий с ними .Поэтому для каждой записи я хочу создать новый процесс.Тем не менее, мне нужно соединение с БД, чтобы сделать еще одну проверку этой записи.Насколько я понимаю, ребенок наследует соединение с БД.Поэтому последующие вилки имеют ошибки БД.
Я думал, что смогу pcntl_exec ('php /path/script.php');и затем pcntl_fork, чтобы вызывающий процесс не задерживался.
Или я могу pcntl_fork, а затем pcntl_exec в дочернем процессе.Или, может быть, я должен использовать exec () вместо pcntl_exec ().
Мой вопрос: Есть ли какие-либо недостатки или преимущества в любом заказе?
Примечания: Может быть, я представляю эту проблему, так как думал, что вызывающий процесс php будет ждать возвращения pcntl_exec.Но это не то, что указано в документации:
Возвращает FALSE в случае ошибки и не возвращает в случае успеха.
Как функция может возвращать значение иногда, а иногда нет?Это звучит как плохо написанные документы.
Состояние комментариев Фахадсада:
Как только выполненный процесс заканчивается, управление возвращается к процессу веб-сервера.
Если этов таком случае, тогда мне нужно раскошелиться.
Редактировать: код для смущенного - включая меня;)
<?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]);
Если вы раскомментируете exec и комментируетеpcntl_exec, вы увидите, что pcntl_exec заменяет процесс.Что, я думаю, экономит некоторые ресурсы.