mysql_fetch_assoc
возвращает одну строку за раз, когда столбцы образуют ассоциативный массив. Ваш код прямо сейчас зацикливается на столбцах, но вы выбираете только один столбец. Таким образом, было бы эквивалентно удалить цикл foreach
и просто сказать $value = $db_row['url'];
. Но это все еще не ваше желаемое поведение.
Когда вы запускаете запрос, вы должны перебирать результаты, пока результатов больше не будет. Это было бы что-то вроде:
$sql = mysql_query("SELECT url FROM plow WHERE id IN ($items)")
or die ('Error: ' . mysql_error());
while($db_row = mysql_fetch_assoc($sql)){
// execute per result stuff, $db_row['url'] gives you the `url` column
}
Эта строка: while($db_row = mysql_fetch_assoc($sql))
будет работать до тех пор, пока $db_row
не будет содержать нулевое значение, и будет содержать нулевое значение всякий раз, когда больше не осталось результатов для обработки. Каждый раз, когда он содержит ненулевое значение, будет выполнено тело цикла. Теперь, что касается того, почему вы записываете только один PID
в базу данных, это потому, что вы получаете только один URL из базы данных. Вам нужно перебрать все URL.
Кроме того, ваши exec
вызовы не соответствуют вашему тестовому кейсу, вот вызов, который соответствует вашему тестовому кейсу:
exec("{$path} nohup /opt/bin/plowdown -o {$init_loc} {$db_row['url']} 2> $out_file > /dev/null &", $out);
Собрав все это вместе, мы получим что-то вроде этого:
$sql = mysql_query("SELECT url FROM plow WHERE id IN ($items)")
or die ('Error: ' . mysql_error());
while($db_row = mysql_fetch_assoc($sql)){
// execute per result stuff, $db_row['url'] gives you the `url` column
$random = rand(1,500000);
//log file name
$out_file = '/share/MD0_DATA/Qdownload/plowshare/Logs/log'.$random.'.txt';
exec("{$path} nohup /opt/bin/plowdown -o {$init_loc} {$db_row['url']} 2> $out_file > /dev/null &", $out);
mysql_query("UPDATE plow SET state = 'Active', pid = '{$out[0]}' WHERE id IN ($items)")
or die ('Error: ' . mysql_error());
}