PHP 상수“PHP_EOL”은 언제 사용합니까?


360

언제 사용하는 것이 좋 PHP_EOL습니까?

때로는 PHP 코드 샘플에서 이것을 볼 수 있습니다. DOS / Mac / Unix 종료 문제를 처리합니까?


1
이 페이지의 공감 된 답변에 많은 잘못된 조언이 있다고 생각합니다. 두 개의 다른 플랫폼에서 스크립트를 실행 한 다음 출력 또는 생성 된 데이터 (로그 파일, html 페이지, 데이터베이스 레코드 등)를 비교하면 PHP_EOL이 diff에서 불일치를 초래합니다. 대부분의 경우 이것은 원하는 것이 아닙니다.
donquixote

답변:


357

예, PHP_EOL표면적으로는 DOS / 유닉스 문제를 처리 할 수 있도록, 크로스 플랫폼 호환 방식으로 개행 문자를 찾는 데 사용됩니다.

참고 PHP_EOL가 에 대한 endline 문자를 나타내는 현재의 시스템을. 예를 들어, 유닉스 계열 시스템에서 실행될 때 Windows 종료를 찾지 못합니다.


9
명령 행 스크립트를 작성할 때 엔드 라인 문자로 사용해야합니까?
토마스 오웬스

5
@Andre : 다른 사람이 설치, 사용 및 배포 할 앱을 작성하는 사람은 어떻습니까? 이것들은 모두 "지원되는 플랫폼"을 * nix로 제한해야한다고 제안하고 있습니까?
Cylindric

1
@Stann-당신이 알고있는 "큰 프로젝트"가 무엇을 하는가는 물론 유용한 것이 아니라, 모범 사례를 결정 짓는 요소는 아닙니다. 일부 Windows 서버를 포함하여 여러 호스트에 부분적으로 배포 된 "큰 프로젝트"를 유지 관리합니다. 상수는 아무 것도 아프지 않으며 플랫폼 중립 코드를 작성하는 완벽하게 유효한 방법이라고 가정하지 마십시오. 반대로 당신의 의견은 다소 모호합니다.
Chris Baker

5
아니요, 귀하의 답변이 옳다고 생각하지 않습니다. 한 시스템에서 코드를 생성하지만 다른 시스템으로 출력을 보냅니다. 그러나 PHP_EOL은 사용되는 시스템에 대해서만 줄 끝 구분 기호를 알려줍니다. 다른 시스템이 동일한 분리 문자를 사용한다고 보장하지는 않습니다. 아래 답변을 참조하십시오.
StanE

1
PHP_EOL양식에서 게시 된 데이터 에는 사용하지 마십시오 .
Nabi KAZ

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

보시다시피 (Windows 서버 또는 기타) PHP_EOL가 될 수 있습니다 . PHP 버전에서 종래 5.4.0RC8위한 제 3 값 수 있었다 : (에서라도 서버). 잘못되어 2012-03-01 버그 61193 으로 수정되었습니다 ."\r\n""\n"PHP_EOL"\r"

다른 사람들이 이미 말했듯이, 당신은 사용할 수 있습니다 PHP_EOL(출력의 어떤 종류의 모든 사용자가 통합 원하는 : - HTML, XML, 로그 ...처럼이 값이 유효) 뉴 라인 . 클라이언트가 아닌 값을 결정하는 것은 서버라는 점에 유의하십시오. Windows 방문자는 때때로 불편한 Unix 서버에서 가치를 얻습니다.

PHP_EOL여기에 아직 표시되지 않았기 때문에 PHP 소스 의 지원 가능한 값을 보여주고 싶었습니다 .


3
와. PHP 개발자는 이것에 대해 틀 렸습니다. Wikipedia 링크에서 언급했듯이 Mac OS 9 및 이전 버전에서는 "\ r"을 사용했지만 "\ n"을 사용하는 OS X는 사용하지 않았습니다. 누군가가 버그 보고서를 제출해야합니다 ...
imgx64

27
@ imgx64 예,하지만 정직하게 프로덕션 MAC 서버를 본 적이 있습니까?
AlexV

3
@ imgx64 게시물 이후 33 일에 수정되었습니다. :) 현재 소스를 반영하도록 내 답변을 업데이트했습니다.
AlexV

