如何加快这个 PHP 脚本的执行速度

Posted

技术标签:

【中文标题】如何加快这个 PHP 脚本的执行速度【英文标题】:How to speed up the execution of this PHP script 【发布时间】:2013-08-17 14:01:40 【问题描述】:

我编写了一个用于网页抓取的脚本,我从页面中获取每个链接并在代码中加载该 url,这工作非常缓慢,第一次输出大约需要 50 秒,完成大约 100 个链接需要一段时间,我不明白为什么它工作这么慢,我正在考虑缓存,但不知道这对我们有什么帮助。

1) 页面缓存或操作码缓存。

代码是:

public function searchForum()
        global $wpdb;
        $sUrl = $this->getSearchUrl();
        $this->logToCrawler();
        $cid = $this->getCrawlId();
        $html = file_get_dom($sUrl);

        $c=1;
        foreach($html('div.gridBlobTitle a:first-child') as $element)
            $post_page = file_get_dom($element->href);
            $post_meta = array();
            foreach($post_page('table#mytable img:first-child') as $img)
                if(isset($img->src))
                    $post_meta['image_main'] =  self::$forumurl.$img->src;          
                
                else
                    $post_meta['image_main']=NULL;
                
            

            foreach($post_page('table.preferences td:odd') as $elm)
                $post_meta[] = strip_tags($elm->getInnerText());
                unset($elm);
            

            /*Check if can call getPlainText for description fetch*/

            $object = $post_page('td.collection',2);
            $methodVariable = array($object, 'getPlainText');

            if(is_callable($methodVariable, true, $callable_name))
                $post_meta['description'] = utf8_encode($object->getPlainText());               
            
            else
                $post_meta['description'] = NULL;
            

            $methodVariable = array($object, 'getInnerText');
            if(is_callable($methodVariable, true, $callable_name))
                /*Get all the images we found*/
                $rough_html = $object->getInnerText();

                preg_match_all("/<img .*?(?=src)src=\"([^\"]+)\"/si", $rough_html, $matches); 
                $images = array_map('self::addUrlToItems',$matches[1]);
                $images = json_encode($images);
            

            if($post_meta[8]=='WTB: Want To Buy')
                $status='buy';
            
            else
                $status='sell';             
            
            $lastdate = strtotime(date('Y-m-d',strtotime("-1 month")));
            $listdate = strtotime(date('Y-m-d',strtotime($post_meta[9])));

            /*Check for date*/
            if($listdate>=$lastdate)

                $wpdb->query("INSERT 
                                    INTO tbl_scrubed_data SET 
                                    keywords='".esc_sql($this->getForumSettings()->search_meta)."',
                                    url_to_post='".esc_sql($element->href)."',
                                    description='".esc_sql($post_meta['description'])."',
                                    date_captured=now(),crawl_id='".$cid."',
                                    image_main='".esc_sql($post_meta['image_main'])."',
                                    images='".esc_sql($images)."',brand='".esc_sql($post_meta[0])."',
                                    series='".esc_sql($post_meta[1])."',model='".esc_sql($post_meta[2])."',
                                    watch_condition='".esc_sql($post_meta[3])."',box='".esc_sql($post_meta[4])."',
                                    papers='".esc_sql($post_meta[5])."',year='".esc_sql($post_meta[6])."',case_size='".esc_sql($post_meta[7])."',status='".esc_sql($post_meta[8])."',listed='".esc_sql($post_meta[9])."',
                                    asking_price='".esc_sql($post_meta[10])."',retail_price='".esc_sql($post_meta[11])."',payment_info='".esc_sql($post_meta[12])."',forum_id='".$this->getForumSettings()->ID."'");    

                unset($element,$post_page,$images);
             /*END: Check for date*/

        
        $c++;
    

注意: 1) 我正在使用 [Ganon DOM Parser][1] 来解析 HTML。 [1]:https://code.google.com/p/ganon/wiki/AccesElements 2) 在带有 WAMP、mysql 5.5 php 5.3、1 GB RAM 的 windows XP 上。 如果您需要更多信息,请发表评论。

谢谢

【问题讨论】:

您是否考虑过使用更快的解析器? @ignacio-vazquez-abrams :/ 我从没听说过 PHP 中有这种东西,你说的是 PHP Fast HTML parser 吗? 我说的是不同的解析器。哪个可能跑得更快。 我使用过 ganon:code.google.com/p/ganon,我发现它比简单的圆顶解析器更快。 【参考方案1】:

您需要弄清楚程序的哪些部分运行缓慢。有两种方法可以做到这一点。

1) 放入一些打印语句,打印出各个地方的时间,这样你就可以说“嘿,看,从这里到这里花了 5 秒钟。”

2) 使用像 xdebug 这样的分析器来运行您的程序并在它运行时对其进行分析,然后您就可以知道代码的哪些部分运行缓慢。

只看一个程序,你不能说“哦,那是加速的慢部分。”在不知道什么是慢的情况下,您可能会浪费时间加速那些不是慢的部分。

【讨论】:

以上是关于如何加快这个 PHP 脚本的执行速度的主要内容,如果未能解决你的问题,请参考以下文章

微调 Get-Counter 脚本以加快执行速度

如何加快sql查询执行速度?

加快我的 SQL 查询速度?它给出了执行超时错误

如何加快 PHPUnit + DBUnit 测试套件的执行速度?

PHP、sendmail 和传输 - 如何加快邮件发送速度

如何加快 Grails 测试执行