PHP定数「PHP_EOL」はいつ使用しますか?


360

いつ使用するのが良いPHP_EOLでしょうか?

PHPのコードサンプルでこれが見られることがあります。これはDOS / Mac / Unixの最終行の問題を処理しますか?


1
このページの賛成投票には、誤解を招くアドバイスがたくさんあると思います。2つの異なるプラットフォームでスクリプトを実行し、出力または生成されたデータ(ログファイル、htmlページ、データベースレコードなど)を比較すると、PHP_EOLはdiffの不一致を引き起こします。ほとんどの場合、これはあなたが望むものではありません。
ドンキホーテ2018年

回答:


357

はい、PHP_EOL表面上はクロスプラットフォーム互換の方法で改行文字を見つけるために使用されているため、DOS / Unixの問題を処理します。

PHP_EOL現在のシステムのエンドライン文字を表すことに注意してください。たとえば、UNIXライクなシステムで実行した場合、Windowsの最終行は見つかりません。


9
コマンドラインスクリプトを記述するときに、それをエンドライン文字として使用する必要がありますか?
Thomas Owens、

5
@Andre:他の人がインストール、使用、展開するアプリを書く人はどうですか?これらすべてが「サポートされるプラットフォーム」を* nixに制限することを提案していますか?
円柱形

1
@Stann-あなたが知っている「大きなプロジェクト」が何をしているかは、ベストプラクティスを決定する要因にはなりません。一部のWindowsサーバーを含む複数のホストに部分的にデプロイされる「大きなプロジェクト」を維持しています。仮定しないでください-定数は何も害を与えず、プラットフォームに依存しないコードを書くための完全に有効な方法です。反対のあなたのコメントはやや馬鹿げています。
クリスベイカー

5
いいえ、あなたの答えは正しいとは思いません。あるシステムでコードを生成し、その出力を別のシステムに送信します。ただし、PHP_EOLは、それが使用されているシステムに対してのみ行末区切り文字を通知します。他のシステムが同じ区切り文字を使用することを保証するものではありません。以下の私の答えを参照してください。
StanE

1
ただしPHP_EOL、フォームから投稿されたデータには使用しないでください。
Nabi KAZ 2016年

88

main/php.hPHPのバージョン7.1.1とバージョン5.6.30の:

#ifdef PHP_WIN32
#   include "tsrm_win32.h"
#   include "win95nt.h"
#   ifdef PHP_EXPORTS
#       define PHPAPI __declspec(dllexport)
#   else
#       define PHPAPI __declspec(dllimport)
#   endif
#   define PHP_DIR_SEPARATOR '\\'
#   define PHP_EOL "\r\n"
#else
#   if defined(__GNUC__) && __GNUC__ >= 4
#       define PHPAPI __attribute__ ((visibility("default")))
#   else
#       define PHPAPI
#   endif
#   define THREAD_LS
#   define PHP_DIR_SEPARATOR '/'
#   define PHP_EOL "\n"
#endif

あなたが見ることができるようにPHP_EOLすることができ"\r\n"ます(Windowsサーバーの場合)または"\n"(何かに)。PHPバージョンで 5.4.0RC8、のための可能な第3の値があったPHP_EOL"\r"(MacOSXのサーバ上)。これは誤りで、バグ61193により2012-03-01で修正されています。

他の人がすでに言ったように、統一された改行が必要なPHP_EOLあらゆる種類の出力(HTML、XML、ログなど、これらの値のいずれかが有効である場合)で使用できます。値を決定するのはサーバーではなく、クライアントであることを覚えておいてください。Windowsの訪問者は、Unixサーバーから値を取得しますが、この値は訪問者にとって不便です。

PHP_EOLここにはまだ表示されていないので、PHPソースによってサポートされている可能性のある値を表示したかっただけです...


3
ワオ。PHP開発者はこれについては間違っています。ウィキペディアのリンクとして言及したように、Mac OS 9以前は「\ r」を使用していましたが、「\ n」を使用するOS Xは使用していませんでした。誰かがバグレポートを提出する必要があります...
imgx64 2012年

