wordpressのバッチ処理で、google analyticsからURLを取得して、そのURLからpost_idを取得し、それとgoogle analyticsから取得したビュー数をセットでdbに保存するということをしたいです。
そこで、URLからid記事名部分を取得してWP_Queryでpost_idを取得して……とやろうとしたのですが、ページ数が多いためおそらくメモリ不足で落ちてしまいます。
行ごとにメモリ使用量を出すことにより、WP_Queryを実行するごとにメモリ使用量が増えていくのが原因ということがわかりましたが、メモリ使用量を増やさない方法、メモリを開放する方法がわかりません。どのようにすればメモリの使用量を抑えられるのかを教えていただけないでしょうか。
<?php require_once( __DIR__.'/../DocumentRoot/wp-load.php' ); for($i = 1; $i < 100000; $i++) { var_dump(memory_get_usage(true)); $query = new WP_Query(["name" => $i]); }
思い切り単純化すると、上のコードで、出力されるメモリ量がどんどん増えていってしまいます。
(6/28追記)
これでやっている処理は以下のようになります。
require_once( __DIR__.'/../DocumentRoot/wp-load.php' ); // ここにgoogle analytics用のLoaderをincludeするinclude文が入る $ga = \Loader::get_analytics(); $totalResults = 1000000; // 仮のtotalResults $page_views = []; for($i = 1; $i < $totalResults; $i+= 10000) { $results = $ga->fetch('2017-01-01', date('Y-m-d'), 'ga:pageviews', ['dimensions' => 'ga:pagePath', 'filters' => 'ga:pagePath=@article', 'sort' => '-ga:pageviews', 'start-index'=>$i, 'max-results' => $request_num]); //google analyticsから2017-01-01から今日までで、articleをurlに含むview数の情報を、view数が大きい方から数えて、$i番目から$request_num件取得する $totalResults = $results->totalResults; foreach($results->rows as $row){ //$rowは[url, view数]という配列になっている $name = get_name($row[0]); // get_nameは例えば$row[0]がhttp://sample.com/article/170101/のとき、170101を取得する。実際にはurlのフォーマットが違う場合や、ページネーションを無視したりなどがあり、いろいろやっている。 $query = new WP_Query(["name" => $name]); $post_id = $query->post->ID; if($page_views[$post_id]){ $page_views[$post_id] += $row[1]; }else { $page_views[$post_id] = (int)$row[1]; } } } var_dump($page_views); // まだ未実装だが最終的にはこれをdbに保存する
回答3件
あなたの回答
tips
プレビュー