2
출력 (!)에 PHP_EOL을 사용하는 인수가 유효하다고 생각하지 않습니다. PHP_EOL은 서버 측이며 출력은 일반적으로 클라이언트 (다른 ​​줄 끝 구분 기호를 사용)에 대한 것입니다. 예 : PHP_EOL을 사용하여 Linux 시스템에서 여러 줄로 된 일반 텍스트 출력을 만들어 Windows 시스템으로 보내면 유효한 줄 끝 구분 문자가 아니므로 클라이언트 소프트웨어가 출력을 표시 할 항목에 따라 다릅니다. 브라우저 및 일부 텍스트 편집기가이를 처리 할 수 ​​있지만 메모장과 같은 텍스트를 보면 모든 것이 한 줄로 표시됩니다.
StanE

php -r "echo addcslashes(PHP_EOL, PHP_EOL), PHP_EOL;"알아 내다.
Bob Stein

82

PHP_EOL새 줄을 원할 때 사용 하고 크로스 플랫폼이 되려고합니다.

파일 시스템에 파일을 쓰는 중일 수 있습니다 (로그, 내보내기 등).

생성 된 HTML을 읽을 수있게하려면 사용할 수 있습니다. 따라서 당신 <br />과 함께 할 수 있습니다 PHP_EOL.

cron에서 php를 스크립트로 실행하고 무언가를 출력하고 화면에 맞게 형식화 해야하는 경우이를 사용합니다.

형식을 지정해야하는 이메일을 작성하는 경우이를 사용할 수 있습니다.


25
HTML을 생성 할 때 플랫폼 독립적 인 줄 바꿈을 사용할 필요가 없습니다.
Rob

6
@Rob, 이전 버전의 IE가 나에게 더 나은 페이지 소스 뷰어를 제공했다면 Windows 메모장에 동의했을 것입니다.
Zoredache

14
@Zoredache-HTML이 PHP가 실행되는 플랫폼에 적합한 줄 바꿈으로 생성되며 반드시 페이지에 액세스하는 플랫폼에 적합하지는 않습니다.
Dominic Rodger

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 Mail 매뉴얼 에 따르면 여러 개의 추가 헤더를 CRLF (\ r \ n)로 분리해야합니다.
Halil Özgür

19

PHP_EOL (문자열)이 플랫폼에 대한 올바른 'End Of Line'기호. PHP 4.3.10 및 PHP 5.0.2부터 사용 가능

서버의 파일 시스템에서 텍스트 파일을 읽거나 쓸 때이 상수를 사용할 수 있습니다.

대부분의 소프트웨어는 원본 파일에 관계없이 텍스트 파일을 처리 할 수 ​​있으므로 대부분의 경우 줄 끝은 중요하지 않습니다. 코드와 일치해야합니다.

줄 끝이 중요한 경우 상수를 사용하는 대신 줄 끝을 명시 적으로 지정하십시오. 예를 들면 다음과 같습니다.

  • HTTP 헤더 해야한다 로 구분\r\n
  • CSV 파일 \r\n 행 구분 기호로 사용해야 합니다

5
"HTTP 헤더의 출처는 ...": ietf.org/rfc/rfc2616.txt 4 장 1 절
Adrian Föder

2
SMTP의 메시지 라인이 있어야 에 의해 종료\r\n
밥 스타

12

아직 다루지 않았기 때문에 "사용 하지 않을 때"를 다루는 답변을 던져보고 싶습니다. 맹목적으로 사용되고 있으며 나중에 줄까지 문제가 있음을 아무도 알지 못합니다. 이 중 일부는 기존 답변 중 일부와 다소 모순됩니다.

HTML의 웹 페이지에 출력하는 경우, 특히 텍스트 <textarea>, <pre>또는 <code>당신은 아마 항상 사용하고자 \n하지 PHP_EOL.

그 이유는 코드가 한 서버에서 잘 작동 할 수 있지만 (유닉스와 같은 플랫폼 일 수 있음) Windows 호스트 (예 : Windows Azure 플랫폼)에 배포 된 경우 일부 브라우저에서 페이지가 표시되는 방식이 변경 될 수 있기 때문입니다. (특히 Internet Explorer-일부 버전은 \ n과 \ r을 모두 볼 수 있습니다).

