Ik heb in mysql een wachtrij staan met 'doe dit' en een php script in een eindeloze lus die kijkt of er iets te doen is. Ik probeer deze te laten forken als er meer dan X opdrachten klaar staan alleen om 1 of andere reden worden dan de delete opdrachten niet meer uitgevoerd. Zonder forken gaat alles wel goed.

Dit stuk script zit vol debug code en kleine testjes dus het ziet er wat slordig uit.
De functies zitten er ook niet bij.

Ik zie alleen uit frustratie door alle bomen het bos niet meer, kan iemand hier zien wat ik over het hoofd zie ?


while (1) {
	if ($fork) {
		echo "Reconnect.\n";
		$action = mysql_connect($host, $user, $pswd) or die(mysql_error());
		$action = mysql_select_db($db) or die(mysql_error());
	}
	$loop = mysql_query("select * from $Var_PS order by ID");
	$loopnum = mysql_num_rows($loop);
	echo "$loopnum\n";
	if (count($pids) > 0) { checkpids(); }
	if ($loopnum != 0) {
		$lastaction = time();
		if ($loopnum > 1) {
			$fork = TRUE;
		} else {
			$fork = FALSE;
		}
		while ($row=mysql_fetch_row($loop)) {
			#0 = ID, 1 = uuid, 2 = dothis, 3 = data

			$spork = FALSE;
[code]<?			mysql_query("delete from $Var_PS where ID = '$row[0]'");
#Hier gaat het fout, na 1e keer is affected rows -1
?>

$temp = mysql_affected_rows();
$temp2 = mysql_info();
echo "delete from $Var_PS where ID = '$row[0]'\n $temp\n$temp2\n";
$ffff = mysql_query("select ID from $Var_PS where ID = '$row[0]'");
$f = mysql_result($ffff,0,'ID');
echo "$f\n";
if ($fork) {
$spork = pcntl_fork();
if ($spork) {
#add child pid to array
array_push($pids,$spork);
} else {
#childs wants mysql!
# echo "Trying to reconnect child.\n";
mysql_close();
$action = mysql_connect("host", "user", "pass") or die(mysql_error());
$action = mysql_select_db("db") or die(mysql_error());
}
}
if (!$spork) {
#parrent or non forked stuff.
DoStuff($row);
if ($fork && !$spork) {
#clean exit child.
mysql_close();
exit(0);
}
} else {
#parrent with forked procs, make sure we're not spawning too many procs.
if (count($pids) >= 4) {
while (count($pids) >= 4) {
checkpids();
usleep(500);
}
}
}
if ($fork) { usleep(500); }
echo "loop1\n";
$loop++;
}
echo "loop2\n";
if ($fork) { mysql_close(); sleep(2); } #ff wachte!
} else {
sleep($waittime);
}
}
[/code]
Je laat expres een lus eindeloos lopen.
Heb je ooit van iemand gehoord dat dat een goed idee is?
Nee, maar ik weet geen betere manier om een proces eindeloos te laten lopen aangezien het niet een webpagina is maar een simpel achtergrond proces.
Er is wel een exit commando maar die zit in de 'DoStuff' functie, maar als je een betere manier weet om iets eindeloos te laten lopen dan hoor ik het graag.
Als je op een linux systeem werkt kan je gebruik maken van CronJobs.
En op windows van SchuledTasks.
Met een poltijd van 2 seconden is een cron niet echt super, veel gedoe als je iets moet aanpassen ook. Het script moet gewoon in de achtergrond draaien.

Maar het oorspronkelijke probleem was 'waarom delete hij niet goed uit mysql zodra ik ga forken' en wel zonder fork.
Je moet eerst even kijken naar error-handling.
je controleert niet of je queries goed zijn gegaan. En als dat niet het geval is, laat je ook geen melding zien, of het script afbreken.

Daarnaast moet je ook kijken naar SQL-INJECTIONS omdat dit script daar wel gevoelig voor is. (En ja, ook als er geen directe user-input wordt gebruikt)

Reageren