[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите уменьшить нагрузку
Magikan
при запуске скрипт получается большая нагрузка на процесор

помогите понять что не так
Свернутый текст
PHP
header('Content-Type: text/html; charset=UTF8');
set_time_limit(9200);
include(
'conn.php');
mysql_query("SET NAMES 'utf8'");


$sql='SELECT  lent.* FROM lentlink as lent';
$req=mysql_query($sql);
unset(
$sql);
if (!$req){ echo 'У нас проблема <br>'.mysql_error();}
while ($res=mysql_fetch_assoc($req))
    {
    $links[]=$res;
    }
unset(
$req);
echo "У нас ".count($links)." ссылок <br>";
/*print_r($links);*/
text($links);

function text($links)
{
    for ($i=0;$i<count($links);$i++)
    {
    $temp=Getpage($links[$i]['link']."_Printed.htm");
    $temp=str_replace("\r\n"," ",$temp);
    preg_match("/<h3>(.*?)<\/h3>/",$temp,$head);
    preg_match_all("/<p>([^~]*?)<\/p>/",$temp,$text);
    unset($temp);
    echo "<br>";
    print_r($head[1]);
    print_r($text[1]);
    save_txt($head[1],$text[1],$links[$i]['data']);
    echo "текст номер: ".$links[$i]['id']."сохранен удаляем с очереди <br>";
    $sql='DELETE from lentlink where id="'.$links[$i]['id'].'"';
    $req=mysql_query($sql);
    if (!$req){ echo 'У нас проблема <br>'.mysql_error();}
/*    sleep(3);*/
    }
}

function save_txt($head,$text,$name)
{
    $temp='';
    $temp.=$head."\r\n";
    for ($i=0;$i<count($text);$i++)
    {
        $add=str_replace("</a>","",$text[$i]);
        $add=str_replace("\r\n","",$add);
        $add=str_replace("\r","",$add);
        $add=str_replace("\n","",$add);
        while(strpos($add,"<a")){
            $pos1=strpos($add,"<a");
            $pos2=strpos($add,">");
            $add=trim(substr_replace($add,"",$pos1,($pos2-$pos1+1)));
            }
        $temp.='\t'.$add."\r\n";
    }
    unset($add,$pos1,$pos2);
    if ( !file_exists("./posts") ) { mkdir('./posts/');/*chmod('./posts/',0766);*/} 
    
/*$name=date("Y-m-d");*/
    /*if (!file_exists("./posts/".$name)){ mkdir('./posts/'.$name.'/');/*chmod('./posts/'.$name.'/',0766);}*/
    
    if 
(!file_exists('./posts/'.$name.'.txt'))
        {
            $file=fopen('./posts/'.$name.'.txt','w+');
        }else{$file=fopen('./posts/'.$name.'.txt','a');}
    /*$file=fopen('./text/'."1".'.txt','r+');*/
    if(!$file)
    {
        echo 'ерор';
    }
    $temp=iconv("windows-1251","UTF-8",$temp);
    $temp=stripcslashes($temp);
    fputs($file,$temp);    
    fclose
($file);
    unset($temp,$name,$text,$head);
/*    $url=$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF'];
    $url=substr($url,0,-9);*/
/*    echo '<br>link for load file of result work <a href="http://'.$url.'posts/'.$name.'/'.$f.'.txt"><strong>'.$head.' '.$f.'.txt click me!</strong></a>';
*/
}

function Getpage($url)
{
    if (preg_match("/http:\/\//",$url)===1)
        $url=substr($url,7);
    /*echo $url.'<br>';*/
    $timeout=30;
    if (strpos($url,"/")){
        $server = substr($url,0,strpos($url,"/")); // IP address 
        $url= substr($url,strpos($url,'/')); }
    else{
        $server=$url;
        $url="/";
    }
    $host = $server; // Domain name
    $target = substr($url,0,strpos($url,'?')); // Specific program
    $referer = A_URL; // Referer
    $port = 80;
    $getValues = substr($url,strpos($url,'?'));

    $request = "GET $target$getValues HTTP/1.1\r\n";
    $request .= "Host: $host\r\n";
    $request .= 'User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1) ';
    $request .= "Gecko/20021204\r\n";
    $request .= 'Accept: ';
    $request .= 'text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,';
    $request .= "image/jpeg,image/gif;q=0.2,text/css,*/*;q=0.1\r\n";
    $request .= "Connection: close\r\n\r\n";

    /*echo $request.'<br>';*/
    $socket = @fsockopen( $server, $port, $errno, $errstr, $timeout );

    if (!$socket){
        echo "$errstr ($errno)<br>\n";
        echo "check up it given databases<br>\n";
        exit;
    } else {
    
    fwrite
( $socket, $request );
    $ret = '';
    
    while 
( !feof( $socket ) ) {
        $ret .= fgets( $socket, 4096 );
    }

    fclose( $socket );
    /*echo $ret;*/
    return $ret;
    }
}

скрипт выберет с базы ссылки парсит их и удаляет сохраняя результат парсинга в документ с текущей датой



Спустя 13 минут, 5 секунд (11.09.2009 - 17:59) Nikitian написал(а):
Нагрузка от базы или веб-сервера?
Сколько записей в таблице lentlink? Если их там очень много (тысячи в данном случае уже много), то имеет смысл разбить на части проверку: при проверке брать сотню записей с минимальной временной меткой, помечать их текущим временем, либо брать по сколько-нибудь пока время не будет подходить к концу.
В цикле for функции text() сделайте usleep(300);
Делиты вынесите а конец скрипта и делайте их одним запросом
SQL
delete from tbl where id in (1,3,45,6,8,3,56,7)

Спустя 4 минуты, 33 секунды (11.09.2009 - 18:03) Magikan написал(а):
в базе обчно за день около 300 линков
и нагрузка идет на процессор от сервера

Спустя 2 минуты, 47 секунд (11.09.2009 - 18:06) Nikitian написал(а):
Выбирайте за раз по 50 ссылок, нагрузка будет меньше. Ну и про остальные рекомендации не забывайте

Спустя 1 час, 21 минута, 47 секунд (11.09.2009 - 19:28) FatCat написал(а):
preg_match_all и preg_match жрут немеряно ресурсов и для парсинга совершенно непригодны.
Где-то я писал уже результаты моих сравнительных тестов производительности использования регулярок, explode и substr - к моему удивлению substr дала снижение потребления ресурсов на 3 порядка, а скорость выполнения операции возросла на 2 порядка.

Например:
PHP
preg_match_all("/<p>([^~]*?)<\/p>/",$temp,$text);
- даст нам массив текстов абзацев.
То же самое при помощи substr выглядит не столь элегантно, но работает на 2 порядка быстрее:
PHP
$temp = array();
$temp_el = 0;
$in_tag = 0;
$text0 = "";
while(
$text)
{
    // Где я нахожусь?
    if( substr($text0,-3)=="<p>" ) /* Вошли в тег */ $in_tag++;
    if( substr($text,0,4)=="</p>" ) /* Вышли из тега */ 
    
{
        $in_tag--;
        $temp_el++;
    }

    // Внутри тегов, заполняем элемент массива
    if($in_tag>0)$temp[$temp_el] .= substr($text,0,1);

    $text0 .= substr($text,0,1);
    $text = substr($text,1);
}
$text = $text0;

Спустя 5 часов, 51 минута, 47 секунд (12.09.2009 - 01:20) FatCat написал(а):
Еще менее элегантно и еще экономичней будет не гонять текст по символу между двумя переменными, а лишь менять позиции в substr.
Но пока размер текстового блока не превышает нескольких мегабайт, это не существенно, а код становится менее понятным и более трудным в отладке в случае возникновения ошибок.

Спустя 12 дней, 19 часов, 10 минут, 16 секунд (24.09.2009 - 20:30) Den Laden написал(а):
От функций для работы с регулярками вроде preg_match нужно переходить на обычные строковые. Регулярки нужно использовать при очень сложных выборках из текста либо при маленьких обьемах онного.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.