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

Sergo_Sev

Творец
Регистрация
14 Июн 2008
Сообщения
578
Реакции
193
Есть скрипт индексатор который собирает страницы и добавляет в базу с тайтлами этих страниц. Так вот тайтлы он парсит через раз и я не могу понять почему
Это файл 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 KB · Просмотры: 8
У вас в функцию getPageTitle
PHP:
function getPageTitle(& $page) {
   
        preg_match("|<head>.*<title>(.*)</title>.*</head>|Umsi",$page,$mt);
       
        $title = isset($mt[1]) ? $mt[1] : "";
        return trim($title);
    }
страница передается по ссылке возможно из за этого бок.
Хотя в других функциях передается экземпляром.
Попробуйте убрать & и поганять
 
Суть так и не понял, но после замены всё заработало

Код:
*Заменил это
|<head>.*<title>(.*)</title>.*</head>|Umsi
 
*На это
|<title.*?>(.*)</title>|sei
 
Добрый день! Написал цикл, достает данные из таблицы в базе данных, но выдает ошибку, помогите пожалуйста разобраться, а то сам не могу понять в чем причина:
PHP:
<?php
$result= mysql_query( "SELECT name, surname, radio0 FROM jos_chronoforms_badmintonminsk1",$db);
$myrow= mysql_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( $myrow= mysql_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: Заранее приношу извинения, если задаю вопрос не в том месте, просто проблема есть, а тему создавать пока не могу.
 
$myrow=["surname"],$myrow=["name"]);

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


$myrow["surname"],$myrow["name"]);
 
  • Нравится
Реакции: briu
$myrow=["surname"],$myrow=["name"]);

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


$myrow["surname"],$myrow["name"]);
Да, спасибо, невнимательно посмотрел.
Но все равно, то что хотел не получил. Возможно кто-нибудь подскажет как лучше сделать, опишу подробнее проблему. НА джумла-сайте есть компонент формы chrono forms, он заносит данные в таблицу, я хочу сделать, чтобы данные из этой таблицы выводились в html-таблицу, в форме есть радио-кнопки и исходя из выбора посетителя нужно занести его в одну из трех таблиц.
Вот что я сделал:
PHP:
<?php
$result= mysql_query( "SELECT name, surname, radio0 FROM jos_chronoforms_badmintonminsk1",$db);
$myrow= mysql_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( $myrow= mysql_fetch_array($result));
 
}
 
 
 
 
 
?>
После заношу в таблицу результат с про(один из вариантов в радио-кнопках), но ничего не выводится, правильно ли я делаю в инструкции if и,возможно, существует другой подход более подходящий в данном случае.
 
PHP:
[/COLOR][/COLOR]
[COLOR=#000000][COLOR=#007700]<?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));
}[/COLOR][/COLOR]
 
 
 
 
[COLOR=#000000][COLOR=#007700]


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

Так же такой способ написания кода не очень удобен. Мне в своё время помог вот этот Для просмотра ссылки Войди или Зарегистрируйся.
 
PHP:
[/COLOR][/COLOR][/COLOR][/COLOR]
[COLOR=#007700][COLOR=#000000][COLOR=#007700]<?php[/COLOR]
[COLOR=#007700]$result= mysql_query( "SELECT name, surname, radio0 FROM jos_chronoforms_badmintonminsk1",$db);[/COLOR]
[COLOR=#007700]$myrow= mysql_fetch_array($result);[/COLOR]
 
[COLOR=#007700]if ($myrow["radio0"] == 'Про')[/COLOR]
[COLOR=#007700]{[/COLOR]
[COLOR=#007700]do[/COLOR]
[COLOR=#007700]{[/COLOR]
[COLOR=#007700]printf ("<table width='70%' class='turnir'>[/COLOR]
[COLOR=#007700]<tbody>[/COLOR]
[COLOR=#007700]<tr class='turshapka'>[/COLOR]
[COLOR=#007700]<td>&nbsp;Игроки</td>[/COLOR]
[COLOR=#007700]<td>&nbsp;Статус</td>[/COLOR]
[COLOR=#007700]<td>&nbsp;Статус</td>[/COLOR]
[COLOR=#007700]</tr>[/COLOR]
[COLOR=#007700]<tr>[/COLOR]
[COLOR=#007700]<td>%s, %s</td>[/COLOR]
[COLOR=#007700]<td class='podano'>&nbsp;Заявка принята</td>[/COLOR]
[COLOR=#007700]<td class='podano'>&nbsp;Про</td>[/COLOR]
[COLOR=#007700]</tr>[/COLOR]
[COLOR=#007700]</tbody>[/COLOR]
[COLOR=#007700]</table>", $myrow["surname"],$myrow["name"]);[/COLOR]
[COLOR=#007700]}[/COLOR]
[COLOR=#007700]while( $myrow= mysql_fetch_array($result));[/COLOR]
[COLOR=#007700]}[/COLOR][/COLOR][/COLOR]
 
 
 
 
[COLOR=#007700][COLOR=#000000][COLOR=#007700]


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

Так же такой способ написания кода не очень удобен. Мне в своё время помог вот этот Для просмотра ссылки Войди или Зарегистрируйся.

Загуглил насчет
[/COLOR], так и не понял для чего он тут. За статью спасибо, там еще много чего интересного нашел.
 
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));
}
 
Назад
Сверху