1

私はメールテンプレートシステムをプログラミングしていました。ユーザーはそこでマーカーを使用できるはずです。マーカーは実際のデータに置き換えられます。問題は、マーカーを置き換える関数が正常に機能することですが、その関数の再帰呼び出しを実行する必要があります。これは1回だけ実行され、これが私が思いついたものです。

public function replace_placeholders($content, $recipient, $settings, $interface, $recommendation, $format, $recursion = false) {
    $content = $this->replace_ph('briefanrede'  , $recipient['id']          , $content);
    $content = $this->replace_ph('anrede'       , $recipient['title']       , $content);
    $content = $this->replace_ph('email'        , $recipient['email']       , $content);
    $content = $this->replace_ph('kundennummer' , $recipient['kdnumber']    , $content);
    $content = $this->replace_ph('briefanrede'  , $recipient['briefanrede'] , $content);

    if($recipient['title'] == $settings['anrede_w'] || $recipient['title'] == $settings['anrede_m']) {
        $content = $this->replace_ph('vorname'  , $recipient['forename']    , $content);
        $content = $this->replace_ph('nachname' , $recipient['surename']    , $content);
    } else {
        $content = $this->replace_ph('vorname'  , ""    , $content, true);
        $content = $this->replace_ph('nachname' , ""    , $content, true);
    }

    $content = $this->replace_salutation($recipient, $settings, $content);

    //Recommendation    
    if($this->need_replacement($content, 'weiterempfehlung') === false && $recursion === false) {
        if($recommendation['own_page'] == 1) {
            $baseurl = $recommendation['location'];
        }  else {
            $baseurl = $recommendation['link'];
        }
        $pattern = ($format == "html") ? '<a href="%s">%s</a>' : '%s';
        $url = $this->replace_placeholders($baseurl, $recipient, $settings, $interface, $recommendation, true);
        $content = $this->replace_ph('weiterempfehlung' , (($format == "html") ? sprintf($pattern, $url, $settings['text_weiterempfehlung']): sprinf($pattern, $url)), $content);

    }

    return $content;
}

この行の再帰呼び出し

$url = $this->replace_placeholders($baseurl, $recipient, $settings, $interface, $recommendation, true);

500内部サーバーエラーが発生しています。再帰を1回に制限したと思うので、理由はわかりません。あなたは私を助けることができます?

英語が下手でごめんなさい、はっきりとした文章を書こうと頑張っています。

//編集:

Apacheログ:

[Wed May 30 15:31:56 2012] [warn] [client xx.xxx.xx.xxx] (104)Connection reset by peer: mod_fcgid: error reading data from FastCGI server
[Wed May 30 15:31:56 2012] [warn] [client xx.xxx.xx.xxx] (104)Connection reset by peer: mod_fcgid: ap_pass_brigade failed in handle_request_ipc function
[Wed May 30 15:31:56 2012] [error] [client xx.xxx.xx.xxx] File does not exist: /var/www/web80/html/web80-newsletter/favicon.ico
[Wed May 30 15:31:58 2012] [error] mod_fcgid: process /var/www/php-fcgi/web80.php53/php-fcgi(21975) exit(communication error), get unexpected signal 11 

phpエラーログは空です。

4

2 に答える 2

1

再帰呼び出しで1つの引数を見逃しているように見え、$recursive = false継続が常にfalseになり、ifステートメントが作成されます。

if($this->need_replacement($content, 'weiterempfehlung') === false && $recursion === false)

常にtrueを返します。代わりに、再帰呼び出しに最後の変数を1つ追加してみてください。そうすれば、スクリプトを適切に実行できるはずです。

$url = $this->replace_placeholders($baseurl, $recipient, $settings, $interface, 
$recommendation, true, true);
                     ^ added one true

最初のtrueの代わりに追加したいと思うのはです$format

于 2012-05-31T07:57:14.637 に答える
0

シグナル11はSIGSEGVです。つまり、メモリアクセスが不良であるためにプロセスがクラッシュしました(NULLポインタの逆参照や、アクセスするはずのないメモリへのアクセスなど)。

これはPHPスクリプトが引き起こすものではないため、最初に最新の安定したPHPバージョンにアップグレードし、それでも発生する場合は、スクリプトを可能な限り減らして(クラッシュが発生している間に削除できるものをすべて削除して)、レポートする必要があります。 PHPのバグとして。

于 2012-05-31T07:50:41.547 に答える