2013-11-26 3 views
0

Я извлекаю результаты из своей базы данных, и я обрабатываю каждый результат. Теперь я хотел бы запустить все эти результаты одновременно. Возможно ли это с помощью php?одновременно запускать результаты foreach php

Ниже я добавил пример кода, я хотел бы иметь, что для каждого результата запрос выполняется одновременно, не дожидаясь завершения других результатов до перехода к следующему.

while ($accountdata = mysql_fetch_array($qaccountdata)) 
{ 
    $un = $accountdata['email']; 
    mysql_query("INSERT INTO log (id, email, item,height, stamp) VALUES ('', '$un','something','', '" . strtotime('now') . "')");    
} 

Как насчет этого? script.php содержит этот процесс.

<?php 

$q = 1; 

$mh = curl_multi_init(); 

while ($accountdata = mysql_fetch_array($qaccountdata)) { 
     $a = $accountdata['email']; 
     $ch.$q = curl_init(); 
     curl_setopt($ch.$q, CURLOPT_URL, 'script.php?id='.$a); 
     curl_setopt($ch.$q, CURLOPT_HEADER, 0); 
     curl_multi_add_handle($mh,$ch.$q); 
     $q++; 
    } 

$active = null; 
//execute the handles 
do { 
    $mrc = curl_multi_exec($mh, $active); 
} while ($mrc == CURLM_CALL_MULTI_PERFORM); 

while ($active && $mrc == CURLM_OK) { 
    if (curl_multi_select($mh) != -1) { 
     do { 
      $mrc = curl_multi_exec($mh, $active); 
     } while ($mrc == CURLM_CALL_MULTI_PERFORM); 
    } 
} 

curl_multi_remove_handle($mh, $ch.$q); 
curl_multi_close($mh); 



?> 

script.php

if (isset($_GET['type'])) { 
    $_GET['id'] = $un 
    //rest of code 
    } 
+0

См. Http://stackoverflow.com/questions/70855/how-can-one-use-multi-threading-in-php-applications – MeNa

+0

Можно ли это сделать? '$ Count = количество результатов для ($ I = 0; $ г <$ рассчитывать; $ I + = 1) { в то время как ($ accountdata = mysql_fetch_array ($ qaccountdata)) { } } ' – user3009108

+0

NO. 'mysql_fetch_array ($ qaccountdata)' будет блокировать вашу программу до тех пор, пока он не закончится. – MeNa

ответ

4

Избегайте делать запросы SQL в цикле

Распространенной ошибкой является размещение запроса SQL внутри цикла. Это приводит к нескольким обратным поездкам в базу данных и значительно более медленным сценариям. В приведенном ниже примере вы можете изменить цикл для создания единого SQL-запроса и вставить всех своих пользователей одновременно.

foreach ($userList as $user) { 
    $query = 'INSERT INTO users (first_name,last_name) VALUES("' . $user['first_name'] . '", "' . $user['last_name'] . '")'; 
    mysql_query($query); 
    } 

Производит:

INSERT INTO users (first_name,last_name) VALUES("John", "Doe") 

Вместо того, чтобы использовать петлю, вы можете объединить данные в один запрос к базе данных.

$userData = array(); 
foreach ($userList as $user) { 
    $userData[] = '("' . $user['first_name'] . '", "' . $user['last_name'] . '")'; 
} 
$query = 'INSERT INTO users (first_name,last_name) VALUES' . implode(',', $userData); 
mysql_query($query); 

Производит:

INSERT INTO users (first_name,last_name) VALUES("John", "Doe"),("Jane", "Doe")... 

Сделайся и сервер одолжение, прочитайте документацию here и некоторые советы here.

Смежные вопросы