이것이 IE6 이후로 여전히 문제인지 여부는 확실하지 않으므로 상당히 어리석지 만 사람들이 컨텍스트에 대해 신속하게 생각하는 데 도움이되는지 언급하는 것이 좋습니다. \r일부 플랫폼 에서 갑자기 출력하는 경우 출력에 문제가 발생할 수있는 다른 경우 (예 : 엄격한 XHTML)가 있을 수 있으며, 이와 같은 다른 경우도있을 것입니다.

누군가 이미 언급했듯이 HTTP 헤더를 반환 할 때 항상 플랫폼에서 RFC를 따라야하므로 HTTP 헤더를 사용하지 않으려합니다.

나는 누군가가 제안한대로 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 \ 연구는 순서로 작업이 \ 연구 \ n 될 운명이되지 않습니다 </ 학자 인>
frak

10

아닙니다. PHP_EOL은 endline 문제를 처리하지 않습니다. 상수를 사용하는 시스템은 출력을 보내는 시스템과 동일하지 않기 때문입니다.

PHP_EOL을 전혀 사용하지 않는 것이 좋습니다. 유닉스 / 리눅스 사용 \ n, MacOS / OS X도 \ r에서 \ n으로 변경되었으며 Windows에서는 많은 응용 프로그램 (특히 브라우저)에서도 올바르게 표시 할 수 있습니다. Windows에서는 \ n 만 사용하고 기존 버전과의 호환성을 유지하도록 기존 클라이언트 측 코드를 쉽게 변경할 수 있습니다. .


3
내 답변이 다운 보트 된 이유를 아는 것이 좋을 것입니다 ... 크레이지 ... 수락 된 답변이 잘못 되었지만 내 것이 정확합니다. PHP_EOL이 문제를 처리한다고 말하는 것은 일반적으로 올바르지 않습니다. 같은 시스템 에서 무언가를 읽거나 쓸 때 사용할 수 있습니다. 그러나 대부분의 경우 PHP는 고객에게 무언가를 돌려 보내는 데 사용됩니다 (질문이 생각한 것 같습니다). PHP_EOL은 순수한 서버 측 상수입니다. 클라이언트 측 줄 바꿈을 올바르게 처리 할 수 ​​없으며 처리 할 수 ​​없습니다. 내가 뭔가 잘못했다고 생각되면 의견을 작성하여 알려주십시오.
StanE

3
곡물에 대해 좋은 지적을해서 +1. 브라우저가 html로 공백을 렌더링하지 않기 때문에 잃어 버린 것 같습니다. 일반적으로 콘솔 응용 프로그램에 사용됩니다. 그리고 당신이 말했듯이, 줄 끝은 실행 환경에 대해 해석되어 콘솔 응용 프로그램에는 적합하지만 클라이언트 서버 웹 응용 프로그램에는 적합하지 않습니다.
Jeff Puckett

대답은 실제로 관련이 없습니다. 브라우저 호환성 및 다른 시스템으로 파일 전송에 대해 언급했습니다. 줄 바꿈은 텍스트 출력과 관련이 있으므로 브라우저는 관련이 없습니다. 그리고 요점과는 달리 이러한 텍스트 파일 일반적으로 작성된 것과 동일한 플랫폼에서 사용됩니다.
grantwparks

6

PHP_EOL의 정의는 작업중인 운영 체제의 개행 문자를 제공한다는 것입니다.

실제로는 거의 필요하지 않습니다. 몇 가지 경우를 고려하십시오.

  • 웹에 출력 할 때는 일관성을 유지해야한다는 것을 제외하고는 아무런 규칙이 없습니다. 대부분의 서버는 Unixy이므로 "\ n"을 사용하고 싶을 것입니다.

  • 파일로 출력하는 경우 PHP_EOL이 좋은 생각처럼 보일 수 있습니다. 그러나 파일 내부에 리터럴 줄 바꿈을 사용하면 비슷한 효과를 얻을 수 있으며 이는 기존 개행을 방해하지 않고 Unix에서 일부 CRLF 형식의 파일을 실행하려는 경우 (듀얼 부트 시스템을 가진 사람으로) 도움이 될 것입니다. , 나는 후자의 행동을 선호한다고 말할 수있다)

PHP_EOL은 엄청나게 길어서 실제로 사용할 가치가 없습니다.


33
"PHP_EOL이 너무 길다"는 -1입니다. 유효한 인수가 아닙니다.
viam0Zah

