Kapan saya menggunakan konstanta PHP "PHP_EOL"?

360

Kapan ide yang bagus untuk digunakan PHP_EOL?

Terkadang saya melihat ini dalam contoh kode PHP. Apakah ini menangani masalah endline DOS / Mac / Unix?

Christian Oudard
sumber
1
Saya pikir ada banyak saran yang menyesatkan dalam jawaban yang dipilih pada halaman ini. Jika Anda menjalankan skrip pada dua platform yang berbeda, kemudian membandingkan output atau data yang dihasilkan (file log, halaman html, catatan database dll), maka PHP_EOL akan menghasilkan ketidakcocokan dalam diff. Dalam kebanyakan kasus, ini bukan yang Anda inginkan.
donquixote

Jawaban:

357

Ya, PHP_EOLseolah-olah digunakan untuk menemukan karakter baris baru dengan cara yang kompatibel lintas platform, sehingga menangani masalah DOS / Unix.

Perhatikan bahwa PHP_EOL mewakili karakter endline untuk sistem saat ini. Sebagai contoh, itu tidak akan menemukan endline Windows ketika dijalankan pada sistem seperti unix.

Adam Bellaire
sumber
9
Haruskah ini digunakan sebagai karakter garis akhir saat menulis skrip baris perintah?
Thomas Owens
5
@Andre: Bagaimana dengan siapa pun yang menulis aplikasi untuk diinstal, digunakan, dan digunakan oleh orang lain? Apakah Anda menyarankan ini semua harus membatasi "platform yang didukung" untuk * nix?
Silindris
1
@Stann - Apa "proyek besar" yang Anda ketahui lakukan hampir tidak menjadi faktor penentu praktik terbaik, apalagi apa yang bermanfaat atau tidak. Saya mempertahankan "proyek besar" yang digunakan sebagian di beberapa host, termasuk beberapa server windows. Jangan berasumsi - konstanta tidak melukai apa pun, dan merupakan cara yang benar-benar valid untuk menulis kode platform-netral. Komentar Anda sebaliknya agak tidak masuk akal.
Chris Baker
5
Tidak, saya pikir jawaban Anda tidak benar. Anda menghasilkan kode pada satu sistem tetapi mengirim output ke sistem lain. PHP_EOL, bagaimanapun, memberitahu Anda pembatas akhir baris HANYA untuk sistem di mana ia digunakan. Itu tidak menjamin Anda bahwa sistem lain menggunakan pembatas yang sama. Lihat jawaban saya di bawah ini.
StanE
1
tetapi jangan gunakan PHP_EOLuntuk data yang diposting dari formulir.
Nabi KAZ
88

Dari main/php.hPHP versi 7.1.1 dan versi 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

Seperti yang Anda lihat PHP_EOLbisa "\r\n"(pada server Windows) atau "\n"(pada apa pun). Pada versi PHP sebelum 5.4.0RC8, ada nilai ketiga yang mungkin untuk PHP_EOL: "\r"(pada server MacOSX). Itu salah dan telah diperbaiki pada 2012-03-01 dengan bug 61193 .

Seperti orang lain sudah bilang, Anda dapat menggunakan PHP_EOLdalam setiap jenis keluaran (di mana setiap nilai-nilai ini berlaku - seperti: HTML, XML, log ...) di mana Anda ingin bersatu baris . Perlu diingat bahwa serverlah yang menentukan nilai, bukan klien. Pengunjung Windows Anda akan mendapatkan nilai dari server Unix Anda yang kadang tidak nyaman bagi mereka.

Saya hanya ingin menunjukkan nilai-nilai yang mungkin PHP_EOLdidukung oleh sumber PHP karena belum ditampilkan di sini ...

