tag:crieit.net,2005:https://crieit.net/tags/ob_start/feed 「ob_start」の記事 - Crieit Crieitでタグ「ob_start」に投稿された最近の記事 2021-11-18T00:03:13+09:00 https://crieit.net/tags/ob_start/feed tag:crieit.net,2005:PublicArticle/17769 2021-11-18T00:03:13+09:00 2021-11-18T00:03:13+09:00 https://crieit.net/posts/output-var-dump-as-log-in-wordpress-20211118 WordPress で処理の結果をログに出力したい <p>WordPress のアクションフックで処理している内容を覗き見たいと考えました。</p> <p>ただし、記事を公開した際の <code>publish_post</code> で処理される内容を見たい……というようなケースでは、画面出力するとブロックエディタの画面に出力されることになり、表示が大幅に崩れたりして悪影響が出ることが想定されます。</p> <p>そこで、ログファイルにこっそり吐き出す方法を採ることにしました。</p> <h2 id="コード"><a href="#%E3%82%B3%E3%83%BC%E3%83%89">コード</a></h2> <pre><code class="php"><?php ob_start(); var_dump($post); var_dump($term); $result = ob_get_clean(); $log_message = sprintf("%s:%s\n", date_i18n('Y-m-d H:i:s'), htmlspecialchars($result, ENT_QUOTES, 'UTF-8')); error_log($log_message, 3, __DIR__ . '/debug_log.txt'); </code></pre> <p>サンプルですが、上述のようなイメージ。 <code>var_dump()</code> を文字列として出力するためのバッファリングを使用しつつ、その文字列に日付等を付与してログの出力のような体裁を整えることにしました。</p> <p>そしてその内容をPHP標準の <code>error_log()</code>関数 でファイルに出力します。</p> <p>なお、このコードを使用するに当たり WordPress の <code>wp-config.php</code> で次のようにデバッグモードとデバッグのログ出力を有効にしておきます。</p> <pre><code class="php">//define('WP_DEBUG', false); define('WP_DEBUG', true); define('WP_DEBUG_LOG', true); </code></pre> <p>これでファイルに変数の中身が出力されるので確認できます。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://futureys.tokyo/how-to-log-and-its-mechanism-in-wordpress/">WordPress のログ出力方法と仕組み | ultra code</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.sofplant.com/blog/tech/wordpress-log-output/">WordPressの本番運用中にログ出力をする方法 | ソフプラント</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://tm.root-n.com/programming:php:etc:error_log">PHP :: error_log() 関数を利用したロギング [Tipsというかメモ]</a></li> </ul> arm-band tag:crieit.net,2005:PublicArticle/17768 2021-11-18T00:01:02+09:00 2021-11-18T00:01:02+09:00 https://crieit.net/posts/output-var-dump-as-str-20211117 var_dump() の中身を文字列として処理したい <h2 id="経緯"><a href="#%E7%B5%8C%E7%B7%AF">経緯</a></h2> <p><code>var_dump()</code> の出力結果がHTMLを含む文字列のオブジェクトだと仮定します。</p> <p>そのまま出力されると、当然オブジェクトの中に含まれるHTMLタグがブラウザに認識されてレンダリングされてしまいます。</p> <p>これでは、元々あったタグや構造とバッティングして表示が崩れてしまう上に、肝心の値の中身を文字列として確認することができません。</p> <p>……かといって中身がオブジェクトなので <code>htmlspecialchars()</code> もそのままではかけられないですし、オブジェクトの他の値も参照したいので「オブジェクトをループ→全ての項目を出力しつつHTMLが含まれている値のみ <code>htmlspecialchars()</code> で処理する」ということも難しい。</p> <p>これにどう対処するか、というお話です。</p> <h2 id="結果"><a href="#%E7%B5%90%E6%9E%9C">結果</a></h2> <p>最終的に「一時的にバッファに保存し、文字列となったところで <code>htmlspecialchars()</code> で処理して出力する」という方法に辿り着きました。</p> <p>サンプルコードとしては以下のような形。</p> <pre><code class="php"><pre> <code> <?php ob_start(); var_dump($sample_obj); var_dump($sample_str); $result = ob_get_clean(); echo htmlspecialchars($result, ENT_QUOTES, 'UTF-8'); ?> </code> </pre> </code></pre> <p><code>pre</code>, <code>code</code>タグ で囲みつつ、 <code>var_dump()</code> の中身を一度バッファに保存するように <code>ob_start()</code> でバッファリングを開始。</p> <p><code>var_dump()</code> で変数を出力(実際にはバッファに保存)し、一通り出力したい内容をバッファに保存したら <code>ob_get_clean()</code> でバッファを削除しつつバッファの中身を変数に。</p> <p>残された変数を <code>htmlspecialchars()</code> で処理して出力する、と。</p> <p>これで問題を解決しました。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://teratail.com/questions/402">PHP - PHP var_dump()の結果をstringにして扱いたい|teratail</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.php.net/manual/ja/function.ob-start.php">PHP: ob_start - Manual</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.php.net/manual/ja/function.ob-get-clean.php">PHP: ob_get_clean - Manual</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://bayashita.com/p/entry/show/210">var_dump の内容をテキストファイルに出力する方法[PHP] : バヤシタ</a></li> </ul> arm-band