2011-08-01 17 views
0

我有下面的代码,我从CLI所以没有Apache进程..运行:PHP数组,添加的foreach多个查询,并行请求并提高性能

//$multiContent is an array of JSON responses 
foreach($multi_Content as $htmlContent) 
{ 

    //get the items from JSON response 
    $htmlContent = $htmlContent['findItems']['0']['searchResult']['0']['item']; 

    //get sellerinfo from each item block 
    foreach($htmlContent as $item) 
    { 
     //print_r($item); 
     $username = $item['seller']['0']['UserName']['0']; 

     //verify if the user already exists in our db 
     $number_object = $db->query("SELECT count(*) as number from users WHERE username='$username'"); 
     $number_object = $number_object->fetch_assoc(); 
     $number = $number_object['number']; 
     if($number < 1) 
     { 
      $db->query("INSERT INTO users(id, username)VALUES('', '$username')"); 
     } 
    } 
} 

是否有可能在处理所有JSON响应一次?我的意思是没有逐个获取每个响应(使用foreach),将所有这些响应都放入单个进程任务中,然后使用并行技术将其全部插入到数据库中。我正在处理大量数据,并且我发现这部分代码的执行速度非常缓慢,所以我们欢迎任何建议! 我正在使用mysqli

+1

JSON从哪里来?你能简化使用JSON生成的数组吗?来自web服务的 – vascowhite

+0

。我没有自己的网络服务提供商 – Michael

回答

-1

不确定,但我认为如果你使用类似的东西,那应用程序会更快。

$values = array(); 
foreach ($number_object -> fetch_assoc() as $data) 
{ 
    $values[] = "(".$objct['number'].",'".$username."')"; 
    if (count($values) > 9) 
    { 
     $values_str = implode(',', $values); 
     query("INSERT INTO users(id, username) VALUES ".$values_str); 
     $values = array(); 
    } 
} 
+0

它可能会更快,但它做同样的事情?看起来你已经回答了一个不同的问题。 – vascowhite

+0

我完全不理解这些代码,所以我试图解释那些不使用''number_object ['number']'的东西,并删除if条件。 –

+0

如果您不明白问题,您如何提供答案? – vascowhite

-1

确保您已完成"username"字段的索引编制。

也试图做到这一点的变化,如果这样可以提高...

//$multiContent is an array of JSON responses 
$usernames = array(); 
foreach($multi_Content as $htmlContent) 
{ 

    //get the items from JSON response 
    $htmlContent = $htmlContent['findItems']['0']['searchResult']['0']['item']; 

    //get sellerinfo from each item block 
    foreach($htmlContent as $item) 
    { 
     //print_r($item); 
     $username = $item['seller']['0']['UserName']['0']; 

     //verify if the user already exists in our db 
     $number_object = $db->query("SELECT count(id) as number from users WHERE username='$username'"); 
     $number_object = $number_object->fetch_assoc(); 
     $number = $number_object['number']; 
     if($number < 1) 
     { 
      $usernames[] = $username; 
     } 
    } 
} 

if(count($usernames) == 0) 
exit; 

$sql = 'insert into users (username) values '; 
foreach ($usernames as $username) 
{ 
     $sql .= "('".mysql_real_escape_string($username)."'),"; 
} 

//remove out extra comma from end of the string 
$sql = substr($sql, 0 , -1); 

$db->query($sql); 

如你所提到u的处理大量数据,可以insert$usernames数组中的一批250左右。因为大的查询长度可以禁止插入。

+0

在我的原始构造中,我正在验证用户是否已经存在于db中以避免重复。我认为验证不再适用于您的施工,是吗? – Michael

+0

是的显然工作,如果并且只有如果它已经不存在数据库中,我将它插入数组$ $用户名。 –

+0

@ :)是的,你是对的......由于某些原因,我没有看到它 – Michael