AlexV
sumber
3
Wow. Pengembang PHP salah tentang hal ini. Seperti tautan Wikipedia yang Anda sebutkan, Mac OS 9 dan sebelumnya menggunakan "\ r", tetapi bukan OS X, yang menggunakan "\ n". Seseorang harus melaporkan laporan bug ...
imgx64
27
@ imgx64 Ya mungkin, tapi jujur ​​apakah Anda pernah melihat server MAC produksi?
AlexV
3
@ imgx64 Sudah diperbaiki 33 hari setelah posting Anda :) Saya telah memperbarui jawaban saya untuk mencerminkan sumber saat ini.
AlexV
2
Saya tidak berpikir bahwa argumen untuk menggunakan PHP_EOL untuk output (!) Valid. PHP_EOL adalah sisi-server sementara output biasanya untuk klien (yang menggunakan pembatas akhir baris yang berbeda). Contoh: Jika Anda membuat output teks biasa multi-line pada sistem linux dengan PHP_EOL dan mengirimkannya ke sistem Windows, itu tidak akan menjadi pembatas akhir baris yang valid - itu akan tergantung pada perangkat lunak klien apa yang akan menampilkan output. Browser dan beberapa editor teks mungkin menanganinya, tetapi jika Anda melihat teks misalnya di Notepad, semuanya akan berada dalam satu baris.
StanE
php -r "echo addcslashes(PHP_EOL, PHP_EOL), PHP_EOL;"untuk mencari tahu.
Bob Stein
82

Anda menggunakan PHP_EOLketika Anda ingin baris baru, dan Anda ingin menjadi cross-platform.

Ini bisa terjadi ketika Anda menulis file ke sistem file (log, ekspor, lainnya).

Anda dapat menggunakannya jika Anda ingin HTML yang dihasilkan dapat dibaca. Jadi, Anda dapat mengikuti Anda <br />dengan PHP_EOL.

Anda akan menggunakannya jika Anda menjalankan php sebagai skrip dari cron dan Anda perlu menampilkan sesuatu dan memformatnya untuk layar.

Anda mungkin menggunakannya jika Anda membangun email untuk mengirim yang memerlukan beberapa format.

Sakit kepala
sumber
25
Anda tidak perlu menggunakan baris baru yang bebas platform saat membuat HTML.
Rob
6
@ Rob, Jika versi IE yang lebih lama memberi saya penampil sumber halaman yang lebih baik maka windows notepad saya mungkin setuju dengan Anda.
Zoredache
14
@Zoredache - HTML akan dihasilkan dengan baris baru yang sesuai untuk platform tempat PHP dijalankan, belum tentu sesuai untuk platform tempat Anda mengakses halaman.
Dominic Rodger
2
+1 untuk menyebutkan bangunan email $header = "From: $from" . PHP_EOL; $header .= "Reply-To: $from" . PHP_EOL; $header .= "Return-Path: $from" . PHP_EOL;
Jakob Cosoroaba
49
PHP_EOLtidak boleh digunakan untuk memisahkan header email. Menurut manual PHP Mail , beberapa header tambahan harus dipisahkan dengan CRLF (\ r \ n).
Halil Özgür
19

PHP_EOL (string) Simbol 'End Of Line' yang benar untuk platform ini. Tersedia sejak PHP 4.3.10 dan PHP 5.0.2

Anda dapat menggunakan konstanta ini ketika Anda membaca atau menulis file teks pada sistem file server.

Akhir baris tidak penting dalam banyak kasus karena sebagian besar perangkat lunak mampu menangani file teks terlepas dari asalnya. Anda harus konsisten dengan kode Anda.

Jika akhir baris penting, tentukan secara eksplisit akhir baris alih-alih menggunakan konstanta. Sebagai contoh:

  • Header HTTP harus dipisahkan oleh\r\n
  • File CSV harus digunakan \r\nsebagai pemisah baris
Salman A
sumber
5
sumber untuk "HTTP header harus ...": ietf.org/rfc/rfc2616.txt bab 4 bagian 1
Adrian Föder
2
Baris pesan SMTP harus diakhiri oleh\r\n
Bob Stein
12

Saya ingin memberikan jawaban yang membahas "Kapan tidak menggunakannya" karena belum dibahas dan dapat membayangkan itu digunakan secara membabi buta dan tidak ada yang memperhatikan ada masalah sampai nanti. Sebagian dari ini agak bertentangan dengan beberapa jawaban yang ada.

Jika mengeluarkan ke halaman web dalam HTML, khususnya teks dalam <textarea>, <pre>atau <code>Anda mungkin selalu ingin menggunakannya \ndan tidak PHP_EOL.