27
@ imgx64多分そうですが、正直に言って本番のMACサーバーを見たことがありますか?
AlexV 2012年

3
@ imgx64投稿から33日後に修正されました:)現在のソースを反映するように回答を更新しました。
AlexV 2013年

2
PHP_EOLを出力に使用するための引数(!)は有効ではないと思います。PHP_EOLはサーバー側ですが、出力は通常クライアント用です(異なる行末区切り文字を使用します)。例:PHP_EOLを使用してLinuxシステムで複数行のプレーンテキスト出力を作成し、それをWindowsシステムに送信する場合、それは有効な行末区切り文字ではなく、どのクライアントソフトウェアが出力を表示するかによって異なります。ブラウザーと一部のテキストエディターはこれを処理しますが、たとえばメモ帳でテキストを表示すると、すべてが1行で表示されます。
StanE 2015

php -r "echo addcslashes(PHP_EOL, PHP_EOL), PHP_EOL;"見つけるために。
ボブスタイン

82

PHP_EOL新しいラインが必要で、クロスプラットフォームになりたいときに使用します。

これは、ファイルシステム(ログ、エクスポート、その他)にファイルを書き込んでいる場合です。

生成されたHTMLを読みやすくする場合に使用できます。つまり、あなたに従うかもしれない<br />PHP_EOL

phpをcronからのスクリプトとして実行していて、何かを出力して画面用にフォーマットする必要がある場合に使用します。

何らかのフォーマットが必要なメールを送信するメールを作成している場合は、これを使用できます。


25
HTMLを生成するときに、プラットフォームに依存しない改行を使用する必要はありません。
Rob

6
@Rob、古いバージョンのIEでより良いページソースビューアが提供された場合、Windowsのメモ帳で同意した可能性があります。
Zoredache 2010年

14
@Zoredache-HTMLは、PHPが実行されているプラ​​ットフォームに適した改行で生成されます。ページにアクセスしているプラ​​ットフォームには必ずしも適切ではありません。
ドミニクロジャー2010

2
メール作成について言及した場合の+1 $header = "From: $from" . PHP_EOL; $header .= "Reply-To: $from" . PHP_EOL; $header .= "Return-Path: $from" . PHP_EOL;
Jakob Cosoroaba、

49
PHP_EOL電子メールヘッダーの分離には使用しないでください。PHPメールのマニュアルによると、複数の追加ヘッダーはCRLF(\ r \ n)で区切る必要があります。
HalilÖzgür、2010年

19

PHP_EOL(文字列)このプラットフォームの正しい「行末」記号。PHP 4.3.10およびPHP 5.0.2以降で使用可能

この定数は、サーバーのファイルシステムでテキストファイルを読み書きするときに使用できます。

ほとんどのソフトウェアは、その起源に関係なくテキストファイルを処理できるため、ほとんどの場合、行末は重要ではありません。あなたはあなたのコードと一貫しているべきです。

行末が重要な場合は、定数を使用する代わりに、行末を明示的に指定します。例えば:

  • HTTPヘッダー\r\n
  • CSVファイル\r\n行区切り記号として使用する必要があります

5
「HTTPヘッダーは...」のソース:ietf.org/rfc/rfc2616.txtチャプター4セクション1
AdrianFöder

2
SMTPのメッセージラインはなければなりませんで終了する\r\n
ボブ・スタイン

12

「いつ使用しないか」については、まだカバーされておらず、盲目的に使用されており、問題が発生していることに気づいていないため、後で回答する予定です。これの一部は、既存の回答の一部と多少矛盾します。

HTMLでWebページに出力する場合、特にでテキストを出力する場合<textarea><pre>または<code>常に使用\nしたいが、使用したくない場合PHP_EOL

