2009-08-12 26 views
0

PHPのsimplexml_load_file()を使用してxmlファイルを解析してから、mysql ISAMテーブルに目的のデータを挿入しています。問題は、このコードが時間の「大部分」で動作し、ここで500の内部サーバーエラーが発生することです。私が処理しようとしているXMLファイルは大きく(約50 MB)、動作するときにはmysqlテーブルに約25000個の行があります。エラーが発生すると、スクリプトはいくつかの行から数千行に何かを挿入します。xmlを解析してmysqlテーブルにデータを挿入します

とにかく、ここにコードがあります。誰かがこれについての洞察を持っているか、あるいは別の方法を持っていれば分かりますが、私は多分バッチ処理などをしています。

<?php 
include ("myconnection.php"); 

mysql_query("DELETE FROM mytable") or die(mysql_error()); 

echo "data deleted, now insert: <br /><br />"; 

//the url for the feed: 
$feed = 'cachy/copy.xml'; 


echo "myfeed: ".$feed; 
echo "<br />"; 

// Load the feed 

$xml = simplexml_load_file($feed); 
if ($xml != null) 
{ 
echo "<br />Success! feed available!<br /><br />"; 
} 
else 
{ 
echo "<br />Couldn't fetch the content<br /><br />"; 
die; 
} 

//die; 
//ini_set("memory_limit","256M"); 
//set_time_limit(120); 


function clean($input) 
{ 
    $input = trim($input); 
    $input = htmlentities($input, ENT_QUOTES); 
    $input = mysql_escape_string($input); 
    $input = EscapeShellCmd($input); 
    return $input; 
} 


//insert data from feed 
foreach($xml->xpath('//product') as $products) 

{ 

$product_name = clean($products->product_name); 

mysql_unbuffered_query("INSERT INTO mytable (onsaledate, onsaletime, eventdate, eventtime, buyat_short_deeplink_url, product_name, level1, level2, VenueName, VenueDMAID)VALUES (\"$products->OnsaleDate\",\"$products->OnsaleTime\",\"$products->EventDate\",\"$products->EventTime\",\"$products->buyat_short_deeplink_url\",\"$product_name\",\"$products->level1\",\"$products->level2\",\"$products->VenueName\",\"$products->VenueDMAID\")") or die(mysql_error()); 


} 

mysql_close($myConnection); 

echo "records inserted my man!"; 

die; 

ご協力いただきありがとうございます。

答えて

2

どのようなエラーが表示されますか?

  1. TRUNCATE table(あなたができると仮定すると、再利用IDが)でDELETE FROM tableを交換し、この

    のように、一度に
  2. 挿入複数の行を:あなたの場合も

    、それはより速くずっとを実行します

    INSERT INTOテーブル(col1、col2)値 (val1、val2)、 (val1a、val1b)、 ...

+0

私は削除を切り捨てるように変更しました。これは、少し速いかもしれないようです。 私のループにあなたの提案された挿入物をどのように構築するのですか? エラーは次のとおりです。 内部サーバーエラー サーバーで内部エラーまたは構成ミスが発生し、要求を完了できませんでした。 非常に説明的ではありません –

+0

ステップ2が重要でした。ありがとう! –

0

ループを開始する前にxpathを変数に設定する方が効率的かどうかはわかりません。

例えば

$productsxml = $xml->xpath('//product') 
foreach($productsxml as $products) 

あなたはまた、@グレッグのような文が示唆している作成し、一度にそれを実行するために、XSLTを使用することができます。

1

あなたのPHPがすべてのエラーを表示していないようです。これを追加してみてください:

error_reporting(E_ALL); 

これはすべてのエラーを出力します。 Xslt(@Greg)は良いオプションです。

関連する問題