1
나는 당신에게 완전히 동의합니다. * nix 이외의 다른 곳에 PHP를 배포 할 때는 아무런 의미가 없습니다. 따라서 PHP_EOL 또는 DIRECTORY_SEPARATOR를 사용할 필요가 없습니다.
Stann

@Stann "* nix 이외의 다른 곳에 PHP를 배포 할 때는 아무 의미가 없습니다"에 대한 요점을 설명 할 수 있습니까?
Sajuuk

2
@Sajuuk 나는 그것이 "sarcasm"이라고 믿습니다.
Félix Gagnon-Grenier

3

작은 따옴표 문자열을 주로 사용하는 코드를 작성할 때 유용 할 수있는 분명한 장소가 있습니다. 다음에 대한 논란의 여지가 있습니다.

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) 동작이 발생할 수 있습니다.

오늘날 거의 모든 (잘 작성된) 프로그램은 줄 바꿈 코드에 대해 UNIX 표준 LF (\ n), 메일 보낸 사람 데몬 (RFC가 CRLF 를 헤더 및 메시지 본문의 줄 바꿈으로 설정 )을 허용합니다.


2

여러 줄을 출력하는 경우 error_log ()를 사용하십시오.

개발자가 문자열을 분해 할 때 유닉스 엔딩을 가정했기 때문에 Windows 설치에서 많은 디버그 문이 이상하게 보입니다.


2

필자는 작성해야하는 일부 명령 줄 스크립트에서 PHP_EOL 상수를 사용합니다. 로컬 Windows 컴퓨터에서 개발 한 다음 Linux 서버 상자에서 테스트합니다. 상수를 사용한다는 것은 각기 다른 플랫폼마다 올바른 줄 끝을 사용하는 것에 대해 걱정할 필요가 없다는 것을 의미했습니다.


2

사용자가 OS를 사용할 수있는 작업 후 로깅 스크립트가 새로운 텍스트 줄을 텍스트 파일에 쓰는 사이트가 있습니다.

이 경우 PHP_EOL을 사용하는 것이 최적이 아닌 것 같습니다. 사용자가 Mac OS에 있고 텍스트 파일에 쓰면 \ n이됩니다. Windows 컴퓨터에서 텍스트 파일을 열면 줄 바꿈이 표시되지 않습니다. 이런 이유로 나는 어떤 OS에서 파일을 열 때 작동하는 "\ r \ n"을 대신 사용합니다.


1

작은 따옴표 문자열을 주로 사용하는 코드를 작성 중입니다.

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

0

WebCalendar를 사용하고 있는데 xcal.php에 "\ r \ n"으로 줄 끝이 하드 코드되어 있기 때문에 생성 된 ics 파일을 가져올 때 Mac iCal barfs가 발견되었습니다. 나는 들어가서 모든 발생을 PHP_EOL로 교체했으며 이제 iCal이 행복합니다! 또한 Vista에서 파일을 테스트했으며 줄 끝 문자가 "\ n"인 경우에도 Outlook에서 파일을 가져올 수있었습니다.


<late> 즉, Windows 서버에 응용 프로그램을 배포하면 응용 프로그램이 제대로 작동하지 않습니다. 원하는 경우 \n명시 적으로 사용하십시오.
duskwuff-비활성-1

0

jumi (PHP 용 jumla 플러그인)가 어떤 이유로 코드를 컴파일하면 코드에서 모든 백 슬래시가 제거됩니다. 이와 같은 $csv_output .= "\n";것이$csv_output .= "n";

매우 성가신 버그!

대신 결과를 얻으려면 PHP_EOL을 대신 사용하십시오.


2
정말 이것이 아직 발견하지 못한 구성 문제이기를 바랍니다. 나는 joomla를 사용하지 않았지만 그것이 실제로 어떻게 작동하는지는 얼마나 끔찍한 행동입니까!
jon_darkstar

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) echo 'My Text'. PHP_EOL; // 이것은 단지 \ n을 출력하고 대부분의 Windows 메모장 버전은 이것을 한 줄로 표시하고 대부분의 Windows 계정 소프트웨어는 이러한 유형의 줄 끝 문자를 가져올 수 없기 때문에 좋지 않습니다.

B) echo 'My Text \ r \ n'; 작은 따옴표로 묶은 PHP 문자열이 \ r \ n을 해석하지 않기 때문에 // 나쁜

C) echo "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에서든 어느 누구라도 열 수 있으므로 문제가 될 수 있습니다
Owaiz Yusufi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.