За последние 24 часа нас посетили 64079 программистов и 1741 робот. Сейчас ищут 798 программистов ...

оптимизация работы скрипта

Тема в разделе "PHP для новичков", создана пользователем FishErr, 8 дек 2008.

  1. FishErr

    FishErr Активный пользователь

    С нами с:
    6 июл 2007
    Сообщения:
    25
    Симпатии:
    0
    Есть скрипт, задача которого брать из базы урлы персонажей онлайн игры, парсить страничку по этому адресу- инфо о чаре, сохранять некоторую инфу, если она обновилась, в базу.
    все отлично работает, правда персонажей в базе порядка 50, и заказчик хочет всегда иметь свежую информацию о местоположении персонажа на карте (либо оффлайн).
    ну поручили крону каждые 10 минут запускать этот скрипт.
    нагрузка на проц -около 40 %, время работы скрипта - секунд 5-6
    хостер прикрыл сайт, открыл только после уверения что все поправим.
    Что можно исправить? В какую сторону копать? кто что смодет подсказать?
    ниже привожу подчищенный скрипт, чтоб уменьшить количество не полезной по моему мнению инфы:
    PHP:
    1.  
    2. <?
    3. // подключаемся к базе, $where присваеваем различные значения в зависимости от того, кого мы хотим обновить: всех юзеров или только бывших в прошлый раз оплайн и т.д.
    4. (к тому же в скрипте присутствует несколько бд одинаковой структуры и мы перебираем их по-очереди, если требуется обновить всех)
    5.   $bases=array("basename1","basename1" ,"basename2", ....);
    6.  
    7.     foreach ($bases as $base_name){
    8.         $db->database = $base_name;
    9.         $db->SelectDB();
    10.        $q="SELECT user_link, user_id, user_last_date, last_date_online, user_nik
    11.             FROM locator_users
    12.             $where";
    13.         $r=$db->query ($q);
    14.         while (@extract($db->fetchAssoc($r))) {
    15.         $count++;
    16.             get_info ($user_link, $znach);
    17.             if ($znach['loc'] == "ОТСУТСТВУЕТ В ИГРЕ") $znach['loc']="";  
    18.         $rr = "UPDATE
    19.              locator_users SET
    20.                 user_klan_gif    = '{$znach['klan_gif']}',
    21.                 user_klan        = '{$znach['klan']}',
    22.                 user_lvl          = '{$znach['lvl']}',
    23.                 user_location     = '{$znach['loc']}',
    24.                 user_palach       = '{$znach['palach']}',            
    25.                 user_lekar       = '{$znach['lekar']}',    
    26.                 user_vzlom       = '{$znach['vzlom']}',    
    27.                 {$znach['med']}
    28.                 user_last_date    = NOW(),
    29.                 last_date_online  = ".(($znach['loc']=="")? '\''.$last_date_online.'\'' : ' NOW() ')."
    30.               WHERE
    31.              user_id = '$user_id';
    32.             ";
    33.               $db->query($rr);
    34.             $znach['loc']=stripslashes($znach['loc']);
    35.               $log.=$user_id.'-'.$user_nik."\n";
    36.         }  
    37.  
    38. function get_info($user_link, &$znach)
    39. {
    40.   global $medals;
    41.   $user_link = trim($user_link);
    42.    preg_match("/^(http:\/\/[^\/]+\/)/i", $user_link, $host);
    43.    $host = str_ireplace("www.","",$host[1]);
    44.   $file = file_get_contents( $user_link );
    45.   preg_match("{'flashvars','(.*?)'}im",$file,$xx);
    46.   parse_str($xx[1], $zz);
    47. // тут еще много всяких обработок регулярными выражениями, результат записывается в массив $znach
    48. }
    49.  
    В итоге 5-6 секунд и 45 % проца. что делать?
     
  2. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    -Для начала я бы посоветовал облегчить работу регулярок. Ведь данные о персонаже (или о ком там?) хранятся приблизительно в одном месте. Почему бы не начинать читать файл именно с этого места (или, хотя бы, отдавать регулярки с этой позиции). Ну и конец, тоже ясен (можно на подстраховку + 200 символов). Таким образом можно сэкономить много времени.
    -Некоторые сервера выдают NotModifed. Если выдали, значит сайт можно не парсить.
    -Продлить время работы скрипта. Это уменьшит нагрузку на процессор, но будет небольшая потеря в оперативности.
    -Постараться избавиться от "многих регулярок".
     
  3. +Sten+

    +Sten+ Активный пользователь

    С нами с:
    27 авг 2007
    Сообщения:
    978
    Симпатии:
    0
    sleep(10) каждую итерацию. А вообще, лучше всего уйти от виртуального хостинга и делать что хочеш на вдс\впс.
     
  4. FishErr

    FishErr Активный пользователь

    С нами с:
    6 июл 2007
    Сообщения:
    25
    Симпатии:
    0
    насчет sleep (10) тоже думал, а вот второй насчет того что регуляркам "скармливать" более конкретные места файла - сделаю.
    на вдс уже перенесли этот скриптик, впринципе будет работать, но охото сделать как надо, а не "абы работало"
    Насчет "Некоторые сервера выдают NotModifed." - погуглим, этого еще не знаю. если ткнете, где почитать, не обижусь ;-)

    спасибо.
     
  5. sylex

    sylex Активный пользователь

    С нами с:
    9 ноя 2008
    Сообщения:
    625
    Симпатии:
    0
    Адрес:
    Омск
    а зачем в 3 базах одновременно? Чем отличие этих баз, они копии чтоли?