2015-01-09 3 views
0

поэтому я писал сценарии на короткое время, а некоторые из них, которые, как представляется, запускаются регулярно и без тайм-аутов. Однако это одно и им интересно, есть ли у вас, ребята, возможные предложения по оптимизации скорости этого скрипта.PHP-скрипт для задания времени работы cron

Его задача - захватить идентификаторы из существующей базы данных и использовать их в поиске API для получения данных элемента. Проблема заключается в том, что это как 45000 элементов, которые мне нужно найти, и я уже использую мультирум через curl для конвейера процесса.

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

ПРИМЕЧАНИЯ: моя информация подключения к БД скрыта, но я подключаю просто отлично

<?php 
$s = microtime(true); //Time request variable 

//CONNECT TO THE DATABASE 
$DB_NAME = 'database'; 
$DB_HOST = 'mysql.myhost.com'; 
$DB_USER = 'myusername'; 
$DB_PASS = 'mypass'; 

$con = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME); 

if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
} 
//END OF DB CONNECT 

//TP UTIL 
function array_2d_to_1d($input_array) { 
    $output_array = array(); 

    for ($i = 0; $i < count($input_array); $i++) { 
     for ($j = 0; $j < count($input_array[$i]); $j++) { 
     $output_array[] = $input_array[$i][$j]; 
     } 
    } 
    return $output_array; 
} 

function tableExists($con, $table) { 
    $show = "SHOW TABLES LIKE '$table'"; 
    $result = $con->query($show) or die($con->error.__LINE__); 
    if($result->num_rows == 1) return true; 
    else return false; 
} 
//END TP UTIL 

//++++++++++GET ITEM IDS++++++++++++// 
$table = "shinies_primitiveitems_table_NEW"; 

if(tableExists($con, $table)){ 
    $query = "SELECT * FROM $table"; 
    $result = $con->query($query) or die($con->error.__LINE__); 
    $index = 0; 

    if($result->num_rows > 0) { 
     while($row = $result->fetch_assoc()) { 
      $urls[$index] = "https://api.guildwars2.com/v2/items/".stripslashes($row['ItemID']); 
      //echo $urls[$i]."<br />"; 
      $index++; 
     } //end while loop 
    } //end if 
} 
//++++++++++END GET ITEM IDS++++++++++++// 


//++++++++++MULTI CURL REQUESTS FOR API+++++++++++// 
// Define the URLs 
//$urls = $apiURLArray; 

// Create get requests for each URL 
$mh = curl_multi_init(); 
foreach($urls as $i => $url) 
{ 
    //echo $url."<br />"; 
    $ch[$i] = curl_init($url); 
    curl_setopt($ch[$i], CURLOPT_RETURNTRANSFER, 1); 
    curl_multi_add_handle($mh, $ch[$i]); 
} 

// Start performing the request 
do { 
    $execReturnValue = curl_multi_exec($mh, $runningHandles); 
} while ($execReturnValue == CURLM_CALL_MULTI_PERFORM); 
// Loop and continue processing the request 
while ($runningHandles && $execReturnValue == CURLM_OK) { 
    // Wait forever for network 
    $numberReady = curl_multi_select($mh); 
    if ($numberReady != -1) { 
    // Pull in any new data, or at least handle timeouts 
    do { 
     $execReturnValue = curl_multi_exec($mh, $runningHandles); 
    } while ($execReturnValue == CURLM_CALL_MULTI_PERFORM); 
    } 
} 

// Check for any errors 
if ($execReturnValue != CURLM_OK) { 
    trigger_error("Curl multi read error $execReturnValue\n", E_USER_WARNING); 
} 

// Extract the content 
foreach($urls as $i => $url) 
{ 
    // Check for errors 
    $curlError = curl_error($ch[$i]); 
    if($curlError == "") { 
    $res[$i] = curl_multi_getcontent($ch[$i]); 
    } else { 
    print "Curl error on handle $i: $curlError\n"; 
    } 
    // Remove and close the handle 
    curl_multi_remove_handle($mh, $ch[$i]); 
    curl_close($ch[$i]); 
} 
// Clean up the curl_multi handle 
curl_multi_close($mh); 

//var_dump(json_decode($res, true)); 
//echo count($res)."<br />"; 

//Decode data 
for($i=0;$i<count($res);$i++){ 
    $dataArray[$i] = json_decode($res[$i], true); 
    //echo "$i: ".json_decode($res[$i], true)."<br /><br />"; 
} 
//echo count($dataArray)."<br />"; 
//var_dump($dataArray); 


//$data = array_2d_to_1d($dataArray); 

//echo count($data)."<br />"; 
/* 
//Find attributes of each item 
for($i=0;$i<count($data);$i++){ 
    echo $data[$i]['name']." - ".$data[$i]['icon']; 
}*/ 

//turn dataArray into a single dimensional data array 
//$data = array_2d_to_1d($dataArray); 

//print_r($data); 
//++++++++++END REQUEST+++++++++++// 


// Print the response data - DEBUG 
echo "<p>Total request time: ".round(microtime(true) - $s, 4)." seconds."; 
?> 
+0

Если вы хотите, чтобы кто-то просмотрел ваш код, вы должны спросить на [codereview.se] –

ответ

0

ли сроки сценария из-за максимальное выполнение ограничения по времени? Если да, возможно, вы можете установить тайм-аут на что-то большее с http://php.net/manual/en/function.set-time-limit.php или что-то в этом роде?

Если это время в том смысле, что все ваши завитки перестают возвращаться, возможно, на удаленном конце есть ограничение скорости по запросам или есть какой-то другой предел, который вы нажимаете, если вы пытаетесь запустить 45 000 одновременных запросов TCP или что нибудь?

+0

Вы знаете, что я действительно не думал об этом, но вы могли бы быть чем-то. Возможно, мой запрос на получение информации для 45000 пунктов сразу не является лучшим способом, если я должен оставаться ниже предела памяти. Я знаю, что это не проблема с тайм-аутом, но, безусловно, сбой в памяти, поскольку он не займет много времени. – RebornGeek

+0

Ahh, в этом случае, возможно, вы можете использовать что-то вроде ini_set ('memory_limit', '512M'); если он просто ударяет по мягкому пределу памяти (или разбивает запросы вниз на подмножества, скажем 1000 за раз, если он нажимает ограничение жесткой памяти). –

+0

ну сценарий, как он стоит в этом сообщении, сбой моего сервера, поэтому я думаю, что я нажимаю жесткий лимит, потому что мне нужно дождаться, когда хост перезагрузит мой VPS – RebornGeek

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