- ベストアンサー
PHP実行時間の原因と対策
- PHPの実行時間が異常に長くなる原因を特定するために、いくつかの処理を行っています。
- 具体的には、SimpleXML関数を使用してブログのRSSを取得し、各記事をループして本文を抽出し、200文字までの抜粋を作成しています。
- 抜粋した文章をNグラム法で分解し、MySQLにフルテキストインデックスとして挿入しています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
大変興味があります。 問題の箇所が独自に定義された関数であり、またそれの利用方法についても改行を取り除くだけということですので、一度これを標準関数に置き換えてはいかがでしょうか。 改行を取り除くだけであれば、例2 の方法でよいと思います。 http://jp.php.net/manual/ja/function.str-replace.php また、処理が中断されてしまう箇所にエラー情報を収集するコードをもう少し書き足してみたり、ポイントごとにログを書き出すようにしたりすると、様子がはっきりするかもしれません。 http://jp.php.net/manual/ja/book.errorfunc.php いつも 5回目のループでこけるのか、それとも特定のフィードでたまたま 5番目の記事でこけたのか、そのあたりも気になります。はじめのフィード取得でデータが壊れていないかも確認したいところです。 フィードの文字コードセットを取得して、設定できる関数には極力これを設定するというのが大事かもしれないですね。 しかし、まずは改行を取り除く部分だけとりあえず標準関数にしてみてはいかがでしょうか。
その他の回答 (1)
特定の制御文字を除去したいだけであれば「str_replace()」で問題は発生しないと思います。 ただ、有名なオープンソース SNS でのフィルタリング処理を見ますと「preg_replace()」の u 修飾子つきでしたので、読み込んだフィードが UTF-8 で記述されている限りは、これに倣うのがよいかもしれませんね。 「str_replace()」や「preg_replace()」が制御文字をどのような方法で発見するのかは、ソースを読めばわかると思うのですが、これはやっていません。安心がほしい場合はこのあたりを確認してみてください。 あと、出来れば一問一答形式でお願いします。
お礼
回答ありがとうございました!
補足
回答ありがとうございました。 まず回答について補足させていただきます。 ・いつも特定の記事でこけているようです。 ・はじめのフィード取得で実際にはfile_get_contentsした後に、文字コードの確認、制御文字や不完全なマルチバイト文字等の基本的なチェックをした後、 simplexml_load_stringでオブジェクト化しています。 ・(しかしバイナリセーフでない関数で定義されているmb_str_replaceでNULLバイト文字のチェックをしていたので意味がありませんでした) ・質問投稿後、mb_str_replaceをstr_replaceに置き換えたところ、問題なく動作することが確認できました。 ・しかし不安なのでu修飾子をつけたpreg_replaceに置き換えました(問題なく動作しました) 次に、質問の追加をさせていただきたいと思います。 正規表現置換ではマルチバイト対応の関数でないと文字化けするとよく注意書きがありますが、 今回のようにマルチバイト文字が含まれる文字列から、マルチバイトではない文字を置き換える場合、 マルチバイトに対応していないstr_replaceが文字化けの原因になることはありますか?