2013-12-23 3 views
0

Я новичок в php и SQL.PHP слишком длинный

У меня есть база данных с 45 000 строк, мне нужно извлечь весь атрибут 'udid', поэтому есть много данных. Я помещаю результат в массив, для каждого udid, я проверяю, существует ли udid.xml, если файл существует, я его открываю и искал некоторые данные, а затем меняю порядок массива. Пока этот процесс я получаю ошибку тайм-аута, когда Я вызываю свой сценарий или ошибку 504 у своего интернет-провайдера.

Вот мой PHP код:

include("myFunctions.php"); 

header('Content-type: application/json; charset=utf-8'); 

$handle = fopen('php://input','r'); 

// ---------- 

set_time_limit (0); 

$req_Push = $db->sql_query("SELECT * FROM utilisateurs"); 

echo("COUNT = " .$db->sql_numrows($req_Push). ""); 

$arrayBigTbl = array(); 

while ($row_Push = $db->sql_fetchrow($req_Push)){ // while udid ref fichier utilisateurs 

    $idUser = $row_Push['udid']; 

    $arrayBigTbl []= $idUser; 
} 

//print_r($arrayBigTbl); 

echo("</br>Count array global = " .count($arrayBigTbl). "--"); 

$arrayBigTbl = array_unique($arrayBigTbl); 

echo("</br>Count array global nettoyée = " .count($arrayBigTbl). " -- Fin2"); 

$arrayXMLDevice = array(); 


for ($i = 0; $i < count($arrayBigTbl) ; $i++) 
{ 
    if (deviceXMLExist($arrayBigTbl[$i])) 
    { 
      $UDIDFile = simplexml_load_file("./UDID/".$arrayBigTbl[$i].".xml");    
      foreach($UDIDFile->UDID as $item) 
      { 
       $valueTemp = $item->valueUDID; 
       $strig = "" .$valueTemp. ""; 
       $arrayXMLDevice[] = $strig; 
      } 
    } 
} 

//print_r($arrayXMLDevice); 
echo("COUNT ARRAY DEVICE XML = " .count($arrayXMLDevice). " --- Fin 3"); 

$arrayXMLDevice = array_unique($arrayXMLDevice); 

echo("COUNT ARRAY DEVICE XML = " .count($arrayXMLDevice). " --- Fin 3"); 

$arrayXMLDevice = array_values($arrayXMLDevice); 

$arraymerge = array_merge ( $arrayBigTbl,$arrayXMLDevice); 
echo("COUNT ARRAY MERGE = " .count($arraymerge). " --- </br>"); 

$arraymerge = array_unique($arraymerge); 

echo("COUNT ARRAY MERGE NETTOYEE = " .count($arraymerge). " --- Fin 3"); 

$arrayFinalPush = array(); 

for ($i = 0; i < count($arraymerge);$i=$i+1) 
{ 
    $aValue = $arraymerge[i]; 

    if(ctype_xdigit($deviceToken) && strlen($deviceToken)>60) 
    { 
     $arrayFinalPush[] = $aValue; 
    } 
} 

echo("COUNT ARRAY FINAL = " .count($arrayFinalPush). " ---"); 

Как я могу решить эту проблему, так что мой запрос получает закончил?

+0

Эта строка вашего '$ strig =" ". $ ValueTemp. ""; '. Для чего это? В последнее время я видел подобное, и я не понимаю, почему это делается. Вы считаете, что приведение строки в строку сложно: '$ strig = (string) $ valueTemp;' – hanzo2001

+0

Нет, но я новичок в php, благодарю за отзыв. –

ответ

0

Я совсем не удивлен, что вы получаете ошибку тайм-аута, которую вы делаете очень неэффективно.

Это сказанное один трюк я использую с PHP, чтобы очистить выходной буфер: How to flush output after each `echo` call?

Если промывать выходной буфер после каждого эхо-сигнала, то это даст браузеру некоторые данные и остановить его от тайм-аута.

Причина, по которой я говорю, что она неэффективна, заключается в том, что вы, как правило, хотите делать как можно больше «работы» с SQL - такие вещи, как уникальность, упорядочение сортировки и т. Д., Должны выполняться в SQL, а не PHP, когда это возможно, потому что SQL построен для этого.

+0

Большое спасибо FaddishWorn, да, я знаю, что это не эффективно, но это мой первый, и я спешу. Спасибо за совет, я попробую. –

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