PHPのメモリ使用量を変更できない共有ホスティング環境で実行されているスクリプトがあります。このスクリプトは、SOAPを介してWebサービスを使用しています。一度にすべてのデータを取得することはできません。そうでなければメモリが不足しているので、mysqlデータベースにローカルでデータをキャッシュすることで成功し、その後のクエリが高速になります。ループ内のメモリを「解放する」方法は?
基本的に、Webサービスに5か月のデータを照会するのではなく、1か月に1回クエリを実行してmysqlテーブルに格納し、次の月などを取得します。これは通常動作しますが、 。
私の基本的なコードのロジックは、このようなものです:
- 石鹸を使用してWebサービスに接続します。
- mysqlデータベースに接続
- 結果Webサービスと結果を変数$ resultsに格納します。 mysqlのテーブルに
- ダンプ$結果
- 繰り返しは、私は、Webサービスからの結果の各バッチがあろうと仮定しますので、同じ変数は各反復で使用されているデータ
の各月の3と4ステップ前のメモリを上書きする?私は反復の間にunset($ results)を使ってみましたが、何もしませんでした。私は毎回memory_get_usage(true)で使用されるメモリを出力しており、使用されるメモリが増えるごとに繰り返します。
どのように私はこのメモリリークを修正できますか?私は十分に明確でない場合はコメントを残し、私は詳細を提供することができます。ありがとう!
*** EDITここ
は(それが違いを作る場合、私はPHP5のネイティブのSOAPクライアントをnusoapない使用しています)いくつかのコードです:
$startingDate = strtotime("3/1/2011");
$endingDate = strtotime("7/31/2011");
// connect to database
mysql_connect("dbhost.com", "dbusername" "dbpassword");
mysql_select_db("dbname");
// configure nusoap
$serverpath ='http://path.to/wsdl';
$client = new nusoap_client($serverpath);
// cache soap results locally
while($startingDate<=$endingDate) {
$sql = "SELECT * FROM table WHERE date >= ".date('Y-m-d', $startingDate)." AND date <= ".date('Y-m-d', strtotime($startingDate.' +1 month'));
$soapResult = $client->call('SelectData', $sql);
foreach($soapResult['SelectDateResult']['Result']['Row'] as $row) {
foreach($row as &$data) {
$data = mysql_real_escape_string($data);
}
$sql = "INSERT INTO table VALUES('".$row['dataOne']."', '".$row['dataTwo']."', '".$row['dataThree'].")";
$mysqlResults = mysql_query($sql);
}
$startingDate = strtotime($startingDate." +1 month");
echo memory_get_usage(true); // MEMORY INCREASES EACH ITERATION
}
これまでのアイデアはありません。いくつかのコードを貼り付けてみてください。 – fiunchinho