Alasan untuk ini adalah bahwa sementara kode dapat berfungsi dengan baik pada satu server - yang kebetulan merupakan platform seperti Unix - jika digunakan pada host Windows (seperti platform Windows Azure) maka itu dapat mengubah cara halaman ditampilkan di beberapa browser (khusus Internet Explorer - beberapa versi yang akan melihat \ n dan \ r).

Saya tidak yakin apakah ini masih menjadi masalah sejak IE6 atau tidak, jadi mungkin cukup diperdebatkan tetapi tampaknya layak disebutkan jika itu membantu orang-orang meminta untuk memikirkan konteksnya. Mungkin ada kasus lain (seperti XHTML ketat) di mana tiba-tiba keluaran \rpada beberapa platform dapat menyebabkan masalah dengan output, dan saya yakin ada kasus tepi lainnya seperti itu.

Seperti yang sudah dicatat oleh seseorang, Anda tidak ingin menggunakannya saat mengembalikan header HTTP - karena mereka harus selalu mengikuti RFC di platform apa pun.

Saya tidak akan menggunakannya untuk sesuatu seperti pembatas pada file CSV (seperti yang disarankan seseorang). Platform yang dijalankan memutuskan tidak seharusnya menentukan akhir baris dalam file yang dihasilkan atau dikonsumsi.

Iain Collins
sumber
10

Saya menemukan PHP_EOL sangat berguna untuk penanganan file, khususnya jika Anda menulis beberapa baris konten ke dalam file.

Misalnya, Anda memiliki string panjang yang ingin dipecah menjadi beberapa baris saat menulis ke file biasa. Menggunakan \ r \ n mungkin tidak berfungsi, cukup masukkan PHP_EOL ke skrip Anda dan hasilnya mengagumkan.

Lihatlah contoh sederhana di bawah ini:

<?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";
}
?>
ip bastola
sumber
3
\ n \ r tidak akan pernah berfungsi karena urutannya dimaksudkan sebagai \ r \ n </
pedantry
10

Tidak, PHP_EOL tidak menangani masalah endline, karena sistem tempat Anda menggunakan konstanta itu bukanlah sistem yang sama dengan tempat Anda mengirim output.

Saya tidak akan merekomendasikan menggunakan PHP_EOL sama sekali. Penggunaan Unix / Linux \ n, MacOS / OS X juga berubah dari \ r ke \ n dan pada Windows banyak aplikasi (terutama browser) dapat menampilkannya dengan benar juga. Di Windows, juga mudah mengubah kode sisi klien yang ada untuk hanya menggunakan \ n dan masih mempertahankan kompatibilitas ke belakang: Cukup ubah pembatas untuk pemangkasan garis dari \ r \ n ke \ n dan bungkus dalam fungsi seperti trim () seperti .

StanE
sumber
3
Akan menyenangkan untuk mengetahui mengapa jawaban saya dibatalkan ... Gila ... Jawaban yang diterima salah , sedangkan jawaban saya benar. Secara umum tidak benar untuk mengatakan bahwa PHP_EOL menangani masalah ini. Itu dapat (dan harus) digunakan jika membaca atau menulis SOLELY sesuatu ke / dari sistem yang sama . Tetapi sebagian besar waktu PHP digunakan untuk mengirim sesuatu kembali ke klien (yang kemungkinan besar apa yang dipikirkan si penanya). Sekali lagi: PHP_EOL adalah konstanta sisi-server murni. Ini TIDAK (dan tidak bisa) menangani garis sisi klien rusak dengan benar. Tolong tulis komentar dan beri tahu saya, jika Anda berpikir saya menulis sesuatu yang salah.
StanE
3
+1 untuk menunjukkan poin yang bagus terhadap gandum. Saya pikir itu hilang karena browser tidak membuat spasi putih dalam html, jadi penggunaan umum akan untuk aplikasi konsol. Dan seperti yang Anda katakan, jika demikian, akhir baris akan ditafsirkan untuk lingkungan pelaksana, yang masuk akal untuk aplikasi konsol, tetapi bukan aplikasi web server-klien.
Jeff Puckett
Yah, jawabannya tidak benar-benar berhubungan. Anda menyebutkan kompatibilitas browser dan mengirim file ke sistem lain. Newline relevan dalam output teks, jadi browser tidak relevan. Dan bertentangan dengan poin utama Anda, file teks ini biasanya dikonsumsi pada platform yang sama dengan yang mereka tulis.
Grantwparks
6

Definisi PHP_EOL adalah memberi Anda karakter baris baru dari sistem operasi yang sedang Anda kerjakan.

Dalam praktiknya, Anda seharusnya hampir tidak pernah membutuhkan ini. Pertimbangkan beberapa kasus:

  • Ketika Anda mengeluarkan ke web, sebenarnya tidak ada konvensi apa pun kecuali bahwa Anda harus konsisten. Karena sebagian besar server adalah Unixy, Anda tetap ingin menggunakan "\ n".

  • Jika Anda mengunggah ke file, PHP_EOL mungkin tampak seperti ide yang bagus. Namun, Anda bisa mendapatkan efek serupa dengan memiliki baris baru literal di dalam file Anda, dan ini akan membantu Anda jika Anda mencoba menjalankan beberapa file yang diformat CRLF di Unix tanpa mengganggu baris baru yang ada (sebagai seorang pria dengan sistem dual-boot , Saya dapat mengatakan bahwa saya lebih suka perilaku yang terakhir)

PHP_EOL sangat panjang sehingga benar-benar tidak layak menggunakannya.

Edward Z. Yang
sumber
33
-1 untuk "PHP_EOL sangat panjang". Itu bukan argumen yang valid.
viam0Zah
1
Saya sepenuhnya setuju dengan Anda. Sama sekali tidak masuk akal dalam menggunakan php pada apa pun kecuali * nix. Jadi - tidak ada gunanya menggunakan PHP_EOL atau DIRECTORY_SEPARATOR.
Stann
@Stann Bisakah Anda menjelaskan maksud Anda tentang "Tidak ada gunanya sama sekali dalam menyebarkan php pada apa pun kecuali * nix"?
Sajuuk
2
@ Sajuuk Saya percaya itu akan disebut "sarkasme".
Félix Gagnon-Grenier
3

Ada satu tempat yang jelas di mana itu mungkin berguna: ketika Anda menulis kode yang sebagian besar menggunakan string kutipan tunggal. Dapat diperdebatkan apakah:

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

Seni itu harus konsisten. Masalahnya dengan mencampur dan mencocokkan '' dan "" adalah ketika Anda mendapatkan string yang panjang, Anda tidak benar-benar ingin pergi mencari jenis kutipan yang Anda gunakan.

Seperti halnya semua hal dalam hidup, itu tergantung pada konteksnya.

SjH
sumber
3

"Newline" standar DOS / Windows adalah CRLF (= \ r \ n) dan bukan LFCR (\ n \ r). Jika kita menempatkan yang terakhir, kemungkinan akan menghasilkan beberapa perilaku tak terduga (yah, pada kenyataannya, jenis yang diharapkan!: D).

Saat ini hampir semua program (ditulis dengan baik) menerima LF (\ n) standar UNIX untuk kode baris baru, bahkan daemon pengirim surat (RFC menetapkan CRLF sebagai baris baru untuk header dan badan pesan).

Nica Mlg
sumber
2

Berguna dengan error_log () jika Anda menghasilkan banyak baris.

Saya telah menemukan banyak pernyataan debug terlihat aneh pada instalasi windows saya karena para pengembang telah mengasumsikan akhir unix ketika putus string.

Gavin Gilmour
sumber
2

Saya menggunakan konstanta PHP_EOL dalam beberapa skrip baris perintah yang harus saya tulis. Saya mengembangkan pada mesin Windows lokal saya dan kemudian menguji pada kotak server Linux. Menggunakan konstanta berarti saya tidak perlu khawatir tentang penggunaan garis akhir yang benar untuk masing-masing platform yang berbeda.

chrismacp
sumber
2

Saya memiliki situs tempat skrip logging menulis baris teks baru ke file teks setelah tindakan dari pengguna, yang dapat menggunakan OS apa pun.

Menggunakan PHP_EOL tampaknya tidak optimal dalam hal ini. Jika pengguna menggunakan Mac OS dan menulis ke file teks itu akan meletakkan \ n. Ketika membuka file teks di komputer windows itu tidak menunjukkan jeda baris. Untuk alasan ini saya menggunakan "\ r \ n" sebagai gantinya yang berfungsi saat membuka file pada OS apa pun.

