web-dev-qa-db-ja.com

RSS XMLファイルを開く空白スペース-解決方法

Drupal core 7.xに付属するRSSフィードで問題が突然発生しています。開始XMLタグの前に2つのスペースがあるため、無効になっています。次のエラーフィードバリデーターで取得するものです。

行1、列2:XML解析エラー:<不明>:1:2:XMLまたはテキスト宣言がエンティティの先頭にありません

だから私はStack Exchangeに関する他の関連する投稿を知っていて、以下に言及されていることを試しました:

これまでに行ったことは次のとおりです。

  • 開始タグの前に空白スペースが含まれていないか、Webサイト上のすべてのPHPファイルを確認しました。いくつかありましたが、すべて修正しましたが、助けにはなりませんでした。
  • デフォルトのテーマを別のテーマに変更し、テーマに関連していないことを確認しました。
  • ビューでカスタムRSSフィードを作成すると、XMLの開始タグの前に同じ2つの空白スペースが表示されます。
  • PHP=タグをすべての場所に手動で書き込んだすべてのページ、ブロック、ビューをチェックし、これを引き起こす可能性のあるすべてのスペースを削除しました。
  • すべてのモジュールとDrupalコアが最新バージョンに更新されます。
  • Drupalフォーラムで、XMLサイトマップ、メタタグ、RDF、Schema.org(使用しているモジュール)の関連する問題についてフォーラムで確認しましたが、成功しませんでした。上記のモジュールを1つずつ無効にしました1つですが、成功しませんでした。
  • 最終的に、PHPファイルが何も含まれていないsites/default/files /フォルダーを除いて、完全なWebサイトをエクスポートし、ローカルにインポートしました。空白のスペースはローカルセットアップで削除されます。

少し難しいのは、RSSフィードがいつ壊れたかわからないことです。それは1週間から数か月の間になる可能性があり、いくつかのcontribモジュールを更新したときに除外することが困難になります。

そのため、特にローカルセットアップでは問題が発生しないため、これを見つけるのは非常に必死です。私たちはニュースWebサイトを持っているので、RSSフィードが機能していることが非常に重要です。

私たちは何かを見落としているに違いありませんが、それが何であるかはわかりません。

2
Apoc

さらにトラブルシューティングのアイデア:

  • スペースはRSSページだけに表示されますか、それとも他のページにも表示されますか?これにより、問題が中心的な場所にあるのか、RSSフィードに対してのみロードされるテンプレート/インクルードファイルにあるのかがわかります。

  • var_dump(get_included_files())を使用して(理想的にはテンプレートで、XMLが生成される直前に)、これまでに含まれていたすべてのPHPファイル)のリストを表示できます。これにより、調査中-ファイルの最後にあるPHPタグの終了、印刷ステートメントなどを探します。

また、ダーティな回避策のアイデア(他の問題を引き起こす可能性がありますが、緊急の場合は試してみる価値があります):ob_start()はすべての出力をバッファーに入れ、ob_end_clean()はそれを削除します。したがって、index.phpの先頭にob_start()を配置し、RSSテンプレートの先頭にob_end_clean()を配置すると、このmightによって、スペース。 (スクリプトが終了したときにバッファがまだ開いている場合は、バッファが自動的にフラッシュされるため、他の影響はありません。)

3

ページ出力の空白をデバッグするには、 XDebug PHP extension を使用できます。XDebugPHPのiniファイルで推奨されるオプションは次のとおりです。

; Data
xdebug.default_enable = 1           ; bool: The stacktraces will be shown by default on an error event.
xdebug.collect_vars = 1             ; bool: Gather information about which variables are used in a certain scope.
xdebug.show_local_vars=1            ; int: Generate stack dumps in error situations.
xdebug.collect_assignments=1        ; bool: Controls whether Xdebug should add variable assignments to function traces.
xdebug.collect_params=4             ; int1-4: Collect the parameters passed to functions when a function call is recorded.
xdebug.collect_return=1             ; bool: Write the return value of function calls to the trace files.
xdebug.var_display_max_children=256 ; int: Amount of array children and object's properties are shown.
xdebug.var_display_max_data=1024    ; int: Max string length that is shown when variables are displayed.
xdebug.var_display_max_depth=5      ; int: How many nested levels of array/object elements are displayed.
xdebug.show_mem_delta=0             ; int: Show the difference in memory usage between function calls.
xdebug.show_exception_trace=0       ; bool: Show a stack trace whenever an exception is raised.
xdebug.max_nesting_level=256        ; int: Controls the protection mechanism for infinite recursion protection.

次に、段階的なデバッグモードを使用するか、一時的にアクティブ化 xdebug.auto_trace=1 して、リクエストごとにxdebug.trace_output_dir内にトレースファイルを生成します。

次に、XMLファイルを要求し、トレースファイルを確認します。近端にある特定の関数の戻りをチェックしてそのソースを追跡するのにはしばらく時間がかかりますが、少なくともそれは可能です。


または、できるだけ多くのモジュールを無効にして、試行錯誤によって問題を見つけることができます。


.moduleのファイルの1つに後続スペースが含まれていると思われる場合は、次のexコマンド(Vimの一部)を使用すると、これらのファイルがすべて削除されます。

ex +'bufdo!%s/\s\+$//e' -scxa **/*.*

注:シェルが 新しいグロビングオプション をサポートしている場合、再帰的なスキャンには**を使用します。有効化:shopt -s globstar


別の方法は、 Coder module を使用して、コーディング標準を通じてファイルを実行することです。インストール後、次のコマンドは、隠しトレーリングスペースに関連する問題を検出します。

phpcs --standard=Drupal some_folder/

問題をインプレースで修正するには、次の方法を試してください。

phpcbf --standard=Drupal some_folder/

注:上記のコマンドはすべてのファイルを再フォーマットするため、実行する前に、すべてがコミットまたはバックアップされていることを確認してください。

0
kenorb