2011-08-04 19 views
0

私は自分のcron PHPスクリプトで次の送信用の電子メールを作成しようとしています。 そしてZend_Viewを電子メールテンプレートのレンダリングに使用します。 私は50,000人のユーザーを持っていますが、64MBのメモリー制限と7200と128MBで3000の電子メールが作成されました。電子メールZend Frameworkビューレンダリングに大量のメモリが必要です

public function prepareEmailBody($template, $templates) 
{ 
    $view = new Zend_View(array('basePath' => './application/views')); 
    $template_file_name = $template . '.phtml'; 
    foreach ($templates as $key => $value) { 
     $view->$key = $value; 
    } 
    $body = $view->render('mails/' . $template_file_name); 
    return $body 
} 

そして

foreach ($users as $user) { 
..... 
$text = Mailer::getInstance()->prepareEmailBody($template, $vars); 
..... 
} 

にこの方法を使用するレンダリングの コードのコードを最適化する方法をアドバイスしてください。

+0

十分なコードを提供していません。貼り付けたものは、単一のZend_Viewを使用します。とにかく、Zend_Frameworkの世界へようこそ。それはメモリを消費します。そのため、APCとキャッシュのすべてを使用する必要があります。 – Layke

+0

各ユーザーのデータがこのテンプレートに貼り付けるため、レンダリングビューをキャッシュできません。 – Dmitro

+0

本当に問題はビューレンダリングを使用しています。なぜなら、$ text = 'some text'; 50kのメールがすべて作成されました。 – Dmitro

答えて

1

代わりに1つのビューオブジェクトと部分ヘルパーを使用してみることもできます。これにより、物性が向上する可能性があります(または速度が遅くなる可能性があります)。

public function getView() 
{ 
    if (!$this->_view) { 
     $this->_view = new Zend_View(array('basePath' => './application/views')); 
    } 

    return $this->_view; 
} 

public function prepareEmailBody($template, $templates) 
{ 
    $template_file_name = $template . '.phtml'; 

    $body = $this->getView()->partial($template_file_name, $templates); 
    return $body 
} 
+0

このコードを使用すると、処理速度が低下します。部分ヘルパーはレンダリングメソッドを使用しますが、ビューのコピーを$ view = $ this-> cloneView();行で作成する前に行います。私はこの行が遅くなると思う。メソッドのレンダリングでどこにメモリリークがあるのか​​わかりません: 'public function render($ name) { //親のプライベートメソッドを使ってスクリプトファイル名を見つけよう $ this - > _ file = $ this - > _ script($名); unset($ name); //ローカルスコープから$ nameを削除する ob_start(); $ this - > _ run($ this - > _ file); return $ this - > _ filter(ob_get_clean()); // filter output } '私はob_get_clean()がメモリをクリアしたと考えました。 – Dmitro

+0

試してみる価値あり!代わりに、1つのViewオブジェクトを使用してレンダリングしてみて、$ bodyを返す前にビューから変数を設定解除することができますか? –

+0

1つのViewオブジェクトを使用する場合、変数(同じ名前を持つ)はメモリ内の新しい値に置き換えられ、それ以上のメモリは使用されませんか? – Dmitro

関連する問題