PHP массив, foreach добавить несколько запросов, параллельные запросы и повысить производительность - PullRequest
0 голосов
/ 01 августа 2011

У меня есть следующий код, который я запускаю из CLI, поэтому нет процесса Apache ..:

//$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

Ответы [ 2 ]

0 голосов
/ 01 августа 2011

убедитесь, что вы выполнили индексацию в поле "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);

, как вы уже сказалиОбрабатывая большое количество данных, Вы можете insert этот $usernames массив в пакете 250 или около того.потому что большая длина запроса может запретить вставку.

0 голосов
/ 01 августа 2011

Не уверен, но я думаю, что если вы используете что-то подобное, это приложение будет быстрее.

$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();
    }
}
...