pcntl_fork()函数

时间:2010-09-14 07:41:02

标签: php web-crawler pcntl

因为抓取网页可能会耗费大量时间,所以我想让pcntl_fork()帮助我创建多个子代,以便将代码分割成部分。

  1. 主 - 抓取域名
  2. 儿童 - 收到链接后,儿童必须抓取域名中的链接
  3. 儿童 - 接收新链接时必须与2.相同。
  4. 我可以根据需要制作多少,或者我是否必须设置最多的孩子?

    这是我的代码:

    class MyCrawler extends PHPCrawler 
    {
    
    
      function handlePageData(&$page_data) 
      { // CHECK DOMEIN
    $domain = $_POST['domain'];
    $keywords = $_POST['keywords'];
    //$tags = get_meta_tags($page_data["url"]);
    //$iKeyFound = null;
    
    
    $find = $keywords;
    $str = file_get_contents($page_data["url"]);
    if(strpos($str, $find) == true && $page_data["received"] == true)
    {           
        $keywords = $_POST['keywords'];
        if($page_data["header"]){
        echo "<table border='1' >";
        echo "<tr><td width='300'>Status:</td><td width='500'> ".strtok($page_data["header"], "\n")."</td></tr>";}
        else "<table border='1' >";
    
        // PRINT EERSTE LIJN
    
        echo "<tr><td>Page requested:</td><td> ".$page_data["url"]."</td></tr>";
        // PRINT STATUS WEBSITE
    
        // PRINT WEBPAGINA
        echo "<tr><td>Referer-page:</td><td> ".$page_data["referer_url"]."</td></tr>";
    
        // CONTENT ONTVANGEN?
        if ($page_data["received"]==true)
          echo "<tr><td>Content received: </td><td>".$page_data["bytes_received"] / 8 . " Kbytes</td></tr></table>";
        else
          echo "<tr><td>Content:</td><td> Not received</td></tr></table>";
    
    
        $domain = $_POST['domain'];
        $link = mysql_connect('localhost', 'crawler', 'DRZOIDBERGGG');
    
        if (!$link) 
        {
            die('Could not connect: ' . mysql_error());
        }
    
        mysql_select_db("crawler");
        if(empty($page_data["referer_url"]))
        $page_data["referer_url"] = $page_data["url"];
    
        strip_tags($str, '<p><b>');
        $matches = $keywords;
        //$match = preg_match_all("'/<(*.?)(*.?)>(*.?)'".$keywords."'(*.?)<\/($1)>/'", $str, $matches, PREG_SET_ORDER);
        //echo $match;
    
        $doc = new DOMDocument();
        $doc->loadHTML($str);
    
        $xPath = new DOMXpath($doc);
        $xPathQuery = "//text()[contains(translate(.,'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), '".strtoupper($keywords)."')]";
        $elements = $xPath->query($xPathQuery);
    
        if($elements->length > 0){
    
        foreach($elements as $element){
            print "Gevonden: " .$element->nodeValue."<br />";
        }}
    
        $result = mysql_query("SELECT * FROM crawler WHERE data = '".$element->nodeValue."' ") ;
    
        if(mysql_num_rows($result)>0)
        echo 'Column already exist';
    
        else{ 
        echo 'added';
        mysql_query("INSERT INTO crawler (id, domain, url, keywords, data) VALUES ('', '".$page_data["referer_url"]."', '".$page_data["url"]."', '".$keywords."', '".$element->nodeValue. "' )");
        }
    
        echo '<br>';
        echo "<br><br>";
        echo str_pad(" ", 5000); // "Force flush", workaround
        flush();
    
    
    
    }
    

    FORGOT TO SAY:我需要一个WIN x(86)32位解决方法!

    因为我的客户端不支持它。

3 个答案:

答案 0 :(得分:2)

我想知道你是否会因为Gearman这样的事情而得到更好的服务。

这是一个在您的系统上运行的作业管理器,您可以向其提交作业(如果您愿意,可以通过php),然后将它们分配给工作人员(再次使用php编写),然后向他们报告结果。它非常强大和灵活,您可以让它运行更多的工作人员来处理更多的工作量。

答案 1 :(得分:0)

shell_exec做了但不知道如何使用。

答案 2 :(得分:0)