首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP中的多线程或并行处理

PHP中的多线程或并行处理
EN

Stack Overflow用户
提问于 2013-09-14 07:01:44
回答 1查看 3K关注 0票数 3

我正在处理高爸爸拍卖域名,他们提供了下载域名列表的一些方式。我确实开发了一个cron作业来下载和转储(insert)域到我的数据库表中。这个过程从下载到数据库需要几秒钟的时间。在这种情况下,域(记录)的总数为34000个条目。

第二,我需要更新数据库中每一个域的页面排名,总共34000条记录。我有PHP API,用于获取页面级别。Godaddy下载不提供页面排名细节,所以我必须分别获取和更新它。

现在的问题是,当需要获取页面排名时,然后将页面排名更新到数据库中需要花费太多的时间,总共需要34000个域。

我最近做了一个实验,通过cron工作来更新数据库中域的页面排名,只更新了13383个域名,总共更新了4个小时。因为它必须先获取,然后更新到数据库。这一切都发生在专用服务器上。

对于大量的域,有什么方法可以加快这一过程吗?我认为唯一的方法就是通过多任务来完成这个任务。

这是否有可能让100个任务同时获取页面排名并将其更新到数据库中?

如果您需要代码:

代码语言:javascript
复制
$sql = "SELECT domain from auctions";
    $mozi_get=runQuery($sql);

    while($results = mysql_fetch_array($mozi_get)){
        /* PAGERANK API*/
        if($results['domain']!='Featured Listings'){
            //echo $results['domain']."<br />"; 
            try 
                {
                  $url = new SEOstats("http://www.".trim($results['domain']));
                  $rank=$url->Google_Page_Rank();
                  if(!is_integer($rank)){
                    //$rank='0';
                   }
                } 
                catch (SEOstatsException $e) 
                {
                  $rank='0';
                }
                try 
                {
                  $url = new SEOstats(trim("http://".$results['domain']));
                  $rank_non=$url->Google_Page_Rank();
                  if(!is_integer($rank_non)){
                    //$rank_non='0';
                   }
                } 
                catch (SEOstatsException $e) 
                {
                  $rank_non='0';
                }




            $sql = "UPDATE auctions set rank='".$rank."',  rank_non='".$rank_non."' WHERE domain='".$results['domain']."'"; 
            runQuery($sql);
            echo $sql."<br />";
        }
    }

下面是我更新的p线程代码:

代码语言:javascript
复制
<?php
set_time_limit(0);
require_once("database.php");
include 'src/class.seostats.php';


function get_page_rank($domain) {

    try {

        $url = new SEOstats("http://www." . trim($domain));

        $rank = $url->Google_Page_Rank();

        if(!is_integer($rank)){
              $rank = '0';
         }


    } catch (SEOstatsException $e) {

        $rank = '0';
    }

    return $rank;
}

class Ranking extends Worker {
  public function run(){}
}

class Domain extends Stackable {

  public $name;
  public $ranking;

  public function __construct($name) {

    $this->name = $name;

  }

  public function run() {

    $this->ranking = get_page_rank($this->name);

    /* now write the Domain to database or whatever */

    $sql = "UPDATE auctions set rank = '" . $this->ranking . "' WHERE domain = '" . $this->name . "'"; 
    runQuery($sql);

  }

}

/* start some workers */
$workers = array();
while (@$worker++ < 8) {
  $workers[$worker] = new Ranking();
  $workers[$worker]->start();
}

/* select auctions and start processing */

$domains = array();

$sql = "SELECT domain from auctions"; // RETURNS 55369 RECORDS

$domain_result = runQuery($sql);

while($results = mysql_fetch_array($domain_result)) {

  $domains[$results['domain']] = new Domain($results['domain']);
  $workers[array_rand($workers)]->stack($domains[$results['domain']]);

}


/* shutdown all workers (forcing all processing to finish) */
foreach ($workers as $worker)
  $worker->shutdown();

/* we now have ranked domains in memory and database */
var_dump($domains);
var_dump(count($domains));
?>

任何帮助都将不胜感激。谢谢

EN

回答 1

Stack Overflow用户

发布于 2013-09-15 19:25:59

下面是一个允许您多线程操作的线程示例.我已经选择了工人模型,并正在使用8名工人,您使用多少工人取决于您的硬件和服务收到的请求.我从来没有使用过SEOstats或godaddy域拍卖,我不确定CSV字段,将页面排名的获取留给您.

代码语言:javascript
复制
<?php
define ("CSV", "https://auctions.godaddy.com/trpSearchResults.aspx?t=12&action=export");

/* I have no idea how to get the actual page rank */
function get_page_rank($domain) {
  return rand(1,10);
}

class Ranking extends Worker {
  public function run(){}
}

class Domain extends Stackable {
  public $auction;
  public $name;
  public $bids;
  public $traffic;
  public $valuation;
  public $price;
  public $ending;
  public $type;
  public $ranking;

  public function __construct($csv) {
    $this->auction = $csv[0];
    $this->name = $csv[1];
    $this->traffic = $csv[2];
    $this->bids = $csv[3];
    $this->price = $csv[5];
    $this->valuation = $csv[4];
    $this->ending = $csv[6];
    $this->type = $csv[7];
  }

  public function run() {
    /* we convert the time to a stamp here to keep the main thread moving */
    $this->ending = strtotime(
      $this->ending);

    $this->ranking = get_page_rank($this->name);

    /* now write the Domain to database or whatever */
  }
}

/* start some workers */
$workers = array();
while (@$worker++ < 8) {
  $workers[$worker] = new Ranking();
  $workers[$worker]->start();
}

/* open the CSV and start processing */
$handle = fopen(CSV, "r");
$domains = array();
while (($line = fgetcsv($handle))) {
  $domains[$line[0]] = new Domain($line);
  $workers[array_rand($workers)]->stack(
    $domains[$line[0]]);
}

/* cleanup handle to csv */
fclose($handle);

/* shutdown all workers (forcing all processing to finish) */
foreach ($workers as $worker)
  $worker->shutdown();

/* we now have ranked domains in memory and database */
var_dump($domains);
var_dump(count($domains));
?>

问题:

  1. 对,8名工人
  2. 工作人员按照堆栈()d的顺序执行Stackable对象,这一行选择一个随机工作人员来执行Stackable
  3. 您可以在执行期间在主进程中遍历$domains列表,在执行过程中检查每个可堆栈的状态。
  4. 所有工作人员堆栈都将在关闭之前执行,关闭将确保在脚本执行过程中,所有工作都在此之前完成。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18799255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档