これは、コードが1つのサーバー(Unixのようなプラットフォーム)でうまく機能する一方で、Windowsホスト(Windows Azureプラットフォームなど)にデプロイされた場合、一部のブラウザーでのページの表示方法が変わる可能性があるためです(特にInternet Explorer-一部のバージョンでは、\ nと\ rの両方が表示されます)。

これがIE6以降の問題であるかどうかはわかりません。かなりおもしろくないかもしれませんが、人々がコンテキストについて考えるよう促すのに役立つかどうか、言及する価値があるようです。\r一部のプラットフォームでを突然出力すると、出力に問題が発生する可能性のある他のケース(厳密なXHTMLなど)がある可能性があります。そのような他のエッジケースがあると確信しています。

誰かがすでに述べたように、HTTPヘッダーを返すときにこれを使用することは望ましくありません。これらは、どのプラットフォームでも常にRFCに従う必要があるためです。

(誰かが示唆したように)CSVファイルの区切り文字などには使用しません。サーバーが実行されているプラ​​ットフォームは、生成または消費されたファイルの行末を決定するべきではありません。


10

特にファイルに複数行のコンテンツを書き込む場合、PHP_EOLはファイル処理に非常に役立つことがわかりました。

たとえば、プレーンファイルに書き込むときに複数の行に分割する長い文字列があるとします。\ r \ nを使用しても機能しない場合があるので、単純にPHP_EOLをスクリプトに挿入すると、すばらしい結果が得られます。

以下の簡単な例をご覧ください。

<?php

$output = 'This is line 1' . PHP_EOL .
          'This is line 2' . PHP_EOL .
          'This is line 3';

$file = "filename.txt";

if (is_writable($file)) {
    // In our example we're opening $file in append mode.
    // The file pointer is at the bottom of the file hence
    // that's where $output will go when we fwrite() it.
    if (!$handle = fopen($file, 'a')) {
         echo "Cannot open file ($file)";
         exit;
    }
    // Write $output to our opened file.
    if (fwrite($handle, $output) === FALSE) {
        echo "Cannot write to file ($file)";
        exit;
    }
    echo "Success, content ($output) wrote to file ($file)";
    fclose($handle);
} else {
    echo "The file $file is not writable";
}
?>

3
\ nは\ rはシーケンスとしての仕事は、\ rを\ n個であることを意味していないん</衒学>
frak

10

いいえ、PHP_EOLはエンドラインの問題を処理しません。その定数を使用するシステムは、出力を送信するシステムとは異なるためです。

PHP_EOLの使用はお勧めしません。Unix / Linuxは\ nを使用し、MacOS / OS Xも\ rから\ nに変更され、Windowsでは多くのアプリケーション(特にブラウザ)でも正しく表示できます。Windowsでは、既存のクライアント側コードを変更して、\ nのみを使用して下位互換性を維持することも簡単です。行トリミングの区切り文字を\ r \ nから\ nに変更し、trim()のような関数でラップします。 。


3
私の回答が反対票を投じられた理由を知りたいと思います...クレイジー... 私が正しい間、受け入れられた回答は間違っています。PHP_EOLが問題を処理すると言うのは、一般に正しくありません。同じシステムとの間で何かを読み書きする場合にのみ使用できます(使用する必要があります)。しかし、ほとんどの場合、PHPは何かをクライアントに送り返すために使用されます(これは、質問者が考えていた可能性が高いです)。繰り返しますが、PHP_EOLは純粋なサーバー側定数です。クライアント側の改行は正しく処理されません(処理できません)。私が何か間違ったことを書いたと思うなら、コメントを書いて教えてください。
StanE

3
穀物に対して良いポイントを作るための+1。ブラウザはHTMLの空白をレンダリングしないため、失われたと思います。そのため、一般的な使用法はコンソールアプリケーションです。そして、あなたが言ったように、その場合、行末は実行環境で解釈されます。これは、コンソールアプリケーションでは意味がありますが、クライアントサーバーWebアプリケーションでは意味がありません。
Jeff Puckett 2016

