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

Форум PHP

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

 

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

вид форума:
Линейный форум Структурный форум

тема: Различия windows и freebsd
 
 автор: Icen   (08.07.2008 в 05:35)   письмо автору
 
 

Здравствуйте, господа программисты.
Я написал новостной граббер. Суть его работы такова, он авторизуется считывает заголовки новостей, затем считывает сами новости, затем все новые новости отправляет на указанный адрес. Но вот в чём собственно проблема, под Denwer-ом нормально новости отправляет, под FreeBSD приходят пустые новости. Вот исходный код:


<?
$EMail = "mail@host.ru";
$MaxReload = 100;

//********************************* rosan.su ***********************************
$rLogin = "qwerty";
$rPassword = "12345";
$rHost = "http://www.rosan.su/dealers/";
$rAuthString = "login=$rLogin&password=$rPassword";
$rAuthPage = "http://www.rosan.su/dealers/auth.php";
$rParseString = "#<a href='(.+?)' class=\"linkb\">(.+?)</a>.*?<span class=\"text\">(.+?)</span>#is";
$rLinkIndex = 1;
$rFileName = "rosan.dat";
//******************************************************************************

//******************************* awm-trade.ru *********************************
$aLogin = "qwerty";
$aPassword = "12345";
$aHost = "http://www.awm-trade.ru";
$aAuthString = "login=$aLogin&password=$aPassword&auth=войти";
$aAuthPage = "http://awm-trade.ru/index.php5?module=users&class=auth";
$aParseString = "#<a.*?class=\"newsDealersDate\">(.+?)</a>.*?<a href=\"(.+?)\" class=\"headerDealersNews\">(.+?)</a>#is";
$aLinkIndex = 2;
$aFileName = "awm-trade.dat";
//******************************************************************************

function EmptyMass($Mass)
{
    for($i=1;$i<=3;$i++)
        foreach($Mass[$i] as $key=> $value)
            if($Mass[$i][$key]!="")
                return 1;
    return 0;
}

function LoadHeadingsNews($AuthPage,$AuthString)
{
    $SessID = str_replace('\\', '/', dirname(__FILE__)) . 'sessid.txt';
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$AuthPage);
    curl_setopt($ch, CURLOPT_FAILONERROR, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 3);
    curl_setopt($ch, CURLOPT_POST, 1);
    if($AuthString)
    {
        curl_setopt($ch, CURLOPT_POSTFIELDS, $AuthString);
        echo "> Загружаю старницу загаловков новостей;<br>";
    }
    else echo "> Загружаю старницу новостей;<br>";
    curl_setopt($ch, CURLOPT_COOKIEFILE, $SessID);
    curl_setopt($ch, CURLOPT_COOKIEJAR, $SessID);
    curl_setopt($ch, CURLOPT_NOBODY, 0);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    $NewsPage = curl_exec($ch);
    curl_close($ch);

    return $NewsPage;
}

