Интересно, кто-нибудь может мне помочь с небольшой проблемой cron?
Проблема в том, что нагрузка может возрасти до 5, а загрузка процессора может подскочить до 40%, на двухъядерном«Xeon L5410 @ 2,33 ГГц» с оперативной памятью 356 МБ, и я не уверен, где мне следует вносить изменения в код и как это предотвратить.Пример кода ниже
// Примечание. $ productFile может быть сжатым 40 МБ .gz, несжатым 700 МБ (текстовый файл xml) if (file_exists ($ productFile)) {
$fResponse = gzopen($productFile, "r");
if ($fResponse) {
while (!gzeof($fResponse)) {
$sResponse = "";
$chunkSize = 10000;
while (!gzeof($fResponse) && (strlen($sResponse) < $chunkSize)) {
$sResponse .= gzgets($fResponse, 4096);
}
$new_page .= $sResponse;
$sResponse = "";
$thisOffset = 0;
unset($matches);
if (strlen($new_page) > 0) {
//Emptying
if (!(strstr($new_page, "<product "))) {
$new_page = "";
}
while (preg_match("/<product [^>]*>.*<\/product>/Uis", $new_page, $matches, PREG_OFFSET_CAPTURE, $thisOffset)) {
$thisOffset = $matches[0][1];
$thisLength = strlen($matches[0][0]);
$thisOffset = $thisOffset + $thisLength;
$new_page = substr($new_page, $thisOffset-1);
$thisOffset = 0;
$new_page_match = $matches[0][0];
//- Save collected data here -//
}
}//End while loop
}
}
gzclose($fResponse);
}
}
$ chunkSize - должно быть как можно меньше, чтобы уменьшить использование памяти и упростить регулярное выражение, или оно должно быть больше, чтобы избежать слишком долгого выполнения кода.
С 40000 соответствуетшипы нагрузки / процессора.Так что у кого-нибудь есть советы о том, как управлять большими загрузками через cron.
Заранее благодарим за помощь