まあ、答えは実際には関係ありません。ブラウザの互換性について言及し、他のシステムにファイルを送信します。改行はテキスト出力に関連するため、ブラウザは関連しません。そして、あなたの主なポイントとは逆に、これらのテキストファイル通常、それらが書かれているのと同じプラットフォームで消費されます。
grantwparks 2018年

6

PHP_EOLの定義は、作業中のオペレーティングシステムの改行文字を提供することです。

実際には、これはほとんど必要ありません。いくつかのケースを考えてみましょう:

  • あなたがウェブに出力しているとき、あなたが一貫しているべきであるということを除いて、どんな慣習もありません。ほとんどのサーバーはUnixyであるため、とにかく「\ n」を使用する必要があります。

  • ファイルに出力する場合、PHP_EOLは良い考えのように思えるかもしれません。ただし、ファイル内にリテラルの改行を挿入することで同様の効果を得ることができます。これは、既存の改行を壊さずにUnixでCRLF形式のファイルを実行しようとしている場合に役立ちます(デュアルブートシステムを持つ人として)。 、私は後者の行動を好むと言うことができます)

PHP_EOLは非常に長いので、実際に使用する価値はありません。


33
「PHP_EOLはとんでもないほど長い」の場合は-1。有効な引数ではありません。
viam0Zah 2010年

1
まったく同感です。* nix以外にphpをデプロイしてもまったく意味がありません。したがって、PHP_EOLまたはDIRECTORY_SEPARATORを使用しても意味がありません。
Stann

@Stann「* nix以外にphpをデプロイしてもまったく意味がありません」についてのあなたのポイントを説明できますか?
Sajuuk 2017

2
@Sajuuk「皮肉」と呼ばれると思います。
フェリックスギャニオン-Grenierの

3

それが役立つかもしれない明白な場所が1つあります。主に単一引用符の文字列を使用するコードを書いているときです。以下については議論の余地があります:

echo 'A $variable_literal that I have'.PHP_EOL.'looks better than'.PHP_EOL;  
echo 'this other $one'."\n";

それの芸術は一貫していることです。''と ""の混合と照合の問題は、長い文字列を取得するときに、使用した引用符のタイプを探す必要がないことです。

人生のすべてのものと同様に、それは文脈に依存します。


3

DOS / Windows標準の「改行」はCRLF(= \ r \ n)であり、LFCR(\ n \ r)ではありません。後者を使用すると、予期しない(実際には、一種の期待どおりの:D)動作が発生する可能性があります。

今日、ほとんどすべての(よく書かれた)プログラムは、メール送信デーモン(RFC がヘッダーとメッセージ本文の改行としてCRLFを設定する)であっても、改行コードとしてUNIX標準のLF(\ n)を受け入れます


2

複数の行を出力する場合にerror_log()を使用すると便利です。

開発者は文字列を分割するときにunixで終わると想定しているため、Windowsインストールでは多くのデバッグステートメントが奇妙に見えます。


2

PHP_EOL定数は、記述しなければならないいくつかのコマンドラインスクリプトで使用しています。ローカルのWindowsマシンで開発し、Linuxサーバーボックスでテストします。定数を使用することで、さまざまなプラットフォームごとに正しい行末を使用することを心配する必要がなくなりました。


2

任意のOSを使用できるユーザーからのアクションの後に、ロギングスクリプトが新しい行のテキストをテキストファイルに書き込むサイトがあります。

この場合、PHP_EOLの使用は最適ではないようです。ユーザーがMac OSでテキストファイルに書き込む場合、\ nが配置されます。Windowsコンピュータでテキストファイルを開くと、改行が表示されません。このため、代わりに「\ r \ n」を使用します。これは、任意のOSでファイルを開くときに機能します。


1

あなたは主に一重引用符の文字列を使用するコードを書いています。

echo 'A $variable_literal that I have'.PHP_EOL.'looks better than'.PHP_EOL;  
echo 'this other $one'."\n";

0