function LoadNews($Host,$AuthPage,$AuthString,$ParseString,$LinkIndex,$FileName)
{
    global $MaxReload, $Headers, $EMail;
    preg_match_all($ParseString,LoadHeadingsNews($AuthPage,$AuthString),$OuterMass);
    unset($OuterMass[0]);
    echo "<b>> Выбираю данные со станицы заголовков новостей в массив;<br></b>";

    if(!EmptyMass($OuterMass))
    {
        echo "<b>> Данные не обнаружены, перезагружаю страницу заголовков новостей;<br><br></b>";
        if($MaxReload)
        {
            sleep(1);
            $MaxReload--;
            LoadNews($Host,$AuthPage,$AuthString,$ParseString,$LinkIndex,$FileName);
        }
        return;
    }

    $FileDisc = fopen($FileName, "r") or die("<b>> Не могу найти файл $FileName;<br></b>");
    if(filesize($FileName))
    {
        $OldNews = fread($FileDisc, filesize($FileName));
        echo "<b>> Считал данные из временного файла;<br></b>";
    }
    fclose($FileDisc);

    echo "<b>> Ищу последнюю отправленную новость;<br></b>";

    for($key=0;$key<count($OuterMass[$LinkIndex]);$key++)
        if(substr_count($OldNews, $OuterMass[$LinkIndex][$key]))
            break;
    if($key)
    {
        echo "<b>> Записываю текущую последнюю новость;<br></b>";
        $FileDisc = fopen($FileName, "w") or die("<b>> Не могу найти файл $FileName;<br></b>");
        fputs($FileDisc,$OuterMass[$LinkIndex][0]);
        fclose($FileDisc);

    }
    else
        echo "<b>> Новых новостей не найдено;<br></b>";

    $Headers  = "Content-type: text/html; charset=windows-1251 \r\nFrom: News from $Host \r\nBcc: $email \r\n";

    if($key)
    {
        echo "<b>> Отправляю письма с новостями;<br></b>";
        while($key--)
        {
            $Mail = LoadHeadingsNews($Host."".$OuterMass[$LinkIndex][$key],0);
            $Mail = str_replace("a href=\"", "a href=\"$Host", $Mail);
            $Mail = str_replace("a href='", "a href='$Host", $Mail);
            mail($EMail,"Новости с $Host",$Mail,$Headers);
        }
    }
     echo "<b>> Загрузка новостей с $Host, завершена;</b><br><br>";
}

LoadNews($rHost,$rAuthPage,$rAuthString,$rParseString,$rLinkIndex,$rFileName);
LoadNews($aHost,$aAuthPage,$aAuthString,$aParseString,$aLinkIndex,$aFileName);
?>


Боду очень благодарен за Ваши советы и предложения!

   
 
 автор: Icen   (08.07.2008 в 12:43)   письмо автору
 
   для: Icen   (08.07.2008 в 05:35)
 

Неужели нет ни у кого, никаких догадок по этому поводу :)

   
 
 автор: Loki   (08.07.2008 в 16:25)   письмо автору
 
   для: Icen   (08.07.2008 в 05:35)
 

Я бы начал проверку с прав на файлы и регистра их имен. Затем бы проверил что регулярное выражение в обоих системах выполняется одинаково - такие случаи науке тоже известны:) А вообще диагностика очевидна: искать на каком этапе теряются данные.

   
 
 автор: Icen   (09.07.2008 в 16:18)   письмо автору
 
   для: Loki   (08.07.2008 в 16:25)
 

Проверил, регулярные выражения. Ссылки выбирает правильно. Также поставил самые высокие права на файл с сессией. Всё бесполезно. Проблема вот в этом куске кода:


<?
function LoadHeadingsNews($AuthPage,$AuthString) 
{ 
    $SessID = str_replace('\\', '/', dirname(__FILE__)) . 'sessid.txt'; 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL,$AuthPage); 
    curl_setopt($ch, CURLOPT_FAILONERROR, 1); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 3); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    if($AuthString) 
    { 
        curl_setopt($ch, CURLOPT_POSTFIELDS, $AuthString); 
        echo "> Загружаю старницу загаловков новостей;<br>"; 
    } 
    else echo "> Загружаю старницу новостей;<br>"; 
    curl_setopt($ch, CURLOPT_COOKIEFILE, $SessID); 
    curl_setopt($ch, CURLOPT_COOKIEJAR, $SessID); 
    curl_setopt($ch, CURLOPT_NOBODY, 0); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    $NewsPage = curl_exec($ch); 
    curl_close($ch); 

    return $NewsPage; 
}
?>


после вызова функции:
LoadHeadingsNews($Host."".$OuterMass[$LinkIndex][$key],0);

переменная $NewsPage имеет пустое значение.

P.S.: Начинаю потихоньку рвать волосы на голове .... :)

   
 
 автор: Icen   (10.07.2008 в 17:59)   письмо автору
 
   для: Icen   (09.07.2008 в 16:18)
 

Может я что то неправильно сделал с cURL???

   
 
 автор: Icen   (10.07.2008 в 17:59)   письмо автору
 
   для: Icen   (09.07.2008 в 16:18)
 

Может я что то неправильно сделал с cURL???