Есть скрипт, задача которого брать из базы урлы персонажей онлайн игры, парсить страничку по этому адресу- инфо о чаре, сохранять некоторую инфу, если она обновилась, в базу. все отлично работает, правда персонажей в базе порядка 50, и заказчик хочет всегда иметь свежую информацию о местоположении персонажа на карте (либо оффлайн). ну поручили крону каждые 10 минут запускать этот скрипт. нагрузка на проц -около 40 %, время работы скрипта - секунд 5-6 хостер прикрыл сайт, открыл только после уверения что все поправим. Что можно исправить? В какую сторону копать? кто что смодет подсказать? ниже привожу подчищенный скрипт, чтоб уменьшить количество не полезной по моему мнению инфы: PHP: <? // подключаемся к базе, $where присваеваем различные значения в зависимости от того, кого мы хотим обновить: всех юзеров или только бывших в прошлый раз оплайн и т.д. (к тому же в скрипте присутствует несколько бд одинаковой структуры и мы перебираем их по-очереди, если требуется обновить всех) $bases=array("basename1","basename1" ,"basename2", ....); foreach ($bases as $base_name){ $db->database = $base_name; $db->SelectDB(); $q="SELECT user_link, user_id, user_last_date, last_date_online, user_nik FROM locator_users $where"; $r=$db->query ($q); while (@extract($db->fetchAssoc($r))) { $count++; get_info ($user_link, $znach); if ($znach['loc'] == "ОТСУТСТВУЕТ В ИГРЕ") $znach['loc']=""; $rr = "UPDATE locator_users SET user_klan_gif = '{$znach['klan_gif']}', user_klan = '{$znach['klan']}', user_lvl = '{$znach['lvl']}', user_location = '{$znach['loc']}', user_palach = '{$znach['palach']}', user_lekar = '{$znach['lekar']}', user_vzlom = '{$znach['vzlom']}', {$znach['med']} user_last_date = NOW(), last_date_online = ".(($znach['loc']=="")? '\''.$last_date_online.'\'' : ' NOW() ')." WHERE user_id = '$user_id'; "; $db->query($rr); $znach['loc']=stripslashes($znach['loc']); $log.=$user_id.'-'.$user_nik."\n"; } function get_info($user_link, &$znach) { global $medals; $user_link = trim($user_link); preg_match("/^(http:\/\/[^\/]+\/)/i", $user_link, $host); $host = str_ireplace("www.","",$host[1]); $file = file_get_contents( $user_link ); preg_match("{'flashvars','(.*?)'}im",$file,$xx); parse_str($xx[1], $zz); // тут еще много всяких обработок регулярными выражениями, результат записывается в массив $znach } В итоге 5-6 секунд и 45 % проца. что делать?
-Для начала я бы посоветовал облегчить работу регулярок. Ведь данные о персонаже (или о ком там?) хранятся приблизительно в одном месте. Почему бы не начинать читать файл именно с этого места (или, хотя бы, отдавать регулярки с этой позиции). Ну и конец, тоже ясен (можно на подстраховку + 200 символов). Таким образом можно сэкономить много времени. -Некоторые сервера выдают NotModifed. Если выдали, значит сайт можно не парсить. -Продлить время работы скрипта. Это уменьшит нагрузку на процессор, но будет небольшая потеря в оперативности. -Постараться избавиться от "многих регулярок".
sleep(10) каждую итерацию. А вообще, лучше всего уйти от виртуального хостинга и делать что хочеш на вдс\впс.
насчет sleep (10) тоже думал, а вот второй насчет того что регуляркам "скармливать" более конкретные места файла - сделаю. на вдс уже перенесли этот скриптик, впринципе будет работать, но охото сделать как надо, а не "абы работало" Насчет "Некоторые сервера выдают NotModifed." - погуглим, этого еще не знаю. если ткнете, где почитать, не обижусь ;-) спасибо.