私はWebCalendarを使用していますが、行末が「\ r \ n」としてxcal.phpにハードコードされているため、生成されたicsファイルをインポートするときにMac iCalがバーコードを検出します。私は行ってすべての出現箇所をPHP_EOLに置き換えましたが、iCalは満足しています!また、Vistaでテストしました。行末文字が「\ n」であっても、Outlookはファイルをインポートすることもできました。


<late>つまり、アプリケーションがWindowsサーバーにデプロイされると、アプリケーションが誤動作します。必要に応じて\n、それを明示的に使用してください。
duskwuff -inactive- 2017

0

jumi(PHP用のjoomlaプラグイン)が何らかの理由でコードをコンパイルすると、コードからすべてのバックスラッシュが削除されます。のようなものが$csv_output .= "\n";なるように$csv_output .= "n";

非常に迷惑なバグ!

代わりにPHP_EOLを使用して、結果を取得します。


2
これがまだ発見されていない構成の問題であることを本当に願っています。私はjoomlaを使用していませんが、それが実際にそれがどのように機能するかというと、なんとひどい振る舞いでしょうか。
jon_darkstar 2010

0

一部のシステムでは、この定数を使用すると便利な場合があります。たとえば、メールを送信する場合、PHP_EOLを使用してクロスシステムスクリプトをより多くのシステムで機能させることができます...しかし、それが役立つ場合でもこれを見つけることができます最新のphpエンジンを使用した一定の未定義の最新のホスティングにはこの問題はありませんが、この状況を保存するビットコードを記述することは良いことだと思います。

<?php
  if (!defined('PHP_EOL')) {
    if (strtoupper(substr(PHP_OS,0,3) == 'WIN')) {
      define('PHP_EOL',"\r\n");
    } elseif (strtoupper(substr(PHP_OS,0,3) == 'MAC')) {
      define('PHP_EOL',"\r");
    } elseif (strtoupper(substr(PHP_OS,0,3) == 'DAR')) {
      define('PHP_EOL',"\n");
    } else {
      define('PHP_EOL',"\n");
    }
  }
?>

そのため、問題なくPHP_EOLを使用できます...一度に複数のシステムで動作するスクリプトでPHP_EOLを使用する必要があることは明らかです。それ以外の場合は、\ nまたは\ rまたは\ r \ n ...を使用できます。

注:PHP_EOLは

1) on Unix    LN    == \n
2) on Mac     CR    == \r
3) on Windows CR+LN == \r\n

この回答がお役に立てば幸いです。


0

Windowsクライアントに出力するときにこの問題が発生しました。もちろん、PHP_EOLはサーバー側向けですが、phpからのほとんどのコンテンツ出力はWindowsクライアント向けです。だから私は私の発見を次の人のためにここに置く必要があります。

A)「My Text」をエコーし​​ます。PHP_EOL; //これは単に\ nを出力するだけで、Windowsのメモ帳のほとんどのバージョンはこれを1行で表示し、ほとんどのWindowsアカウンティングソフトウェアはこのタイプの行末文字をインポートできないため、不良です。

B) 'My Text \ r \ n'をエコーし​​ます。//一重引用符で囲まれたphp文字列は\ r \ nを解釈しないため、悪い

C)「My Text \ r \ n」をエコーし​​ます。//うまくいきました!メモ帳では正しく見え、WindowsアカウンティングやWindows製造ソフトウェアなどの他のWindowsソフトウェアにファイルをインポートするときに機能します。


-2

私は\ n \ rを使用することを好みます。また、私はWindowsシステムを使用しており、\ n私の経験では問題なく動作します。

PHP_EOLは正規表現では機能せず、これらはテキストを処理するための最も有用な方法であるため、実際に使用したり、使用したりすることはありませんでした。


12
改行文字の順序に注意してください。\ r \ n(CR + LF)である必要があります:en.wikipedia.org/wiki/Newline
azkotoki

あなたはそれを使用しませんが、あなたのサイトはどのPCでも
だれ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.