我正在处理高爸爸拍卖域名,他们提供了下载域名列表的一些方式。我确实开发了一个cron作业来下载和转储(insert)域到我的数据库表中。这个过程从下载到数据库需要几秒钟的时间。在这种情况下,域(记录)的总数为34000个条目。
第二,我需要更新数据库中每一个域的页面排名,总共34000条记录。我有PHP API,用于获取页面级别。Godaddy下载不提供页面排名细节,所以我必须分别获取和更新它。
现在的问题是,当需要获取页面排名时,然后将页面排名更新到数据库中需要花费太多的时间,总共需要34000个域。
我最近做了一个实验,通过cron工作来更新数据库中域的页面排名,只更新了13383个域名,总共更新了4个小时。因为它必须先获取,然后更新到数据库。这一切都发生在专用服务器上。
对于大量的域,有什么方法可以加快这一过程吗?我认为唯一的方法就是通过多任务来完成这个任务。
这是否有可能让100个任务同时获取页面排名并将其更新到数据库中?
如果您需要代码:
$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线程代码:
<?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));
?>任何帮助都将不胜感激。谢谢
发布于 2013-09-15 19:25:59
下面是一个允许您多线程操作的线程示例.我已经选择了工人模型,并正在使用8名工人,您使用多少工人取决于您的硬件和服务收到的请求.我从来没有使用过SEOstats或godaddy域拍卖,我不确定CSV字段,将页面排名的获取留给您.
<?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));
?>问题:
https://stackoverflow.com/questions/18799255
复制相似问题