サポート » 使い方全般 » PHP スクリプトエラーでサーバーに高負荷がかかりサーバーを停止されてし

  • 解決済 ukkyi

    (@ukkyi)


    最近、某共有サーバーからKDDIの専用サーバーにWPを移転しました。
    本日KDDIの専用サーバーから以下のようなメールがきました。

    過去に何度も共有サーバーからセッション数が多く高負荷が掛かっているとの連絡があり、
    より容量の大きいサーバーへと移転を繰り返しておりました。

    専用サーバーに移転すれば問題が解決するかと思っていた矢先で大変困っております。
    アドバイスいただけると大変助かりますので、何卒よろしくお願いいたします。

    以下、KDDIの専用サーバーからのメールを転記します。
    ———————————————————————-
    お客様にご利用いただいている専用サーバ******.secure.jpの
    CPU異常警告が数回に渡り発せられました。

    緊急で調査いたしましたところ、お客様のプログラムの動作が要因となり、
    サーバに高負荷が発生しておりました。

    このままでは専用サーバーの全てのサービス(WEB・メール・FTPなど)に
    影響が出てしまい、さらにはサーバー自体が落ちてしまう恐れがあったため、
    弊社にてお客様のPHPを停止させていただきました。
    ※現在、該当のPHPは動作いたしておりません。

    大変申し訳ございませんが、お客様にて設置を行っているPHP
    スクリプトに関しましては、弊社サポートの対象外となって
    おります。お手数ではございますが、ご対応につきましては
    お客様にてご判断ください。

    なお、再度アクセス権の設定等を行い、スクリプトが暴走した
    場合には、FTPアクセスの制限、またはWebサイトの停止等の
    措置を取らせていただく場合がございます。
    予めご了承ください。

    確認されたPHPスクリプト
    =================================
    /usr/home/********/html/index.php
    =================================

    ———————————————————————-

    上記のようなメールが来たため、wp-config.phpをデバックモードにして
    エラーを確認しました。

    以下、エラーコード
    ———————————————————————-
    Notice: Undefined variable: count in /usr/home/*******/html/wp-content/themes/*******/index.php on line 58

    Strict Standards: Only variables should be passed by reference in /usr/home/*******/html/wp-content/themes/*******/functions.php on line 54

    Strict Standards: Only variables should be assigned by reference in /usr/home/*******/html/wp-content/themes/*******/functions.php on line 54

    ———————————————————————-

    上記エラーの該当ファイルの記述は以下の通りです。

    ———————————————————————-
    【index.php on line 58】

    <p class=”comment”>“><span style=”font-size:36px;”><?php echo comment_count($count); ?></span> <img src=”http://*******.com/wp-content/themes/*******/img/comment.jpg”&gt;</p>

    【functions.php on line 54】

    $comments_by_type = &separate_comments(get_comments(‘status=approve&post_id=’ . $id));

    ———————————————————————-

    当方で対処したことは

    1. 高負荷を掛けているかもしれないと思うプラグインの停止
    2. オーバーヘッドしているDBのテーブルを最適化

    問題はphpファイルのスクリプト構文エラーだと思うのですが
    どこが間違っているのか解明できなかったので、対策できていません。

    お力を貸していただけますようお願いいたします。

