Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Не хватает ресурсов для исполнения простенького скрипта

Сообщения:  [1-9] 

 
 автор: Владимир55   (21.05.2009 в 08:44)   письмо автору
 
   для: cheops   (21.05.2009 в 01:32)
 

Это очень интересно!
И это очень ценный совет!
Вы подсказали мне общие принцыпы оптимизации, которые можно распространить и на другие фрагменты кода, за что я Вам особенно благодарен!

  Ответить  
 
 автор: cheops   (21.05.2009 в 01:32)   письмо автору
 
   для: Владимир55   (20.05.2009 в 16:55)
 

>А как скрипт оптимизировать - в этом и весь вопрос!
Во-первых следует избавиться от вложенного в цикл запроса, если в таблице test_mas у вас всего 20 значений - не зачем их каждый раз извлекать - вытащите их за пределами цикла - поместите в массив и используйте массив, не выполняя на каждой из итераций дорогой по ресурсам SQL-запрос.
Во-вторых оператор DELETE следует вообще из всех циклов извлечь. В цикле формируйте WHERE-условие, а после цикла выполняйте DELETE запрос - лучше один большой DELETE-запрос, чем сотни мелких.

  Ответить  
 
 автор: Владимир55   (20.05.2009 в 18:10)   письмо автору
 
   для: GeorgeIV   (20.05.2009 в 17:42)
 

Я тоже так сделал. Но потребовалась администратовная обработка.

Вот я и думаю: может, перенести данные в два массива и обработать их в рнр?
Бвстрее будет?

  Ответить  
 
 автор: Владимир55   (20.05.2009 в 18:08)   письмо автору
 
   для: Axxil   (20.05.2009 в 17:16)
 

"Быстрее всего разбить выборку на порции и запускать конвеером"

Вот этого я не сумел.
Как организовать порции?
Как обеспечить непрерывность отсутствие пропусков?

  Ответить  
 
 автор: GeorgeIV   (20.05.2009 в 17:42)   письмо автору
 
   для: Axxil   (20.05.2009 в 17:16)
 

может проще не записывать в базу эти значения? мы сначала анализ на робота делаем, а уже потом в базу пишем

  Ответить  
 
 автор: Axxil   (20.05.2009 в 17:16)   письмо автору
 
   для: Владимир55   (20.05.2009 в 16:55)
 

Быстрее всего разбить выборку на порции и запускать конвеером. Т.е. не за раз все 20 000 строк выбирать а по 2 000, например, и делать 10 запусков.

Или, если возможно, попытаться изменить структуру БД, чтобы исключить необходимость выполнения запросов в цикле.

  Ответить  
 
 автор: Владимир55   (20.05.2009 в 16:55)   письмо автору
 
   для: Волки   (20.05.2009 в 16:51)
 

Бесконечное время не помогло (да и не могло помочь, ибо, как разъяснил трианон, база все равно отключается от рнр).

А как скрипт оптимизировать - в этом и весь вопрос!

  Ответить  
 
 автор: Волки   (20.05.2009 в 16:51)   письмо автору
 
   для: Владимир55   (20.05.2009 в 16:47)
 

это жестко конечно, 10,000 * 20 запросов к бд.
отпимизируйте скрипт или ставте бесконечное время.

  Ответить  
 
 автор: Владимир55   (20.05.2009 в 16:47)   письмо автору
 
 

Задача такая: удалить из таблицы test_buf все строки, useragent которых включает в себя хотя бы одно значение из таблицы test_mas и при этом не является поисковым роботом.

<?php
    $res 
mysql_query("SELECT useragent FROM test_buf");
    while(
$row mysql_fetch_assoc($res))
    {
        
$useragent $row['useragent'];

        
$res1 mysql_query("SELECT maska FROM test_mas ");
        while(
$row1 mysql_fetch_assoc($res1))
        {
            
$maska $row1['maska'];

            
$flag_maska  = @strstr($useragent$maska);

             if (
$flag_maska)
             {
                 
$flag_yandex  = @strstr($useragent"yandex");
                
$flag_Googl   = @strstr($useragent"Googl");
                
$flag_Rambler = @strstr($useragent"Rambler");
                
$flag_Yahoo   = @strstr($useragent"Yahoo");
                
$flag_Mail    = @strstr($useragent"Mail");
                
$flag_Aport   = @strstr($useragent"Aport");
                
$flag_msnbot  = @strstr($useragent"msnbot");

if ((!
$flag_yandex) and (!$flag_Googl) and (!$flag_Rambler) and (!$flag_Yahoo) and
(!
$flag_Mail) and (!$flag_Aport) and (!$flag_msnbot) and ($useragent != "Bot"))
mysql_query("DELETE FROM test_buf WHERE useragent = '$useragent' ");
             }
        }
    }


В таблице test_buf примерно 10 тысяч строк, а в таблице test_mas 20 строк. Не смотря на set_time_limit(500), страница выдает "504 Gateway Time-out" через 60 секунд.

Как можно решить эту задачу?

  Ответить  

Сообщения:  [1-9] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования