Khi nào tôi sử dụng hằng PHP PHP PHP_EOL '?


360

Khi nào nó là một ý tưởng tốt để sử dụng PHP_EOL?

Đôi khi tôi thấy điều này trong các mẫu mã của PHP. Điều này có xử lý các vấn đề về endline của DOS / Mac / Unix không?


1
Tôi nghĩ rằng có rất nhiều lời khuyên sai lệch trong các câu trả lời được nêu lên trên trang này. Nếu bạn chạy một tập lệnh trên hai nền tảng khác nhau, sau đó so sánh dữ liệu đầu ra hoặc dữ liệu được tạo ra (tệp nhật ký, trang html, bản ghi cơ sở dữ liệu, v.v.), thì PHP_EOL sẽ dẫn đến sự không khớp trong diff. Trong hầu hết các trường hợp, đây không phải là điều bạn muốn.
donquixote

Câu trả lời:


357

Có, PHP_EOLdường như được sử dụng để tìm ký tự dòng mới theo cách tương thích đa nền tảng, do đó, nó xử lý các vấn đề về DOS / Unix.

Lưu ý rằng PHP_EOL đại diện cho ký tự endline cho hệ thống hiện tại . Chẳng hạn, nó sẽ không tìm thấy một dòng cuối Windows khi được thực thi trên một hệ thống giống như unix.


9
Có nên sử dụng nó làm ký tự dòng cuối khi viết tập lệnh dòng lệnh không?
Thomas Owens

5
@Andre: Còn những người viết ứng dụng sẽ được cài đặt, sử dụng và triển khai bởi những người khác thì sao? Bạn có đang đề xuất những điều này nên giới hạn tất cả "nền tảng được hỗ trợ" của họ thành * nix không?
Hình trụ

1
@Stann - Những "dự án lớn" mà bạn biết là gì hầu như không phải là yếu tố quyết định trong thực tiễn tốt nhất, chứ đừng nói đến những gì là hoặc không hữu ích. Tôi duy trì một "dự án lớn" được triển khai một phần trên một số máy chủ, bao gồm một số máy chủ windows. Đừng cho rằng - các hằng số không làm tổn thương bất cứ điều gì và là một cách hoàn toàn hợp lệ để viết mã trung lập nền tảng. Nhận xét của bạn ngược lại có phần vô lý.
Chris Baker

5
Không, tôi không nghĩ câu trả lời của bạn là đúng. Bạn tạo mã trên một hệ thống nhưng gửi đầu ra sang hệ thống khác. Tuy nhiên, PHP_EOL cho bạn biết CHỈ phân cách kết thúc dòng CHỈ cho hệ thống được sử dụng. Nó không đảm bảo với bạn rằng hệ thống khác sử dụng cùng một dấu phân cách. Xem câu trả lời của tôi dưới đây.
StanE

1
nhưng không sử dụng PHP_EOLcho dữ liệu được đăng từ mẫu.
Nabi KAZ

88

Từ main/php.hphiên bản PHP 7.1.1 và phiên bản 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

Như bạn thấy PHP_EOLcó thể là "\r\n"(trên các máy chủ Windows) hoặc "\n"(trên bất cứ thứ gì khác). Trên các phiên bản PHP trước 5.4.0RC8, có một giá trị thứ ba có thể có cho PHP_EOL: "\r"(trên các máy chủ MacOSX). Nó đã sai và đã được sửa vào ngày 2012 / 03-01 với lỗi 61193 .

Như những người khác đã nói với bạn, bạn có thể sử dụng PHP_EOLtrong bất kỳ loại đầu ra nào (trong đó bất kỳ giá trị nào trong số này là hợp lệ - như: HTML, XML, nhật ký ...) trong đó bạn muốn các dòng mới thống nhất . Hãy nhớ rằng đó là máy chủ xác định giá trị chứ không phải máy khách. Khách truy cập Windows của bạn sẽ nhận được giá trị từ máy chủ Unix của bạn đôi khi gây bất tiện cho họ.

Tôi chỉ muốn hiển thị các giá trị sở hữu được PHP_EOLhỗ trợ bởi các nguồn PHP vì nó chưa được hiển thị ở đây ...


3
Ồ Các nhà phát triển PHP chỉ sai về điều này. Như liên kết Wikipedia mà bạn đề cập, Mac OS 9 và trước đó đã sử dụng "\ r", nhưng không sử dụng OS X, sử dụng "\ n". Ai đó nên nộp báo cáo lỗi ...
imgx64

27
@ imgx64 Vâng có thể, nhưng thật lòng bạn đã bao giờ thấy một máy chủ MAC sản xuất chưa?
AlexV

3
@ imgx64 Nó đã được sửa 33 ngày sau bài đăng của bạn :) Tôi đã cập nhật câu trả lời của mình để phản ánh các nguồn hiện tại.
AlexV

2
Tôi không nghĩ rằng đối số sử dụng PHP_EOL cho đầu ra (!) Là hợp lệ. PHP_EOL là phía máy chủ trong khi đầu ra thường dành cho máy khách (sử dụng các dấu phân cách kết thúc dòng khác nhau). Ví dụ: Nếu bạn tạo đầu ra văn bản đơn giản nhiều dòng trên hệ thống linux bằng PHP_EOL và gửi nó đến hệ thống Windows, thì đó sẽ không phải là dấu phân cách kết thúc dòng hợp lệ - nó sẽ phụ thuộc vào phần mềm máy khách nào sẽ hiển thị đầu ra. Trình duyệt và một số trình soạn thảo văn bản có thể xử lý nó, nhưng nếu bạn xem văn bản chẳng hạn trong Notepad, mọi thứ sẽ nằm trong một dòng.
StanE

php -r "echo addcslashes(PHP_EOL, PHP_EOL), PHP_EOL;"tim ra.
Bob Stein

82

Bạn sử dụng PHP_EOLkhi bạn muốn một dòng mới và bạn muốn trở thành nền tảng chéo.

Điều này có thể là khi bạn đang ghi tập tin vào hệ thống tập tin (nhật ký, xuất, khác).

Bạn có thể sử dụng nó nếu bạn muốn HTML được tạo của mình có thể đọc được. Vì vậy, bạn có thể làm theo của bạn <br />với a PHP_EOL.

Bạn sẽ sử dụng nó nếu bạn đang chạy php dưới dạng tập lệnh từ cron và bạn cần xuất ra một cái gì đó và để nó được định dạng cho màn hình.

Bạn có thể sử dụng nó nếu bạn đang xây dựng một email để gửi một số định dạng cần thiết.


25
Bạn không cần sử dụng các dòng mới độc lập với nền tảng khi tạo HTML.
Cướp

6
@Rob, Nếu các phiên bản IE cũ hơn cho tôi trình xem nguồn trang tốt hơn thì windows notepad tôi có thể đã đồng ý với bạn.
Zoredache

14
@Zoredache - HTML sẽ được tạo với các dòng mới phù hợp với nền tảng mà PHP đang chạy, không nhất thiết phải phù hợp với nền tảng mà bạn đang truy cập các trang từ đó.
Dominic Rodger

2
+1 để đề cập đến việc xây dựng email $header = "From: $from" . PHP_EOL; $header .= "Reply-To: $from" . PHP_EOL; $header .= "Return-Path: $from" . PHP_EOL;
Jakob Cosoroaba

49
PHP_EOLkhông nên được sử dụng để phân tách các tiêu đề email. Theo hướng dẫn sử dụng PHP Mail , nhiều tiêu đề bổ sung phải được phân tách bằng CRLF (\ r \ n).
Halil zgür

19

PHP_EOL (chuỗi) Biểu tượng 'End Of Line' chính xác cho nền tảng này. Có sẵn kể từ PHP 4.3.10 và PHP 5.0.2

Bạn có thể sử dụng hằng số này khi bạn đọc hoặc ghi tệp văn bản trên hệ thống tệp của máy chủ.

Kết thúc dòng không quan trọng trong hầu hết các trường hợp vì hầu hết các phần mềm có khả năng xử lý các tệp văn bản bất kể nguồn gốc của chúng. Bạn nên phù hợp với mã của bạn.

Nếu kết thúc dòng quan trọng, chỉ định rõ ràng kết thúc dòng thay vì sử dụng hằng. Ví dụ:

  • Các tiêu đề HTTP phải được phân tách bằng\r\n
  • Các tệp CSV nên sử dụng \r\nlàm dấu tách hàng

5
nguồn cho "tiêu đề HTTP phải là ...": ietf.org/rfc/rfc2616.txt chương 4 phần 1
Adrian Föder

2
Các dòng tin nhắn SMTP phải được chấm dứt bởi\r\n
Bob Stein

12

Tôi muốn đưa ra một câu trả lời có nội dung "Khi nào không sử dụng nó" vì nó chưa được bảo hiểm và có thể tưởng tượng nó được sử dụng một cách mù quáng và không ai nhận thấy có vấn đề gì cho đến tận cuối dòng. Một số điều này mâu thuẫn với một số câu trả lời hiện có phần nào.

Nếu xuất ra đến một trang web dưới dạng HTML, đặc biệt là văn bản trong <textarea>, <pre>hoặc <code>bạn có thể luôn luôn muốn sử dụng \nvà không PHP_EOL.

Lý do cho điều này là vì mã có thể hoạt động tốt trên một sever - đó là một nền tảng giống Unix - nếu được triển khai trên máy chủ Windows (như nền tảng Windows Azure) thì nó có thể thay đổi cách hiển thị các trang trong một số trình duyệt (cụ thể là Internet Explorer - một số phiên bản sẽ thấy cả \ n và \ r).

Tôi không chắc liệu đây có còn là vấn đề kể từ IE6 hay không, vì vậy nó có thể khá khó khăn nhưng có vẻ đáng nói nếu nó giúp mọi người nhanh chóng nghĩ về bối cảnh. Có thể có các trường hợp khác (chẳng hạn như XHTML nghiêm ngặt) khi việc xuất hoàn toàn \rtrên một số nền tảng có thể gây ra sự cố với đầu ra và tôi chắc chắn có những trường hợp khác như thế.

Như đã được lưu ý bởi ai đó, bạn sẽ không muốn sử dụng nó khi trả về các tiêu đề HTTP - vì họ phải luôn theo dõi RFC trên bất kỳ nền tảng nào.

Tôi sẽ không sử dụng nó cho một cái gì đó như dấu phân cách trên các tệp CSV (như ai đó đã đề xuất). Nền tảng mà sever đang chạy không nên xác định các kết thúc dòng trong các tệp được tạo hoặc tiêu thụ.


10

Tôi thấy PHP_EOL rất hữu ích để xử lý tệp, đặc biệt nếu bạn đang viết nhiều dòng nội dung vào một tệp.

Ví dụ: bạn có một chuỗi dài mà bạn muốn chia thành nhiều dòng trong khi viết vào tệp đơn giản. Sử dụng \ r \ n có thể không hoạt động nên chỉ cần đưa PHP_EOL vào tập lệnh của bạn và kết quả thật tuyệt vời.

Kiểm tra ví dụ đơn giản dưới đây:

<?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 sẽ không bao giờ hoạt động vì chuỗi có nghĩa là \ r \ n </ pedantry>
frak

10

Không, PHP_EOL không xử lý các sự cố nội tuyến, bởi vì hệ thống mà bạn sử dụng hằng số đó không giống với hệ thống mà bạn gửi đầu ra.

Tôi không khuyên bạn nên sử dụng PHP_EOL cả. Unix / Linux sử dụng \ n, MacOS / OS X cũng thay đổi từ \ r thành \ n và trên Windows, nhiều ứng dụng (đặc biệt là trình duyệt) cũng có thể hiển thị chính xác. Trên Windows, bạn cũng dễ dàng thay đổi mã phía máy khách hiện tại để chỉ sử dụng \ n và vẫn duy trì khả năng tương thích ngược: Chỉ cần thay đổi dấu phân cách để cắt xén dòng từ \ r \ n thành \ n và bọc nó trong một chức năng như trim () .


3
Sẽ rất tốt để biết lý do tại sao câu trả lời của tôi bị hạ cấp ... Crazy ... Câu trả lời được chấp nhận là sai , trong khi câu trả lời của tôi là chính xác. Nói chung là không đúng khi nói rằng PHP_EOL xử lý vấn đề này. Nó có thể (và nên) được sử dụng nếu đọc hoặc viết R SOL RÀNG một cái gì đó đến / từ cùng một hệ thống. Nhưng hầu hết thời gian PHP được sử dụng để gửi lại một cái gì đó cho khách hàng (đó rất có thể là những gì người hỏi đã nghĩ về). Xin nhắc lại: PHP_EOL là hằng số phía máy chủ thuần túy. Nó KHÔNG (và không thể) xử lý ngắt dòng phía máy khách một cách chính xác. Hãy viết bình luận và cho tôi biết, nếu bạn nghĩ rằng tôi đã viết sai.
StanE

3
+1 để tạo điểm tốt so với hạt. Tôi nghĩ rằng nó bị mất bởi vì các trình duyệt không hiển thị khoảng trắng trong html, vì vậy việc sử dụng phổ biến sẽ là cho các ứng dụng bảng điều khiển. Và như bạn đã nói, trong trường hợp đó, dòng kết thúc sẽ được hiểu cho môi trường thực thi, điều này có ý nghĩa đối với các ứng dụng bảng điều khiển, nhưng không phải là ứng dụng web của máy khách-máy chủ.
Jeff Puckett

Vâng, câu trả lời không thực sự liên quan. Bạn đề cập đến khả năng tương thích trình duyệt và gửi tệp đến các hệ thống khác. Dòng mới có liên quan trong đầu ra văn bản, vì vậy trình duyệt không liên quan. Và trái với quan điểm chính của bạn, các tệp văn bản này thường được sử dụng trên cùng một nền tảng mà chúng được viết trên đó.
Grantwparks

6

Định nghĩa của PHP_EOL là nó cung cấp cho bạn ký tự dòng mới của hệ điều hành bạn đang làm việc.

Trong thực tế, bạn gần như không bao giờ cần điều này. Hãy xem xét một vài trường hợp:

  • Khi bạn xuất ra web, thực sự không có bất kỳ quy ước nào ngoại trừ việc bạn nên nhất quán. Vì hầu hết các máy chủ đều là Unixy, nên bạn sẽ muốn sử dụng "\ n".

  • Nếu bạn xuất ra một tệp, PHP_EOL có vẻ như là một ý tưởng tốt. Tuy nhiên, bạn có thể có được hiệu ứng tương tự bằng cách có một dòng mới theo nghĩa đen trong tệp của mình và điều này sẽ giúp bạn biết nếu bạn đang cố chạy một số tệp được định dạng CRLF trên Unix mà không ghi đè các dòng mới hiện có (như một anh chàng có hệ thống khởi động kép , Tôi có thể nói rằng tôi thích hành vi sau)

PHP_EOL dài đến mức nực cười đến nỗi nó thực sự không đáng để sử dụng nó.


33
-1 cho "PHP_EOL quá dài một cách lố bịch". Đó không phải là một đối số hợp lệ.
viam0Zah

1
Tôi hoàn toàn đồng ý với bạn. Không có ý nghĩa gì trong việc triển khai php trên bất cứ thứ gì ngoại trừ * nix. Do đó - không có điểm nào trong việc sử dụng PHP_EOL hoặc DIRECTORY_SEPARATOR.
Stann

@Stann Bạn có thể giải thích quan điểm của mình về "Không có ý nghĩa gì trong việc triển khai php trên bất cứ thứ gì ngoài * nix"?
Sajuuk

2
@Sajuuk Tôi tin rằng sẽ được gọi là "châm biếm".
Félix Gagnon-Grenier

3

Có một nơi rõ ràng có thể hữu ích: khi bạn đang viết mã chủ yếu sử dụng các chuỗi trích dẫn. Nó được tranh luận là liệu:

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

Nghệ thuật của nó là phải nhất quán. Vấn đề với sự pha trộn và kết hợp '' và "" là khi bạn nhận được chuỗi dài, bạn không thực sự muốn đi săn tìm loại trích dẫn nào bạn đã sử dụng.

Như với tất cả mọi thứ trong cuộc sống, nó phụ thuộc vào bối cảnh.


3

"Dòng mới" của DOS / Windows là CRLF (= \ r \ n) chứ không phải LFCR (\ n \ r). Nếu chúng ta đặt cái sau, nó có khả năng tạo ra một số hành vi bất ngờ (tốt, trên thực tế, loại dự kiến ​​!: D).

Ngày nay, hầu hết tất cả các chương trình (được viết tốt) đều chấp nhận tiêu chuẩn UNIX (\ n) cho mã dòng mới, thậm chí cả trình nền của người gửi thư (RFC đặt CRLF làm dòng mới cho tiêu đề và nội dung thư).


2

Tiện dụng với error_log () nếu bạn xuất ra nhiều dòng.

Tôi đã tìm thấy rất nhiều câu lệnh gỡ lỗi trông lạ khi cài đặt windows của tôi vì các nhà phát triển đã giả sử các kết thúc unix khi chia chuỗi.


2

Tôi sử dụng hằng số PHP_EOL trong một số tập lệnh dòng lệnh tôi phải viết. Tôi phát triển trên máy Windows cục bộ của mình và sau đó thử nghiệm trên hộp máy chủ Linux. Sử dụng hằng số có nghĩa là tôi không phải lo lắng về việc sử dụng đúng dòng kết thúc cho mỗi nền tảng khác nhau.


2

Tôi có một trang web nơi tập lệnh ghi nhật ký ghi một dòng văn bản mới vào tệp văn bản sau một hành động từ người dùng, người có thể đang sử dụng bất kỳ HĐH nào.

Sử dụng PHP_EOL dường như không phải là tối ưu trong trường hợp này. Nếu người dùng ở trên Mac OS và ghi vào tệp văn bản, nó sẽ đặt \ n. Khi mở tệp văn bản trên máy tính windows, nó không hiển thị ngắt dòng. Vì lý do này, tôi sử dụng "\ r \ n" thay vì hoạt động khi mở tệp trên bất kỳ HĐH nào.


1

Bạn đang viết mã chủ yếu sử dụng các chuỗi trích dẫn.

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

0

Tôi đang sử dụng WebCalWiki và thấy rằng Mac iCal barfs khi nhập tệp ics được tạo bởi vì dòng cuối được mã hóa cứng trong xcal.php là "\ r \ n". Tôi đã đi vào và thay thế tất cả các lần xuất hiện với PHP_EOL và bây giờ iCal rất vui! Tôi cũng đã thử nghiệm nó trên Vista và Outlook cũng có thể nhập tệp, mặc dù cuối dòng ký tự là "\ n".


<late> Điều đó có nghĩa là ứng dụng của bạn sẽ gặp trục trặc khi được triển khai trên máy chủ Windows. Nếu bạn muốn \n, sử dụng rõ ràng.
duskwuff -inactive- 16/11/17

0

Khi jumi (plugin j Joomla cho PHP) biên dịch mã của bạn vì một số lý do, nó sẽ xóa tất cả các dấu gạch chéo ngược khỏi mã của bạn. Như vậy một cái gì đó như $csv_output .= "\n";trở thành$csv_output .= "n";

Lỗi rất khó chịu!

Sử dụng PHP_EOL thay vào đó để có được kết quả mà bạn đạt được sau đó.


2
Tôi thực sự hy vọng đây là vấn đề cấu hình mà bạn chưa tìm thấy. Tôi chưa sử dụng Joomla, nhưng thật là một hành vi tồi tệ nếu đó thực sự là cách nó hoạt động!
jon_darkstar

0

Trên một số hệ thống có thể hữu ích để sử dụng hằng số này bởi vì, ví dụ, nếu bạn đang gửi email, bạn có thể sử dụng PHP_EOL để có một tập lệnh hệ thống chéo hoạt động trên nhiều hệ thống hơn ... nhưng ngay cả khi đôi khi nó hữu ích, bạn có thể tìm thấy liên tục không xác định, lưu trữ hiện đại với công cụ php mới nhất không gặp phải vấn đề này nhưng tôi nghĩ rằng một điều tốt là viết một mã bit để cứu tình huống này:

<?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");
    }
  }
?>

Vì vậy, bạn có thể sử dụng PHP_EOL mà không gặp vấn đề gì ... rõ ràng rằng PHP_EOL nên được sử dụng trên tập lệnh nên hoạt động trên nhiều hệ thống cùng một lúc nếu không bạn có thể sử dụng \ n hoặc \ r hoặc \ r \ n ...

Lưu ý: PHP_EOL có thể

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

Mong câu trả lời này có ích.


0

Tôi vừa gặp vấn đề này khi xuất ra máy khách Windows. Chắc chắn, PHP_EOL dành cho phía máy chủ, nhưng hầu hết đầu ra nội dung từ php là dành cho máy khách windows. Vì vậy, tôi phải đặt những phát hiện của tôi ở đây cho người tiếp theo.

A) tiếng vang 'Văn bản của tôi'. PHP_EOL; // Xấu vì điều này chỉ xuất ra \ n và hầu hết các phiên bản windows notepad hiển thị điều này trên một dòng và hầu hết các phần mềm kế toán windows không thể nhập loại ký tự cuối dòng này.

B) echo 'Văn bản của tôi \ r \ n'; // Xấu vì các chuỗi php trích dẫn đơn không diễn giải \ r \ n

C) lặp lại "Văn bản của tôi \ r \ n"; // Yay nó hoạt động! Nhìn chính xác trong notepad và hoạt động khi nhập tệp vào các phần mềm windows khác như phần mềm kế toán windows và phần mềm sản xuất windows.


-2

Tôi thích sử dụng \ n \ r. Ngoài ra tôi đang ở trên một hệ thống cửa sổ và \ n hoạt động tốt theo kinh nghiệm của tôi.

Vì PHP_EOL không hoạt động với các biểu thức thông thường và đây là cách xử lý văn bản hữu ích nhất, nên tôi thực sự không bao giờ sử dụng nó hoặc cần thiết.


12
Coi chừng với thứ tự char dòng mới, nó phải là \ r \ n (CR + LF): en.wikipedia.org/wiki/Newline
azkotoki

Bạn không sử dụng nó nhưng trang web của bạn có thể được mở bởi bất kỳ ai trên bất kỳ máy tính nào vì vậy nó có thể là một vấn đề
Owaiz Yusufi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.