2

4つのボットを同時に実行するクローラースクリプトがあります。各ボットは新しいタブで開かれ、通常は次のようになります。

1/ db への接続 + スクレイピングに必要な変数の設定。
2/ db から URL ターゲットを取得します。
3/ CURL または file_get_content を使用してコンテンツを取得します。
4/ simple_html_dom で「$html」を設定します。
5/ コンテンツをスクレイピングして操作する「エンジン」を含めます。
6/ 最後に - 問題がないかどうかを確認し、コンテンツを最適化してデータベースに保存し
ます。 7/ X リンクに対して実行します。X リンクの後、ページが更新され、クロール プロセスが続行されます。

すべてが魔法のように機能しました!しかし最近、数分後 (同じ時間ではありません)、すべてのボットが
停止し (エラーは発生しません)、3 つだけになることもあります...
Y 分ごとにページを更新する時間間隔を設定するスクリプトがあります。これは、
ボットが詰まっている場合にボットを機能させ続けることですが、この問題の解決策ではありません。

私はApacheのエラーログをチェックしましたが、奇妙なことは何も示していません。

何か考えはありますか?
縮小コード: (コメント付き)

ini_set('user_agent', 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5');
error_reporting(E_ALL);
include ("peulot/stations1.php");//with connection and vars
include_once('simple_html_dom.php');

//DEFINE VALUES:
/*
here vars are declared and set
*/

        echo "
            <script language=javascript>

            var int=self.setInterval(function(){ refresh2(); },".$protect.");

            var counter;

            function refresh2() { 
                geti();
                link = 'store_url_beta.php?limit_link=".$limit_link."&storage_much=".$dowhile."&jammed=".($jammed_count+=1)."&bot=".$sbot."&counter=';
                link = link+counter;
                window.location=link;
                } 

            function changecolor(answer)
                    {
                document.getElementById(answer).style.backgroundColor = \"#00FF00\";
                    }
            </script>";//this is the refresh if jammed


//some functions:
/*
function utf8_encode_deep --> for encoding
function hexbin --> for simhash fingerprint
function Charikar_SimHash --> for simhash fingerprint
function SimHashfingerprint --> for simhash fingerprint
*/              

        while ($i<=$dowhile)
            {

            //final values after crawling:
            $link_insert="";
            $p_ele_insert="";
            $title_insert="";
            $alt_insert="";
            $h_insert="";
            $charset="";
            $text="";
            $result_key="";
            $result_desc="";
            $note="";

            ///this connection is to check that there are links to crawl in data base... + grab the line for crawl.
            $sql = "SELECT * FROM $table2 WHERE crawl='notyet' AND flag_avoid $regex $bot_action";
            $rs_result = mysql_query ($sql); 
            $idr = mysql_fetch_array($rs_result);                           
            unset ($sql);
            unset ($rs_result);

              set_time_limit(0);

              $qwe++;

                    $target_url = $idr['live_link'];//set the link we are about to crawl now.
                    $matches_relate = $idr['relate'];//to insert at last
                    $linkid = $idr['id'];//link id to mark it as crawled in the end
                    $crawl_status = $idr['crawl'];//saving this to check if we update storage table or insert new row
                    $bybot_status = $idr['by_bot'];//saving this to check if we update storage table or insert new row

                    $status ="UPDATE $table2 SET crawl='working', by_bot='".$bot."', flag_avoid='$stat' WHERE id='$linkid'";
                    if(!mysql_query($status)) die('problem15');                 

                    $ch = curl_init(); 

                    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5'); 
                    curl_setopt($ch, CURLOPT_URL, $target_url); 
                    curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie.txt");
                    curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie.txt");
                    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
                    curl_setopt($ch, CURLOPT_HEADER, 0); 
                    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

                    $str = curl_exec($ch); 
                    curl_close($ch);

                    if (strlen($str)<100) 
                            {
                            //do it with file get content
                            }               
        if (strlen($html)>500)
        {

                            require("engine.php");//GENERATE FATAL ERROR IF CRAWLER ENGINE AND PARSER NOT AVAILABLE

                        flush();//that will flush a result without any refresh
                        usleep(300);                                

                                //before inserting into table storage check if it was crawled before and then decide if to insert or update:
                                if ($crawl_status=="notyet"&&$bybot_status=="notstored")
                                            {
                                            //insert values
                                            }
                                            else
                                            {
                                            //update values
                                            }

                        flush();//that will flush a result without any refresh
                        usleep(300);


                        if ($qwe>=$refresh) //for page refresh call
                            { 
                            $secounter++;//counter for session
                            //optimize data                         
                            echo "<script type='text/javascript'>function refresh() { window.location='store_url_beta.php?limit_link=".$limit_link."&counter=".$i."&secounter=".$secounter."&storage_much=".$dowhile."&jammed=".$jammed."&bot=".$sbot."'; } refresh(); </script>";                          
                            }
            }//end of if html is no empty.
            else
            {//mark a flag @4 and write title jammed!

            //here - will update the table and note that its not possible to crawl

                        if ($qwe>=$refresh) 
                            { 
                            $secounter++;//counter for session
                            //optimize data                         
                            echo "<script type='text/javascript'>function refresh() { window.location='store_url_beta.php?limit_link=".$limit_link."&counter=".$i."&secounter=".$secounter."&storage_much=".$dowhile."&jammed=".$jammed."&bot=".$sbot."'; } refresh(); </script>";                          

                            }
            }//end of else cant grab nothing
            unset($html);
        }//end of do while
            mysql_close(); 
            echo "<script language=javascript> window.clearInterval(int); </script>";

編集:
無限のテストとロギング方法(ジャックのアドバイスに従って)の後、何も見つかりませんでした!ボットが停止したときに発生する唯一のことは、Apache ログにあります。

 [Thu Oct 25 01:01:33 2012] [error] [client 127.0.0.1] File does not exist: C:/wamp/www/favicon.ico
 zend_mm_heap corrupted
 [Thu Oct 25 01:01:51 2012] [notice] Parent: child process exited with status 1 -- Restarting.
 [Thu Oct 25 01:01:51 2012] [notice] Apache/2.2.22 (Win64) mod_ssl/2.2.22 OpenSSL/1.0.1c PHP/5.3.13 configured -- resuming normal operations
 [Thu Oct 25 01:01:51 2012] [notice] Server built: May 13 2012 19:41:17
 [Thu Oct 25 01:01:51 2012] [notice] Parent: Created child process 736
 [Thu Oct 25 01:01:51 2012] [warn] Init: Session Cache is not configured [hint: SSLSessionCache]
 [Thu Oct 25 01:01:51 2012] [notice] Child 736: Child process is running
 [Thu Oct 25 01:01:51 2012] [notice] Child 736: Acquired the start mutex.
 [Thu Oct 25 01:01:51 2012] [notice] Child 736: Starting 200 worker threads.
 [Thu Oct 25 01:01:51 2012] [notice] Child 736: Starting thread to listen on port 80.
 [Thu Oct 25 01:01:51 2012] [notice] Child 736: Starting thread to listen on port 80.
 [Thu Oct 25 01:01:51 2012] [error] [client 127.0.0.1] File does not exist: C:/wamp/www/favicon.ico

この行は不思議です。どうすればいいのか本当にわかりません。助けてください!
[Thu Oct 25 01:01:51 2012] [通知] 親: 子プロセスがステータス 1 で終了しました -- 再起動しています。

4

1 に答える 1

0

これらの問題を見つける方法は、通常、単純な古いログに帰着します。

デバッグ メッセージ、行番号、メモリ使用量など、必要な情報を含む、長時間かかる可能性のある操作の前後に、各ワーカーが独自のログ ファイルにエントリを書き込むようにする必要があります。数回ジャムさせて、ログを分析します。

パターンがある場合 (つまり、ログが同じ時点でデータを表示しなくなる場合)、検索を絞り込むことができます。そうでない場合は、メモリの問題やその他の致命的なクラッシュに対処している可能性があります。

また、関係がないように思われる場合でも、最近セットアップで変更した可能性のあるものをたどるのに役立ちます。

于 2012-10-24T01:36:18.267 に答える