不知怎麼下主題??

edited 十月 2013 in PHP新手區
就是我想用for 迴圈去讀取網頁,
假設迴圈要跑十次,
每次讀取的網頁都不同,
但是遇到一種情況,
就是假設第二次讀的網頁很慢,或是網頁有問題,
結果導致第二次以後的都不能執行,
那麼程式要怎麼寫才能跳過第二次,
就是說可能一段時間網頁沒有回應的話,就跳過

請問要參考什麼函式才能解決呢??

原始討論: http://twpug.net/x/modules/newbb/viewtopic.php?topic_id=840

評論

  • edited 九月 2005
    tmlodgar 寫道:
    就是我想用for 迴圈去讀取網頁,
    假設迴圈要跑十次,
    每次讀取的網頁都不同,
    但是遇到一種情況,
    就是假設第二次讀的網頁很慢,或是網頁有問題,
    結果導致第二次以後的都不能執行,
    那麼程式要怎麼寫才能跳過第二次,
    就是說可能一段時間網頁沒有回應的話,就跳過

    請問要參考什麼函式才能解決呢??

    這樣的情況建議把程式post上來
  • edited 九月 2005
    tmlodgar 寫道:
    就是我想用for 迴圈去讀取網頁,
    假設迴圈要跑十次,
    每次讀取的網頁都不同,
    但是遇到一種情況,
    就是假設第二次讀的網頁很慢,或是網頁有問題,
    結果導致第二次以後的都不能執行,
    那麼程式要怎麼寫才能跳過第二次,
    就是說可能一段時間網頁沒有回應的話,就跳過

    請問要參考什麼函式才能解決呢??

    請問你是用什麼樣的功能去做呢??
    應該是用fsockopen
    fsockopen("URL", 443, $errno, $errstr, 30);
    其中的$errno $errstr 如果有錯的時候,
    可以看看其中的內容,
    通常網頁有問題就會回傳 404 之類的 http 錯誤

    還是建議把 code 貼出來囉
  • edited 九月 2005
    感謝大大回答,
    我先貼我的code好了,
    可能很難看懂
    麻煩大大了

    <?php
    $ecnum = "3.-.-.-";

    $con=1;

    $split=split("\.","$ecnum",4);

    if($split[3] != '-') {$con=1;}
    elseif($split[2] != '-') {$con=2;}
    elseif($split[1] != '-') {$con=3;}
    elseif($split[0] != '-') {$con=4;}
    else {echo "error!"; exit;}

    switch($con)
    {
    case '1' :
    con1($ecnum);
    break;
    case '2' :
    con2($ecnum);
    break;
    case '3' :
    con3($ecnum);
    break;
    case '4' :
    con4($ecnum);
    break;
    default :
    echo "error!";
    exit;
    }



    function con1($ecnum)
    {
    global $codelist,$codeindex,$split;

    $split=split("\.","$ecnum",4);
    echo "$split[0]_$split[1]_$split[2]_$split[3].txt";
    echo "ecnum is : ".$ecnum."<br>";
    $file = 'http://www.ebi.ac.uk/thornton-srv/databases/cgi-bin/enzymes/GetPage.pl?ec_number='.$ecnum;
    $fp = fopen($file,'r');
    $codeindex=0;

    while(!feof($fp)){
    $sub="";
    $line=fgetss($fp,4096,"<a>");
    if(ereg("pdbcode",$line)){
    $pos = strpos ($line, 'pdbcode');
    $pos+=8;
    while(substr($line,$pos,1) != '"')
    {
    $sub .= substr($line,$pos,1);
    $pos++;
    }
    if(!in_array($sub,$codelist))
    {
    //echo $sub."<br>";
    $codelist[$codeindex]=$sub;
    $codeindex++;
    }
    }
    }
    fclose($fp);
    echo "<hr>";

    $fw=fopen("c:\\$split[0]_$split[1]_$split[2]_$split[3].txt","a+");
    for($i=0;$i<$codeindex;$i++)
    fputs($fw,$codelist[$i]."\r\n");

    fclose($fw);
    }//end con1()

    function con2($ecnum)
    {
    $file = 'http://www.ebi.ac.uk/thornton-srv/databases/cgi-bin/enzymes/GetPage.pl?ec_number='.$ecnum;
    $fp = fopen($file,'r');
    $count=0;

    while(!feof($fp)){
    $sub="";
    $line=fgetss($fp,8192,"<a>");
    if(ereg("ec_number=[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+",$line)){
    if(!ereg("\[\-\]",$line))
    {
    $nextline=fgetss($fp,8192,"<a>");
    if(!ereg("\[\-\]",$nextline))
    {
    //找出ec_number存在array $list[]中
    $pos = strpos ($line, 'ec_number');
    $pos += 10;
    while(substr($line,$pos,1) != '"')
    {
    $sub .= substr($line,$pos,1);
    $pos++;
    }
    $list[$count]=$sub;
    $count++;
    }//end if
    }//end if
    } //end if
    }//end while
    fclose($fp);

    for($i=0;$i<$count;$i++) {
    //echo "$list[$i]"."<br>";
    con1($list[$i]);
    }
    }//end con2()

    function con3($ecnum)
    {
    $file = 'http://www.ebi.ac.uk/thornton-srv/databases/cgi-bin/enzymes/GetPage.pl?ec_number='.$ecnum;
    $fp = fopen($file,'r');
    $count=0;

    while(!feof($fp)){
    $sub="";
    $line=fgetss($fp,8192,"<a>");
    if(ereg("ec_number=[0-9]+\.[0-9]+\.[0-9]+\.\-",$line))
    {
    if(!ereg("\[\-\]",$line))
    {
    $nextline=fgetss($fp,8192,"<a>");
    if(!ereg("\[\-\]",$nextline))
    {
    //找出ec_number存在array $list[]中
    $pos = strpos ($line, 'ec_number');
    $pos += 10;
    while(substr($line,$pos,1) != '"')
    {
    $sub .= substr($line,$pos,1);
    $pos++;
    }
    $list[$count]=$sub;
    $count++;
    }//end if
    }//end if
    } //end if
    }//end while
    fclose($fp);

    for($i=0;$i<$count;$i++) {
    //echo "$list[$i]"."<br>";
    con2($list[$i]);
    }
    }//end con3()

    function con4($ecnum)
    {
    $file = 'http://www.ebi.ac.uk/thornton-srv/databases/cgi-bin/enzymes/GetPage.pl?ec_number='.$ecnum;
    $fp = fopen($file,'r');
    $count=0;

    while(!feof($fp)){
    $sub="";
    $line=fgetss($fp,8192,"<a>");
    if(ereg("ec_number=[0-9]+\.[0-9]+\.\-\.\-",$line))
    {
    if(!ereg("\[\-\]",$line))
    {
    $nextline=fgetss($fp,8192,"<a>");
    if(!ereg("\[\-\]",$nextline))
    {
    //找出ec_number存在array $list[]中
    $pos = strpos ($line, 'ec_number');
    $pos += 10;
    while(substr($line,$pos,1) != '"')
    {
    $sub .= substr($line,$pos,1);
    $pos++;
    }
    $list[$count]=$sub;
    $count++;
    }//end if
    }//end if
    } //end if
    }//end while
    fclose($fp);

    for($i=0;$i<$count;$i++) {
    //echo "$list[$i]"."<br>";
    con3($list[$i]);
    }
    }//end con4()

    ?>
  • edited 九月 2005
    就我實際run一遍後發現程式本身沒什麼問題
    主要還是卡在開啟太多網頁了

    有以下幾點提出給您參考看看
    1.fopen之後可先判斷開啟成功再往下處理
    2.各function中的
    while(substr($line,$pos,1) != '"')
    {
    $sub .= substr($line,$pos,1);
    $pos++;
    }
    用意為何?
    若只是要撈出$pos到"之間的字串
    那建議使用strstr跟strpos來抓取
    這樣會省掉不少處理時間
    3.如果可以,將抓取的範圍縮小會是比較適合的方式
    不然,您可以修改php.ini
    將max_execution_time設定成0
    這樣就不會有處理超時的問題,不過真的..真的..真的......不建議

    以上幾點希望能有所幫助
  • edited 九月 2005
    sam0228 寫道:
    就我實際run一遍後發現程式本身沒什麼問題
    主要還是卡在開啟太多網頁了

    有以下幾點提出給您參考看看
    1.fopen之後可先判斷開啟成功再往下處理
    2.各function中的
    while(substr($line,$pos,1) != '"')
    {
    $sub .= substr($line,$pos,1);
    $pos++;
    }
    用意為何?
    若只是要撈出$pos到"之間的字串
    那建議使用strstr跟strpos來抓取
    這樣會省掉不少處理時間
    3.如果可以,將抓取的範圍縮小會是比較適合的方式
    不然,您可以修改php.ini
    將max_execution_time設定成0
    這樣就不會有處理超時的問題,不過真的..真的..真的......不建議

    以上幾點希望能有所幫助

    嗯嗯,感謝大大的建議,

    關於第二點,
    大大的意思是說,
    $sub .= substr($line,strpos($line,'pdbcode')+8,strpos($line,'"'));
  • edited 九月 2005
    tmlodgar 寫道:
    sam0228 寫道:
    就我實際run一遍後發現程式本身沒什麼問題
    主要還是卡在開啟太多網頁了

    有以下幾點提出給您參考看看
    1.fopen之後可先判斷開啟成功再往下處理
    2.各function中的
    while(substr($line,$pos,1) != '"')
    {
    $sub .= substr($line,$pos,1);
    $pos++;
    }
    用意為何?
    若只是要撈出$pos到"之間的字串
    那建議使用strstr跟strpos來抓取
    這樣會省掉不少處理時間
    3.如果可以,將抓取的範圍縮小會是比較適合的方式
    不然,您可以修改php.ini
    將max_execution_time設定成0
    這樣就不會有處理超時的問題,不過真的..真的..真的......不建議

    以上幾點希望能有所幫助

    嗯嗯,感謝大大的建議,

    關於第二點,
    大大的意思是說,
    $sub .= substr($line,strpos($line,'pdbcode')+8,strpos($line,'"'));

    不好意思,不小心按到送出m(__)m
    上面是舉function con1()為例子,
    如果大大的意思是上面那樣寫的話,
    可能會有一個問題,
    就是 " 可能不止一次出現在 $line 中,
    那麼就無法抓到正確的position了。
  • edited 九月 2005
    tmlodgar 寫道:
    tmlodgar 寫道:
    sam0228 寫道:
    就我實際run一遍後發現程式本身沒什麼問題
    主要還是卡在開啟太多網頁了

    有以下幾點提出給您參考看看
    1.fopen之後可先判斷開啟成功再往下處理
    2.各function中的
    while(substr($line,$pos,1) != '"')
    {
    $sub .= substr($line,$pos,1);
    $pos++;
    }
    用意為何?
    若只是要撈出$pos到"之間的字串
    那建議使用strstr跟strpos來抓取
    這樣會省掉不少處理時間
    3.如果可以,將抓取的範圍縮小會是比較適合的方式
    不然,您可以修改php.ini
    將max_execution_time設定成0
    這樣就不會有處理超時的問題,不過真的..真的..真的......不建議

    以上幾點希望能有所幫助

    嗯嗯,感謝大大的建議,

    關於第二點,
    大大的意思是說,
    $sub .= substr($line,strpos($line,'pdbcode')+8,strpos($line,'"'));

    不好意思,不小心按到送出m(__)m
    上面是舉function con1()為例子,
    如果大大的意思是上面那樣寫的話,
    可能會有一個問題,
    就是 " 可能不止一次出現在 $line 中,
    那麼就無法抓到正確的position了。

    @"
    不過在
    while(substr($line,$pos,1) != '"')
    {
    $sub .= substr($line,$pos,1);
    $pos++;
    }

    不是一遇到'"'就break出來
    然後回到上一個while繼續抓取資料
    $line=fgetss($fp,4096,"<a>");
    嗎?
  • edited 九月 2005
    sam0228 寫道:
    tmlodgar 寫道:
    tmlodgar 寫道:
    sam0228 寫道:
    就我實際run一遍後發現程式本身沒什麼問題
    主要還是卡在開啟太多網頁了

    有以下幾點提出給您參考看看
    1.fopen之後可先判斷開啟成功再往下處理
    2.各function中的
    while(substr($line,$pos,1) != '"')
    {
    $sub .= substr($line,$pos,1);
    $pos++;
    }
    用意為何?
    若只是要撈出$pos到"之間的字串
    那建議使用strstr跟strpos來抓取
    這樣會省掉不少處理時間
    3.如果可以,將抓取的範圍縮小會是比較適合的方式
    不然,您可以修改php.ini
    將max_execution_time設定成0
    這樣就不會有處理超時的問題,不過真的..真的..真的......不建議

    以上幾點希望能有所幫助

    嗯嗯,感謝大大的建議,

    關於第二點,
    大大的意思是說,
    $sub .= substr($line,strpos($line,'pdbcode')+8,strpos($line,'"'));

    不好意思,不小心按到送出m(__)m
    上面是舉function con1()為例子,
    如果大大的意思是上面那樣寫的話,
    可能會有一個問題,
    就是 " 可能不止一次出現在 $line 中,
    那麼就無法抓到正確的position了。

    @"
    不過在
    while(substr($line,$pos,1) != '"')
    {
    $sub .= substr($line,$pos,1);
    $pos++;
    }

    不是一遇到'"'就break出來
    然後回到上一個while繼續抓取資料
    $line=fgetss($fp,4096,"<a>");
    嗎?

    嗯嗯,的確是

    舉個例子:
    假如說這是$line: : kkkk"kkk"aa"aapdbcode=1.2.3.4"
    那麼$pos就會指著 p 的地方
    $pos+8 會指著 1 的地方
    所以想要抓取 1.2.3.4
    是不是就只能用while去跑,配合 $pos++

    還是有更有效率的寫法 ^^
  • edited 九月 2005
    太長了,砍一點
    tmlodgar 寫道:

    嗯嗯,的確是

    舉個例子:
    假如說這是$line: : kkkk"kkk"aa"aapdbcode=1.2.3.4"
    那麼$pos就會指著 p 的地方
    $pos+8 會指著 1 的地方
    所以想要抓取 1.2.3.4
    是不是就只能用while去跑,配合 $pos++

    還是有更有效率的寫法 ^^

    以你剛剛的程式來說
    $sub .= substr($line,strpos($line,'pdbcode')+8,strpos($line,'"'));

    抓的會不正確
    因為strpos($line,'"')會抓到第一個"
    而我有舉另一個function strstr(string haystack, string needle)
    (可以上php官網查一下此函式的相關解釋)
    所以是
    $sub = substr(strstr($line, 'pdbcode'), 0, strpos(strstr($line, 'pdbcode'), '"') - 1);
    身邊沒php所以不確定位數有沒抓錯
    可能要靠你自己debug一下
  • edited 九月 2005
    嗯嗯,謝謝大大^^
Sign In or Register to comment.