11件の返信を表示中 - 1 - 11件目 (全11件中)
  • KDDI からのメールに有る『スクリプトの暴走』がはっきりすれば良いとは思うのですが、現在の情報から対策としては、
    エラーが出ているのがテーマに原因がありそうですね。
    普段の更新で高負荷が起こるというのは考えにくく、改ざんされている心配もあります。

    テーマ名を伏せられているのは事情があるのでしょうか。

    テーマを TwentyForteen に変更してエラーが出るか確認しましょう。

    トピック投稿者 ukkyi

    (@ukkyi)

    > エラーが出ているのがテーマに原因がありそうですね。
    > 普段の更新で高負荷が起こるというのは考えにくく、改ざんされている心配もあります。
    > テーマ名を伏せられているのは事情があるのでしょうか。

    やはりテーマのphpが問題なんですね…
    自作のテーマなので構文エラーがあるかもとは思っていました。
    外部から改ざんされたというよりは、私のミスのような気がしますが、
    勉強しながら作ったサイトなので
    自力でエラーを見つけることができなくて困っております。

    また、運用中のサイトでありアクセスもかなり集めているため
    テストでのテーマチェンジは難しい状態です。

    他に何か方法はありませんでしょうか?

    もう一つインストールしてみて TwentyFourteen のテーマで、
    現在のサイトのコンテンツをインポートしてみてはいかが。

    トピック投稿者 ukkyi

    (@ukkyi)

    なるほど!その手もありますね!

    ただ、TwentyFourteenでのエラーが出なかったとしても
    現在使用してるテーマのエラー場所の特定にはならないですよね?

    あと、現在稼働中のサイトは止める訳にいかないので
    テストサイトはアクセスは基本ないものとしてテスト稼働させます。
    その場合、アクセスが増大した時の検証も無理ですよね…。
    稼働中のサイトのテーマチェンジができれば話は早いのですが
    それができないため、現在のテーマのエラー修復を第一に考えたいのですが、
    それは難しいでしょうか?

    アクセスで負荷が増大しているのか、改ざんされていて負荷をかける送信をしているのか
    改ざんでなく純粋のアクセスの負荷だとして、
    アクセスが多いコンテンツは把握されていますよね。
    画像などがファイルサイズが大きいと付加も大きくなるので、アクセス先の分散も検討しましょう。

    テストサイトは検索エンジンにクロールさせないようにしておくとか、ダミーのコンテンツにするとか。
    TwentyFourteen でしばらく運用して、負荷が増大しなければテーマを現在使用しているものに変えてみる。
    それでアクセスによる負荷か、異常な記述があるのかトラブル解消の切り分けの材料になるでしょう。

    どういうパターンで負荷が上がるのかログで監視しておく。スパム目的の過剰なアクセスも考えられませんかね。

    気になったので質問なんですが、
    【functions.php on line 54】は、ご自分で追加した記述ですか?

    たしかに、
    【functions.php on line 54】はコメントを送りつける仕掛けっぽいですね。
    アクセスが多いのって、akismet が異常にスパム処理していませんかね

    モデレーター Daisuke Takahashi

    (@extendwings)

    functions.php#L54 はまず、関数の使い方を間違っているので、separate_comments()が正常に処理できていない可能性があります。
    separate_comments()はcomments_template()からの参照渡しによる引数を期待する関数ですし、この使い方だとcomments_template()で十分対応できると思うのですが、separate_comments()をわざわざ呼び出しているのには理由があるのでしょうか?

    $comments_by_type = comments_template();とすれば処理は随分減るはずです。

    トピック投稿者 ukkyi

    (@ukkyi)

    みなさん、ありがとうございます。

    その後の状況をお知らせします。

    まず、ネームサーバーが専用サーバーに向きだしたので
    旧の共有サーバーの方をTwentyForteenに変更してデバックモードにしてみました。
    結果、TwentyForteenではエラーコードなし。
    再び、自作テーマに戻しエラーの確認、修正。

    以下、旧の共有サーバーで確認し、修正した内容を転記します。

    ———————————————————————————–
    変更前【index.php on line 58】
    <p class=”comment”>”><span style=”font-size:36px;”><?php echo comment_count($count); ?></span> <img src=”http://*******.com/wp-content/themes/*******/img/comment.jpg”></p&gt;

    変更後
    <p class=”comment”>“><span style=”font-size:36px;”><?php comments_number(‘0′,’1′,’%’); ?></span> <img src=”http://*******.com/wp-content/themes/*******/img/comment.jpg”&gt;</p>
    ———————————————————————————–
    上記の修正で、デバックモードの【index.php on line 58】のエラーは消えました。

    ■php修正後のサーバーのエラーログ内容
    ———————————————————————————–
    [Tue Jul 15 04:21:47.054106 2014] [core:error] [pid 21253] (63)File name too long: [client 157.55.39.30:10412] AH00036: access to /\xc3\x83\xc2\xa3\xc3\xa2\xe2\x80\x9a\xc2\xac\xc3\x82\xc2\x90\xc3\x83\xc2\xa4\xc3\x82\xc2\xb9\xc3\x86\xe2\x80\x99\xc3\x83\xc2\xa6\xc3\x85\xe2\x80\x9c\xc3\x82\xc2\xa8\xc3\x83\xc2\xa5\xc3\x82\xc2\x9d\xc3\xa2\xe2\x82\xac\xc5\xa146\xc3\x83\xc2\xa3\xc3\xa2\xe2\x80\x9a\xc2\xac\xc3\xa2\xe2\x82\xac\xcb\x9c8th\xc3\x83\xc2\xa3\xc3\xa2\xe2\x82\xac\xc5\xa1\xc3\x82\xc2\xb7\xc3\x83\xc2\xa3\xc3\x86\xe2\x80\x99\xc3\x82\xc2\xb3\xc3\x83\xc2\xa3\xc3\xa2\xe2\x82\xac\xc5\xa1\xc3\x82\xc2\xb0\xc3\x83\xc2\xa3\xc3\x86\xe2\x80\x99\xc3\x82\xc2\xab\xc3\x83\xc2\xa3\xc3\xa2\xe2\x82\xac\xc5\xa1\xc3\x82\xc2\xbf\xc3\x83\xc2\xa3\xc3\xa2\xe2\x82\xac\xc5\xa1\xc3\x82\xc2\xa4\xc3\x83\xc2\xa3\xc3\x86\xe2\x80\x99\xc3\x8b\xe2\x80\xa0\xc3\x83\xc2\xa3\xc3\x86\xe2\x80\x99\xc3\x82\xc2\xab\xc3\x83\xc2\xa3\xc3\xa2\xe2\x80\x9a\xc2\xac\xc3\x85\xc2\xbd\xc3\x83\xc2\xa6\xc3\x82\xc2\xb0\xc3\xa2\xe2\x82\xac\xe2\x80\x9d\xc3\x83\xc2\xa3\xc3\x82\xc2\x81\xc3\x82\xc2\xa5\xc3\x83\xc2\xa3\xc3\x82\xc2\x81\xc3\xa2\xe2\x82\xac\xc5\xbe\xc3\x83\xc2\xa3\xc3\x82\xc2\x81\xc3\x85\xc2\xb8\xc3\x83\xc2\xa3\xc3\xa2\xe2\x82\xac\xc5\xa1\xc3\xa2\xe2\x82\xac\xc2\xb0\xc3\x83\xc2\xa7\xc3\xa2\xe2\x82\xac\xc2\xb0\xc3\xa2\xe2\x82\xac\xc2\xa1\xc3\x83\xc2\xa6\xc3\x86\xe2\x80\x99\xc3\x82\xc2\xb3/ failed (filesystem path ‘/usr/home/*********/html/\xc3\x83\xc2\xa3\xc3\xa2\xe2\x80\x9a\xc2\xac\xc3\x82\xc2\x90\xc3\x83\xc2\xa4\xc3\x82\xc2\xb9\xc3\x86\xe2\x80\x99\xc3\x83\xc2\xa6\xc3\x85\xe2\x80\x9c\xc3\x82\xc2\xa8\xc3\x83\xc2\xa5\xc3\x82\xc2\x9d\xc3\xa2\xe2\x82\xac\xc5\xa146\xc3\x83\xc2\xa3\xc3\xa2\xe2\x80\x9a\xc2\xac\xc3\xa2\xe2\x82\xac\xcb\x9c8th\xc3\x83\xc2\xa3\xc3\xa2\xe2\x82\xac\xc5\xa1\xc3\x82\xc2\xb7\xc3\x83\xc2\xa3\xc3\x86\xe2\x80\x99\xc3\x82\xc2\xb3\xc3\x83\xc2\xa3\xc3\xa2\xe2\x82\xac\xc5\xa1\xc3\x82\xc2\xb0\xc3\x83\xc2\xa3\xc3\x86\xe2\x80\x99\xc3\x82\xc2\xab\xc3\x83\xc2\xa3\xc3\xa2\xe2\x82\xac\xc5\xa1\xc3\x82\xc2\xbf\xc3\x83\xc2\xa3\xc3\xa2\xe2\x82\xac\xc5\xa1\xc3\x82\xc2\xa4\xc3\x83\xc2\xa3\xc3\x86\xe2\x80\x99\xc3\x8b\xe2\x80\xa0\xc3\x83\xc2\xa3\xc3\x86\xe2\x80\x99\xc3\x82\xc2\xab\xc3\x83\xc2\xa3\xc3\xa2\xe2\x80\x9a\xc2\xac\xc3\x85\xc2\xbd\xc3\x83\xc2\xa6\xc3\x82\xc2\xb0\xc3\xa2\xe2\x82\xac\xe2\x80\x9d\xc3\x83\xc2\xa3\xc3\x82\xc2\x81\xc3\x82\xc2\xa5\xc3\x83\xc2\xa3\xc3\x82\xc2\x81\xc3\xa2\xe2\x82\xac\xc5\xbe\xc3\x83\xc2\xa3\xc3\x82\xc2\x81\xc3\x85\xc2\xb8\xc3\x83\xc2\xa3\xc3\xa2\xe2\x82\xac\xc5\xa1\xc3\xa2\xe2\x82\xac\xc2\xb0\xc3\x83\xc2\xa7\xc3\xa2\xe2\x82\xac\xc2\xb0\xc3\xa2\xe2\x82\xac\xc2\xa1\xc3\x83\xc2\xa6\xc3\x86\xe2\x80\x99\xc3\x82\xc2\xb3’)
    ———————————————————————————–

    ■残っているデバックモードのエラー
    ———————————————————————————–
    Notice: get_settings の使用はバージョン 2.1 から非推奨になっています! 代わりに get_option() を使ってください。 in /home/******/******.com/public_html/wp-includes/functions.php on line 3078

    Notice: Undefined variable: count in /home/******/******.com/public_html/wp-content/themes/******/comments.php on line 12

    Notice: Undefined variable: aria_req in /home/nogitweet/nogitweet.com/public_html/wp-content/themes/******/comments.php on line 37

    Notice: Undefined variable: aria_req in /home/******/******/public_html/wp-content/themes/******/comments.php on line 39
    ———————————————————————————–

    ■上記エラーの該当ファイルの記述
    ———————————————————————————–
    【functions.php on line 3078】

    if ( WP_DEBUG && apply_filters( ‘deprecated_function_trigger_error’, true ) ) {
    if ( function_exists( ‘__’ ) ) {
    if ( ! is_null( $replacement ) )
    trigger_error( sprintf( __(‘%1$s is deprecated since version %2$s! Use %3$s instead.’), $function, $version, $replacement ) );
    else
    trigger_error( sprintf( __(‘%1$s is deprecated since version %2$s with no alternative available.’), $function, $version ) );
    } else {
    if ( ! is_null( $replacement ) )
    trigger_error( sprintf( ‘%1$s is deprecated since version %2$s! Use %3$s instead.’, $function, $version, $replacement ) );
    else
    trigger_error( sprintf( ‘%1$s is deprecated since version %2$s with no alternative available.’, $function, $version ) );
    }
    }
    }
    ———————————————————————————–
    【comments.php on line 12】
    <?php if ( comment_count($count)==0 ) : ?>
    <p class=”notcom”>コメントはありません。</p>

    ———————————————————————————–
    【comments.php on line 37】
    $fields[‘author’]='<p class=”comment-form-author”>’.'<label for=”author”>名前</label>’.($req ?'<span class=”required”>*</span>
    ‘:”).
    ‘<input id=”author” name=”author” type=”text” value=”‘.esc_attr( $commenter[‘comment_author’] ).'” size=”30″‘.$aria_req.’ /></p>’;
    ———————————————————————————–
    【comments.php on line 39】
    $fields[‘email’]='<p class=”comment-form-email”><label for=”email”>E-mail</label> ‘ . ( $req ? ‘<span class=”required”>*</span><span class=”attention”> – 公開されません</span>
    ‘ : ” ) .
    ‘<input id=”email” name=”email” type=”text” value=”‘ . esc_attr( $commenter[‘comment_author_email’] ) . ‘” size=”30″‘ . $aria_req . ‘ /></p>’;
    ———————————————————————————–

    トピック投稿者 ukkyi

    (@ukkyi)

    デバックモードの【index.php on line 58】のエラーの修正後
    【functions.php on line 54】のエラーが消えたように思います。

    ただ、関数の使い方が間違っているのであれば修正したほうがよろしいでしょうか?

    モデレーター Daisuke Takahashi

    (@extendwings)

    将来的にWordPressの仕様が変更された際に動作しなくなる可能性があるので修正するべきだと思います。

    “File name too long”についてはこれだけの情報だと判断のしようがないです。原因がどこにあるのかも断言できません。

    comments.phpについて、$conuntや$aria_reqは正しく宣言されていますか?タイプミスや宣言時の条件判定などを確認してみてください。

11件の返信を表示中 - 1 - 11件目 (全11件中)
  • トピック「PHP スクリプトエラーでサーバーに高負荷がかかりサーバーを停止されてし」には新たに返信することはできません。