2011-03-20 19 views
0

我有更新mysql數據庫的問題。 我想運行一個〜80萬行的數據庫上運行此腳本,但我的記憶後第5行用完所以一些我需要怎麼加+5到極限自動更新這個MySQL查詢。內存問題mysql的

我想使用重定向或重置莫名其妙的記憶..

<?php 

    include(dirname(__FILE__) .'/include/simple_html_dom.php'); 

    mysql_connect('localhost', '', ''); 
    mysql_select_db(''); 

    $result = mysql_query("SELECT gamertag FROM gamertags LIMIT 0, 5 "); 
     while ($row = mysql_fetch_assoc($result)) { 
      $gamertag = $row['gamertag']; 

      //pages to pull stats from 
      $site_url = 'http://www.bungie.net'; 
      $stats_page = 'http://www.bungie.net/stats/reach/default.aspx?player='; 

      //create dom 
      $html = new simple_html_dom(); 
      $html->load_file($stats_page . urlencode(strtolower($gamertag))); 

      //pull nameplate emblem url, ****if it exist**** 
      $nameplate_emblem_el = $html->find("#ctl00_mainContent_identityBar_namePlateImg"); 
      if (!$nameplate_emblem_el){ 
       $nameplate_emblem = 'No nameplate emblem!'; 
      } 
      else{ 
       //only if #ctl00_mainContent_identityBar_namePlateImg is found 
       $nameplate_emblem = htmlspecialchars_decode($nameplate_emblem_el[0]->attr['src']); 
       $nameplate_emblem = $site_url . $nameplate_emblem; 
      } 

      mysql_query("INSERT IGNORE INTO star SET gamertag = '".$gamertag."',nameplate = '".$nameplate_emblem."'"); 
     } 

?> 
+0

爲什麼你需要選擇全部800 000行?只是出於好奇。如果您需要以某種方式更新它們,那麼通過查詢無法做到這一點? – 2011-03-20 18:54:40

+0

你需要表現出更多的代碼,所以我們可以看到使用的內存 – Unicron 2011-03-20 18:54:52

+0

也許你能告訴我們你的腳本的其餘部分或解釋我們這是什麼目的。如果你只需要gamertag,那麼首選mysql_fetch_row(),它更快,更省資源。 – guillaumepotier 2011-03-20 18:58:27

回答

0

800.000是大量的,不知道是否會it's發生,但是從PHP手冊的評論: 「未設置()不會強制立即釋放內存,PHP的垃圾回收器會在它很快看到適合的意圖時執行它,因爲無論如何這些CPU週期不需要,或者遲到作爲前腳本將耗盡內存,無論先發生

如果你正在做什麼$ = NULL;然後你重寫VA riable的數據。您可能會更快地釋放內存/收縮內存,但它可能會更快地從真正需要它們的代碼中竊取CPU週期,從而導致整個執行時間更長。「

來源:http://php.net/manual/en /function.unset.php

所以,儘量取消設置/套以後每次爲null變量循環運行。

0

我猜,你打你的PHP內存限制,而不是機器。如果所以,你可以編輯php.ini文件(通常/etc/php5/apache2/php.ini)給予更多的內存爲php。尋找「memory_limit的= X」,其中X是一樣的東西256M