Скрипт работает через раз

Тема в разделе "Как сделать...", создана пользователем Sergo_Sev, 25 авг 2012.

  1. Sergo_Sev

    Sergo_Sev Творец

    Регистр.:
    14 июн 2008
    Сообщения:
    571
    Симпатии:
    188
    Есть скрипт индексатор который собирает страницы и добавляет в базу с тайтлами этих страниц. Так вот тайтлы он парсит через раз и я не могу понять почему
    Это файл siteindexer.php, в архиве весь скрипт
    Код:
    <?PHP
    include(dirname(__FILE__).'/_common.php');
     
    define("LLM_DEBUG",false);
    if(LLM_DEBUG) {
     
        error_reporting(E_ALL);
    }
     
    $TMP_DIR = llmServer::getPPath().'tmp/';
    //на второй уровень сколько
    $MAX_LEVEL2_PAGES = llmConfig::get("LIMIT_LEVEL2_PAGES",1000);
    $TIME_START = time();
     
    //грузим
    $database->setQuery("SELECT * FROM sites WHERE cron_index = '1' ORDER BY RAND()");
    $list = $database->loadObjectList('id');
     
    if (sizeof($list) == 0) exit();
     
    //ищем тот, с которым можно работать и не заблокирован lock-файлом
    $SITE_ID = 0;
    foreach($list as $site) {
     
        $lock_file = $TMP_DIR.'indexer.'.$site->id.'.cron';
        if (file_exists($lock_file)) {
     
            //проверяем время его создания, а-то вдруг уже десять часов индексирует чего-то
            $ftime = file_get_contents($lock_file);
            $diff  = (time() - $ftime)/3600;
            if ($diff > 10) {
         
                //удаляем нафик
                unlink($lock_file);
                //делаем пометку о проиндексированности
                $database->setQuery("UPDATE sites SET cron_index = 0 WHERE id = '{$site->id}'");
                $database->query();
            }
        }
        else {
     
            $SITE_ID = $site->id;
            break;
        }
    }
     
    if (!$SITE_ID) exit();
    $logger = new llmLogger("siteindexer.txt","a");
     
    //работаем с конкретным сайтом
    $site = $list[$SITE_ID];
    //какие урлы надо исключить из индексирования
    $excl = explode("\n",$site->exclude_urls);$exclude_urls = array();
    foreach($excl as $uuu) {
     
        $uuu = trim($uuu);
        if (!$uuu) continue;
     
        $exclude_urls[] = $uuu;
    }
    //в этот же массив пихаем урлы и robots.txt, ибо по сути они выполняют одну и ту же функцию
    $robott = new llmHTTP();
    $ROBOTSTXT = $robott->get($site->url."robots.txt",$st1,$cu1);
    $rules = $robott->getRobotsTXTRules($site->url,$ROBOTSTXT);
    foreach($rules as $rrule) $exclude_urls[] = $rrule;
    $exclude_urls_size = sizeof($exclude_urls);
    //конец исключаемых ссылок
     
    //ссылки, сохраненные в БД [хэш_урла] => вложенность
    $saved_links = array();
     
    //создаем lock файл о том, что мы начали его мучить
    $lock_file = $TMP_DIR.'indexer.'.$site->id.'.cron';
    if(!LLM_DEBUG) {$f = fopen($lock_file,'w');fwrite($f,time());fclose($f);}
     
    //на сколько будем усыпать
    $SLEEP_US = llmConfig::get("CRON_SITEINDEXER_USLEEP",100);
    $MAIN_COOKIE = 'llm_xxx='.$site->domain_key;
     
    //получение главной страницы
    $http = new llmHTTP($MAIN_COOKIE);
    $page = $http->get($site->url,$status,$current_url);
     
    if(LLM_DEBUG) {
     
        $needle = "<!-- ".md5($MAIN_COOKIE)." -->";
    }
     
    $content_type_check = $http->checkContentType($page);
    if (!$content_type_check) $logger->log(LLM_LOG_ERROR,"Bad content type of main page");
     
    $is_installed = $http->checkLLMInstalled($page);
    if(LLM_DEBUG) $is_installed = true;
    if (!$is_installed) {
     
        //нечего тут делать, если код не установлен
        $logger->log(LLM_LOG_ERROR,"{$site->url} - llm.php code is not installed");
        cleanUp();
    }
     
    //беда какая-то с получением страниц
    if ($status!==LLMHTTP_STATUS_OK) {
     
        //нечего тут делать, если код не установлен
        $logger->log(LLM_LOG_ERROR,"Cannot fetch URL '$site->url'");
        cleanUp();
    }
     
    //получаем все ссылки на странице
    $links = $http->getPageLinks($page,$current_url);
    $page_title = $http->getPageTitle($page);
     
    //сохраняем морду
    $http->saveIndexedPage($site,$links,0,$current_url,$page_title);
    $saved_links[md5($current_url)] = 0;
     
    //первый уровень вложенности
    $inner_links1 = $http->getInnerLinks($site,$links);
    $inner_links2 = array();//а сюда будем собирать урлы второго уровня, постепенно
    foreach($inner_links1 as $inner_link) {
     
        //проверка наличия этого урла в уже сохраненных в текущем сеансе
        $url_hash = md5($inner_link);
        if (isset($saved_links[$url_hash])) continue;
     
        //если надо пропустить урл по его расширению, архив там или что-то такое
        if (llmHTTP::skipExtension($inner_link)) continue;
     
        //ищем подстроку игнорирования индексации
        $allow_index = true;
        if ($exclude_urls_size > 0) {
     
            foreach($exclude_urls as $eurl) {
         
                $pos = strpos($inner_link,$eurl);
                if ($pos!==false) {
             
                    $allow_index = false;
                    break;
                }
            }
        }
        // -->> $allow_index - разрешает индексирование данной страницы
     
        $page = $http->get($inner_link,$status,$current_url);
        $content_type_check = $http->checkContentType($page);
        if (!$content_type_check) continue;
        $links = $http->getPageLinks($page,$current_url);
     
        //это при редиректах на чужие сайты (клик по банеру или редиректной ссылке)
        $pos = strpos($current_url,$site->url);
        if ($pos===false) continue;
     
        //ищем установленный скрипт llm.php
        $is_installed = $http->checkLLMInstalled($page);
        if(LLM_DEBUG) $is_installed = true;
        if (!$is_installed) $allow_index = false;
        $page_title = $http->getPageTitle($page);
     
        if ($allow_index) $http->saveIndexedPage($site,$links,1,$current_url,$page_title);
        $saved_links[md5($current_url)] = 1;
     
        //собраем урлы для второго уровня вложенности среди ссылок на этой же странице
        $inner_tmp = $http->getInnerLinks($site,$links);
     
        foreach($inner_tmp as $inn_link)  {
            if (!in_array($inn_link,$inner_links2) && !isset($saved_links[md5($inn_link)]) && !in_array($inn_link,$inner_links1)) $inner_links2[] = $inn_link;
     
        }
        usleep($SLEEP_US);
    }
     
    //далее тоже самое со страницами второго уровня
    $inner_links2 = $http->getInnerLinks($site,$inner_links2);
    $count2 = 0;
    foreach($inner_links2 as $inner_link) {
     
        //если уже есть
        $url_hash = md5($inner_link);
        if (isset($saved_links[$url_hash])) continue;
     
        //если надо пропустить урл по его расширению, архив там или что-то такое
        if (llmHTTP::skipExtension($inner_link)) continue;
     
        //ищем подстроку игнорирования индексации
        $allow_index = true;
        if ($exclude_urls_size > 0) {
     
            foreach($exclude_urls as $eurl) {
         
                $pos = strpos($inner_link,$eurl);
                if ($pos!==false) {
             
                    $allow_index = false;
                    break;
                }
            }
        }
        // -->> $allow_index - разрешает индексирование данной страницы
     
        if ($allow_index) {
         
            $page = $http->get($inner_link,$status,$current_url);
            $content_type_check = $http->checkContentType($page);
            if (!$content_type_check) continue;
            $links = $http->getPageLinks($page,$current_url);
         
            //это при редиректах на чужие сайты (клик по банеру или редиректной ссылке)
            $pos = strpos($current_url,$site->url);
            if ($pos===false) continue;
         
            //ищем установленный скрипт llm.php
            $is_installed = $http->checkLLMInstalled($page);
            if(LLM_DEBUG) $is_installed = true;
            $page_title = $http->getPageTitle($page);
         
            if ($is_installed) $http->saveIndexedPage($site,$links,2,$current_url,$page_title);
            $saved_links[md5($current_url)] = 2;
     
            usleep($SLEEP_US);
        }
     
        //если стоит ограничение
        $count2++;
        if ($count2 > $MAX_LEVEL2_PAGES) break;
    }
     
    //сохранение в лог
    $TIME_END = time();
    $log_str = "INDEXING SITE: $site->url, pages[0] = 1, pages[1] = ".sizeof($inner_links1).", pages[2] = {$count2}, time = ".($TIME_END - $TIME_START)." seconds";
    $logger->log(LLM_LOG_NOTICE,$log_str);
     
    //возобновляем соединение
    $database->ping();
    //обновляем в табличке сайтов поле о том, что сайт уже проиндексирован
    $database->setQuery("UPDATE sites SET cron_index = 0 WHERE id = '{$SITE_ID}'");
    $database->query();
     
    cleanUp();
     
     
    //красивый выход
    function cleanUp() {
     
        global $logger,$lock_file;
     
        //пишем лог
        $logger->save();
        if(!LLM_DEBUG) unlink($lock_file);
        exit(); 
    }
    ?>
    Подскажите как решить проблему
     

    Вложения:

    • ls_20100610.zip
      Размер файла:
      294,4 КБ
      Просмотров:
      7
  2. vhome

    vhome Создатель

    Регистр.:
    6 авг 2012
    Сообщения:
    37
    Симпатии:
    35
    У вас в функцию getPageTitle
    PHP:
    function getPageTitle(& $page) {
       
            
    preg_match("|<head>.*<title>(.*)</title>.*</head>|Umsi",$page,$mt);
           
            
    $title = isset($mt[1]) ? $mt[1] : "";
            return 
    trim($title);
        }
    страница передается по ссылке возможно из за этого бок.
    Хотя в других функциях передается экземпляром.
    Попробуйте убрать & и поганять
     
  3. Sergo_Sev

    Sergo_Sev Творец

    Регистр.:
    14 июн 2008
    Сообщения:
    571
    Симпатии:
    188
    Суть так и не понял, но после замены всё заработало

    Код:
    *Заменил это
    |<head>.*<title>(.*)</title>.*</head>|Umsi
     
    *На это
    |<title.*?>(.*)</title>|sei
     
  4. briu

    briu Писатель

    Регистр.:
    3 окт 2012
    Сообщения:
    0
    Симпатии:
    0
    Добрый день! Написал цикл, достает данные из таблицы в базе данных, но выдает ошибку, помогите пожалуйста разобраться, а то сам не могу понять в чем причина:
    PHP:
    <?php
    $result
    mysql_query"SELECT name, surname, radio0 FROM jos_chronoforms_badmintonminsk1",$db);
    $myrowmysql_fetch_array($result);
     
     
    if (isset(
    $_POST['radio0']))      {$radio0 $_POST['radio0'];}
     
    if (
    $radio0 == 'Про')
    {
    do
    {
    printf ("<table width='70%' class='turnir'>
    <tbody>
    <tr class='turshapka'>
    <td>&nbsp;Игроки</td>
    <td>&nbsp;Статус</td>
    <td>&nbsp;Статус</td>
    </tr>
    <tr>
    <td>%s, %s</td>
    <td class='podano'>&nbsp;Заявка принята</td>
    <td class='podano'>&nbsp;Про</td>
    </tr>
    </tbody>
    </table>"
    $myrow=["surname"],$myrow=["name"]);
    }
    while( 
    $myrowmysql_fetch_array($result));
     
    }
     
     
     
     
     
    ?>
    При запуске вадает ошибку Parse error: syntax error, unexpected '[' in I:\home\localhost\www\phpsite\lessons.php on line 99,
    это там где в функции printf задаем значения маркерам: </table>", $myrow=["surname"],$myrow=["name"]); Вот эта строка.
    Не могу понять, что не устраивает интерпретатор в квадратных скобках.
    PS: В пхп только начинаю разбираться, строго не судите.
    PPS: Заранее приношу извинения, если задаю вопрос не в том месте, просто проблема есть, а тему создавать пока не могу.
     
  5. Runapa

    Runapa Постоялец

    Регистр.:
    30 окт 2010
    Сообщения:
    63
    Симпатии:
    5
    $myrow=["surname"],$myrow=["name"]);

    Вроде так надо:


    $myrow["surname"],$myrow["name"]);
     
    briu нравится это.
  6. briu

    briu Писатель

    Регистр.:
    3 окт 2012
    Сообщения:
    0
    Симпатии:
    0
    Да, спасибо, невнимательно посмотрел.
    Но все равно, то что хотел не получил. Возможно кто-нибудь подскажет как лучше сделать, опишу подробнее проблему. НА джумла-сайте есть компонент формы chrono forms, он заносит данные в таблицу, я хочу сделать, чтобы данные из этой таблицы выводились в html-таблицу, в форме есть радио-кнопки и исходя из выбора посетителя нужно занести его в одну из трех таблиц.
    Вот что я сделал:
    PHP:
    <?php
    $result
    mysql_query"SELECT name, surname, radio0 FROM jos_chronoforms_badmintonminsk1",$db);
    $myrowmysql_fetch_array($result);
     
    if (
    $radio0 == 'Про')
    {
    do
    {
    printf ("<table width='70%' class='turnir'>
    <tbody>
    <tr class='turshapka'>
    <td>&nbsp;Игроки</td>
    <td>&nbsp;Статус</td>
    <td>&nbsp;Статус</td>
    </tr>
    <tr>
    <td>%s, %s</td>
    <td class='podano'>&nbsp;Заявка принята</td>
    <td class='podano'>&nbsp;Про</td>
    </tr>
    </tbody>
    </table>"
    $myrow["surname"],$myrow["name"]);
    }
    while( 
    $myrowmysql_fetch_array($result));
     
    }
     
     
     
     
     
    ?>
    После заношу в таблицу результат с про(один из вариантов в радио-кнопках), но ничего не выводится, правильно ли я делаю в инструкции if и,возможно, существует другой подход более подходящий в данном случае.
     
  7. Runapa

    Runapa Постоялец

    Регистр.:
    30 окт 2010
    Сообщения:
    63
    Симпатии:
    5
    PHP:
    [/COLOR][/COLOR]
    [COLOR=#000000][COLOR=#007700]<?php
    $result
    mysql_query"SELECT name, surname, radio0 FROM jos_chronoforms_badmintonminsk1",$db);
    $myrowmysql_fetch_array($result);
     
    if (
    $myrow["radio0"] == 'Про')
    {
    do
    {
    printf ("<table width='70%' class='turnir'>
    <tbody>
    <tr class='turshapka'>
    <td>&nbsp;Игроки</td>
    <td>&nbsp;Статус</td>
    <td>&nbsp;Статус</td>
    </tr>
    <tr>
    <td>%s, %s</td>
    <td class='podano'>&nbsp;Заявка принята</td>
    <td class='podano'>&nbsp;Про</td>
    </tr>
    </tbody>
    </table>"
    $myrow["surname"],$myrow["name"]);
    }
    while( 
    $myrowmysql_fetch_array($result));
    }[/
    COLOR][/COLOR]
     
     
     
     
    [
    COLOR=#000000][COLOR=#007700]



    И вероятно надо заменить Про на Pro.

    Так же такой способ написания кода не очень удобен. Мне в своё время помог вот этот пост.
     
  8. briu

    briu Писатель

    Регистр.:
    3 окт 2012
    Сообщения:
    0
    Симпатии:
    0

    Загуглил насчет
    [/COLOR], так и не понял для чего он тут. За статью спасибо, там еще много чего интересного нашел.
     
  9. Runapa

    Runapa Постоялец

    Регистр.:
    30 окт 2010
    Сообщения:
    63
    Симпатии:
    5
    color это глюк форума.


    <?php
    $result
    = mysql_query( "SELECT name, surname, radio0 FROM jos_chronoforms_badmintonminsk1",$db);$myrow= mysql_fetch_array($result);

    if (
    $myrow["radio0"] == 'Про')
    {
    do
    {
    printf ("<table width='70%' class='turnir'>
    <tbody>
    <tr class='turshapka'>
    <td>&nbsp;Игроки</td>
    <td>&nbsp;Статус</td>
    <td>&nbsp;Статус</td>
    </tr>
    <tr>
    <td>%s, %s</td>
    <td class='podano'>&nbsp;Заявка принята</td>
    <td class='podano'>&nbsp;Про</td>
    </tr>
    </tbody>
    </table>"
    , $myrow["surname"],$myrow["name"]);
    }
    while(
    $myrow= mysql_fetch_array($result));
    }