intTiger
sumber
1

Anda menulis kode yang sebagian besar menggunakan string kutipan tunggal.

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

Saya menggunakan WebCalendar dan menemukan bahwa Mac iCal barfs pada mengimpor file ics yang dihasilkan karena end-of-line hardcoded dalam xcal.php sebagai "\ r \ n". Saya masuk dan mengganti semua kejadian dengan PHP_EOL dan sekarang iCal senang! Saya juga mengujinya di Vista dan Outlook dapat mengimpor file juga, meskipun karakter garis akhir adalah "\ n".

Lex
sumber
<B>> Itu berarti aplikasi Anda akan gagal berfungsi ketika digunakan di server Windows. Jika Anda mau \n, gunakan itu secara eksplisit.
duskwuff -inactive-
0

Ketika jumi (plugin joomla untuk PHP) mengkompilasi kode Anda karena suatu alasan ia menghapus semua garis miring terbalik dari kode Anda. Seperti itulah sesuatu $csv_output .= "\n";menjadi$csv_output .= "n";

Bug yang sangat menjengkelkan!

Gunakan PHP_EOL sebagai gantinya untuk mendapatkan hasil yang Anda cari.

Allan
sumber
2
saya akan sangat BENAR-BENAR berharap ini adalah masalah konfigurasi yang belum Anda temukan. Saya belum pernah menggunakan joomla, tetapi perilaku yang mengerikan jika itu benar-benar cara kerjanya!
jon_darkstar
0

Pada beberapa sistem mungkin berguna untuk menggunakan konstanta ini karena jika, misalnya, Anda mengirim email, Anda dapat menggunakan PHP_EOL untuk membuat skrip lintas-sistem bekerja pada lebih banyak sistem ... tetapi bahkan jika berguna kadang-kadang Anda dapat menemukan ini konstan undefined, hosting modern dengan mesin php terbaru tidak memiliki masalah ini, tetapi saya berpikir bahwa hal yang baik adalah menulis kode bit yang menyelamatkan situasi ini:

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

Jadi Anda dapat menggunakan PHP_EOL tanpa masalah ... jelas bahwa PHP_EOL harus digunakan pada skrip yang seharusnya bekerja pada lebih banyak sistem sekaligus jika tidak, Anda dapat menggunakan \ n atau \ r atau \ r \ n ...

Catatan: PHP_EOL bisa

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

Semoga jawaban ini membantu.

Alessandro
sumber
0

Saya baru saja mengalami masalah ini ketika mengeluarkan ke klien Windows. Tentu, PHP_EOL untuk sisi server, tetapi sebagian besar konten output dari php adalah untuk klien windows. Jadi saya harus meletakkan temuan saya di sini untuk orang berikutnya.

A) gema 'Teks Saya'. PHP_EOL; // Buruk karena ini hanya menghasilkan \ n dan sebagian besar versi Windows Notepad menampilkan ini pada satu baris, dan sebagian besar perangkat lunak akuntansi windows tidak dapat mengimpor jenis karakter end of line ini.

B) gema 'Teks Saya \ r \ n'; // Buruk karena string php tunggal yang dikutip tidak menafsirkan \ r \ n

C) echo "Teks Saya \ r \ n"; // Yay berhasil! Terlihat benar di notepad, dan berfungsi saat mengimpor file ke perangkat lunak windows lain seperti windows accounting dan windows manufacturing software.

hamish
sumber
-2

Saya lebih suka menggunakan \ n \ r. Saya juga menggunakan sistem windows dan \ n bekerja dengan baik dalam pengalaman saya.

Karena PHP_EOL tidak berfungsi dengan ekspresi reguler, dan ini adalah cara yang paling berguna untuk berurusan dengan teks, maka saya benar-benar tidak pernah menggunakannya atau perlu melakukannya.


sumber
12
Berhati-hatilah dengan perintah char baris baru, itu seharusnya \ r \ n (CR + LF): en.wikipedia.org/wiki/Newline
azkotoki
Anda tidak menggunakannya tetapi situs Anda dapat dibuka oleh siapa pun di komputer apa pun sehingga ini dapat menjadi masalah
Owaiz Yusufi