Explanation: Part of the app that I'm creating requires checking of thousands of records and acting on them in a timely manner. So for every record, I want to fork a new process. However, I need a DB connection to do some more checking of that record. As I understand it, the child inherits the DB connection. So subsequent forks have DB errors.
Ben ('php / yol / script.php') pcntl_exec düşündüm; ve sonra pcntl_fork çağıran süreç kaldırdı değil ki.
Yoksa pcntl_fork ve ardından alt süreçte pcntl_exec olabilir. Veya belki de exec () yerine pcntl_exec of () kullanılarak yapılmalıdır.
My question: ya sipariş için herhangi bir sakıncaları ya da avantajları var mı?
Notes: Maybe I'm imagining this issue, as I thought that the calling php process would wait for pcntl_exec to return. But that's not what the docs state:
Hata durumunda FALSE döner ve başarı dönmez.
Nasıl bir fonksiyon bazen bir değer döndürür ve hiçbiri diğer zamanlarda olabilir? Bu kötü yazılmış Docs gibi geliyor.
fahadsadah adlı kullanıcının durumu:
Idam süreci webserver sürecine, kontrol döner biter.
Bu durumda, o zaman çatal gerekiyor.
Edit: code for the confused - including me ;)
<?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]);
Eğer exec yorumsuz ve pcntl_exec yorum ise, bu pcntl_exec süreci yerini göreceksiniz. Ben tahmin ediyorum ki bazı kaynaklar kaydeder.