PHP sabiti “PHP_EOL” ne zaman kullanılır?


360

Ne zaman kullanmak iyi bir fikirdir PHP_EOL?

Bazen PHP kod örneklerinde bu görüyorum. Bu DOS / Mac / Unix bitiş sorunları ile ilgileniyor mu?


1
Sanırım bu sayfadaki güncel cevaplarda bir çok yanıltıcı tavsiye var. Bir komut dosyasını iki farklı platformda çalıştırırsanız, çıktıyı veya oluşturulan verileri (günlük dosyaları, html sayfası, veritabanı kayıtları vb.) Karşılaştırırsanız, PHP_EOL farkta uyumsuzluğa neden olur. Çoğu durumda bu istediğiniz şey değildir.
donquixote

Yanıtlar:


357

Evet, PHP_EOLgörünüşte yeni satır karakterini platformlar arası uyumlu bir şekilde bulmak için kullanılır, bu nedenle DOS / Unix sorunlarını işler.

PHP_EOL'un geçerli sistem için bitiş çizgisi karakterini temsil ettiğini unutmayın . Örneğin, unix benzeri bir sistemde yürütüldüğünde bir Windows bitiş çizgisi bulamaz.


9
Komut satırı komut dosyası yazarken bitiş çizgisi karakteri olarak kullanılmalı mıdır?
Thomas Owens

5
@Andre: Başkaları tarafından yüklenecek, kullanılacak ve dağıtılacak uygulamaları yazan herkese ne dersiniz? Bunların "desteklenen platformlarını" * nix ile sınırlaması gerektiğini mi düşünüyorsunuz?
Silindirik

1
@Stann - Bildiğiniz "büyük projeler" in ne işe yarayıp yaramadığı, en iyi uygulamada belirleyici faktör değildir. Kısmen bazı windows sunucuları da dahil olmak üzere birçok ana bilgisayarda dağıtılan bir "büyük proje" sürdürmek. Varsaymayın - sabitler hiçbir şeye zarar vermez ve platformdan bağımsız kod yazmanın mükemmel bir yoludur. Aksine yorumlarınız biraz saçma.
Chris Baker

5
Hayır, cevabının doğru olduğunu sanmıyorum. Bir sistemde kod üretiyorsunuz, ancak çıkışı başka bir sisteme gönderiyorsunuz. Bununla birlikte PHP_EOL, SADECE kullanıldığı sistem için satır sonu sınırlayıcısını size bildirir. Diğer sistemin aynı sınırlayıcıyı kullandığını garanti etmez. Cevabımı aşağıda görebilirsiniz.
StanE

1
ancak PHP_EOLformdan gönderilen veriler için kullanmayın .
Nabi KAZ

88

Gönderen main/php.hPHP sürümü 7.1.1 ve sürüm 5.6.30 arasında:

#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

Gördüğünüz PHP_EOLgibi "\r\n"(Windows sunucularında) veya "\n"(başka herhangi bir şeyde) olabilir. 5.4.0RC8'den önceki PHP sürümlerinde şunlar için üçüncü bir değer vardı PHP_EOL: "\r"(MacOSX sunucularında). Hatalıydı ve 2012-03-01 tarihinde hata 61193 ile düzeltildi .

Diğerlerinin size söylediği gibi, birleştirilmiş yeni satırlar istediğiniz PHP_EOLher türlü çıktıda ( bu değerlerden herhangi birinin geçerli olduğu - HTML, XML, günlükler ...) kullanabilirsiniz . İstemciyi değil, değeri belirlediği sunucu olduğunu unutmayın. Windows ziyaretçileriniz bu değeri bazen onlar için rahatsız edici olan Unix sunucunuzdan alır.

Ben sadece PHP_EOLhenüz burada gösterilmedi çünkü PHP kaynakları tarafından desteklenen olası değerleri göstermek istedim ...


3
Vay. PHP geliştiricileri bu konuda yanlış. Wikipedia bağlantısı olarak, Mac OS 9 ve daha önce "\ r" kullanılır, ancak "\ n" kullanan OS X kullanılmaz. Birisi bir hata raporu
dosyalamalıdır

27
@ imgx64 Evet, ama dürüst olmak gerekirse hiç bir üretim MAC sunucusu gördünüz mü?
AlexV

3
@ imgx64 Mesajınızdan 33 gün sonra düzeltildi :) Güncel kaynakları yansıtacak şekilde cevabımı güncelledim.
AlexV

2
Ben çıktı (!) İçin PHP_EOL kullanmak argüman geçerli olduğunu sanmıyorum. PHP_EOL, sunucu çıkışında normalde istemci için kullanılır (farklı satır sonu sınırlayıcıları kullanır). Örnek: PHP_EOL içeren bir linux sisteminde çok satırlı düz metin çıktısı oluşturur ve bunu bir Windows sistemine gönderirseniz, geçerli bir satır sonu sınırlayıcısı olmayacaktır - çıktıyı hangi istemci yazılımının göstereceğine bağlı olacaktır. Tarayıcılar ve bazı metin editörleri bu sorunu çözebilir, ancak metni örneğin Not Defteri'nde görüntülerseniz, her şey tek bir satırda olur.
StanE

php -r "echo addcslashes(PHP_EOL, PHP_EOL), PHP_EOL;"öğrenmek için.
Bob Stein

82

Sen kullanmak PHP_EOLEğer yeni bir satır istediğinizde ve çapraz platform olmak istiyorum.

Bu, dosya sistemine (günlükler, dışa aktarma, diğer) dosya yazarken olabilir.

Oluşturulan HTML'nizin okunabilir olmasını istiyorsanız bunu kullanabilirsiniz. Yani <br />bir ile takip edebilirsiniz PHP_EOL.

Eğer php cron bir komut dosyası olarak çalıştırıyorsanız ve bir şey çıktı ve bir ekran için biçimlendirilmiş olması gerekiyorsa kullanabilirsiniz.

Bazı biçimlendirme gerektiren bir e-posta oluşturuyorsanız bunu kullanabilirsiniz.


25
HTML oluştururken platformdan bağımsız yeni satırlar kullanmanıza gerek yoktur.
Rob

6
@Rob, IE'nin eski sürümleri bana daha iyi bir sayfa kaynağı görüntüleyicisi verdiyse, windows not defteri sizinle anlaşmış olabilirim.
Zoredache

14
@Zoredache - HTML, PHP'nin üzerinde çalıştığı platforma uygun yeni satırlarla üretilecek, sayfalara eriştiğiniz platform için uygun olmayabilir.
Dominic Rodger

2
E-posta oluşturma bahsettiğiniz için +1 $header = "From: $from" . PHP_EOL; $header .= "Reply-To: $from" . PHP_EOL; $header .= "Return-Path: $from" . PHP_EOL;
Jakob Cosoroaba

49
PHP_EOLe-posta başlıklarını ayırmak için kullanılmamalıdır. Göre PHP Posta kılavuzu, birden fazla ek başlık kullanılmamakta, bir CRLF (\ r \ n) ile ayrılmalıdır.
Halil Özgür

19

PHP_EOL (dize) Bu platform için doğru 'Satır Sonu' sembolü. PHP 4.3.10 ve PHP 5.0.2'den beri kullanılabilir

Sunucunun dosya sisteminde metin dosyaları okurken veya yazarken bu sabiti kullanabilirsiniz.

Satır sonları çoğu durumda önemli değildir çünkü çoğu yazılım, kökenlerine bakılmaksızın metin dosyalarını işleyebilir. Kodunuzla tutarlı olmalısınız.

Satır sonları önemliyse, sabiti kullanmak yerine satır sonlarını açıkça belirtin. Örneğin:

  • HTTP üst gerekir ile ayrılabilir\r\n
  • CSV dosyaları gerektiğini kullanmak \r\nsatır ayırıcı olarak

5
HTTP başlıkları ... olmalıdır: " ietf.org/rfc/rfc2616.txt bölüm 4 bölüm 1
Adrian Föder

2
SMTP mesajı hatları gerekir tarafından sona erdirilebilir\r\n
Bob Stein

12

Bir cevap atmak istediğinizi "adresleri değil henüz kaplı edilmemiştir olarak kullanmak için" ve körlemesine kullanılıyor ve fark kimse sonradan satır aşağı kadar bir sorun olduğunu tahmin edebilirsiniz. Bunlardan bazıları mevcut cevapların bir kısmıyla çelişmektedir.

HTML bir web sayfasına çıkışının ise özellikle metne <textarea>, <pre>ya <code>muhtemelen her zaman kullanmak istediğiniz \ndeğil PHP_EOL.

Bunun nedeni, kodun bir Unix benzeri bir platform olan bir sunucuda iyi performans göstermesine rağmen, bir Windows ana bilgisayarında (Windows Azure platformu gibi) dağıtılmışsa, sayfaların bazı tarayıcılarda nasıl görüntüleneceğini değiştirebilmesidir. (özellikle Internet Explorer - bazı sürümleri hem \ n hem de \ r görür).

Bu IE6 beri hala bir sorun olup olmadığından emin değilim, bu yüzden oldukça tartışmalı olabilir ama insanların bağlam hakkında düşünmek istemi yardımcı olup olmadığını belirtmeye değer görünüyor. \rBazı platformlarda aniden çıktıların çıktıda sorunlara neden olabileceği başka durumlar da olabilir (katı XHTML gibi) ve eminim bunun gibi başka uç durumlar da vardır.

Zaten birisi tarafından belirtildiği gibi, HTTP üstbilgilerini döndürürken kullanmak istemezsiniz, çünkü her zaman RFC'yi herhangi bir platformda takip etmeleri gerekir.

CSV dosyalarında (biri önerdiği gibi) sınırlayıcılar gibi bir şey için kullanmazdım. Sunucu'nun üzerinde çalıştığı platform, oluşturulan veya tüketilen dosyalardaki satır sonlarını belirlememelidir.


10

Özellikle bir dosyaya birden fazla içerik satırı yazıyorsanız, PHP_EOL dosya işleme için çok yararlı buldum.

Örneğin, düz bir dosyaya yazarken birden çok satıra bölmek istediğiniz uzun bir dizeniz var. \ R \ n kullanmak işe yaramayabilir, böylelikle PHP_EOL'u betiğinize koyun ve sonuç harika.

Aşağıdaki bu basit örneği inceleyin:

<?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 dizinin \ r \ n </pedantry> olması gerektiği için asla çalışmayacak
frak

10

Hayır, PHP_EOL bitiş çizgisi sorunlarını işlemez, çünkü bu sabiti kullandığınız sistem çıktıyı gönderdiğiniz sistemle aynı değildir.

Ben hiç PHP_EOL kullanmanızı tavsiye etmem. Unix / Linux kullanımı \ n, MacOS / OS X de \ r'den \ n'ye değiştirildi ve Windows'ta birçok uygulama (özellikle tarayıcılar) da doğru şekilde görüntüleyebilir. Windows'ta, yalnızca \ n kullanmak ve hala geriye dönük uyumluluğu korumak için mevcut istemci tarafı kodunu değiştirmek de kolaydır: Satır kırpma için ayırıcıyı \ r \ n yerine \ n olarak değiştirin ve bir trim () benzeri işleve sarın .


3
Cevabımın neden reddedildiğini bilmek güzel olurdu ... Çılgın ... Kabul edilen cevap yanlış , benimki doğru. PHP_EOL'in bu sorunu ele aldığını söylemek genellikle doğru değildir. Aynı sisteme / sistemden BÜYÜK bir şey okuyor veya yazıyorsa kullanılabilir (ve kullanılmalıdır) . Ancak çoğu zaman PHP istemciye bir şey göndermek için kullanılır (büyük olasılıkla sorgulayıcının düşündüğü şey budur). Yine: PHP_EOL saf bir sunucu tarafı sabitidir. İstemci tarafı satır sonlarını doğru DEĞİL (ve yapamaz). Lütfen bir yorum yaz ve bana yanlış bir şey yazdığımı düşünüyorsan söyle.
StanE

3
Tahtaya karşı iyi bir puan kazandırmak için +1. Tarayıcılar html'de boşluk oluşturmadığından kaybolduğunu düşünüyorum, bu nedenle ortak kullanım konsol uygulamaları için olacaktır. Ve dediğin gibi, bu durumda satır sonu, konsol uygulamaları için anlamlı, ancak istemci-sunucu web uygulamaları için değil, yürütme ortamı için yorumlanır.
Jeff Puckett

Cevap gerçekten bir ilgisi yok. Tarayıcı uyumluluğundan ve diğer sistemlere dosya göndermekten bahsediyorsunuz. Newline metin çıktısında önemlidir, bu nedenle tarayıcılar alakalı değildir. Ve ana noktaya aksine, bu metin dosyaları olan genelde onlar yazılı konum aynı platformda tükettiler.
grantwparks

6

PHP_EOL'un tanımı, üzerinde çalıştığınız işletim sisteminin yeni satır karakterini vermesidir.

Pratikte, buna neredeyse hiç ihtiyacınız olmamalıdır. Birkaç durumu düşünün:

  • Web'e çıkış yaptığınızda, tutarlı olmanız dışında hiçbir kural yoktur. Çoğu sunucu Unixy olduğundan, yine de "\ n" kullanmak istersiniz.

  • Bir dosyaya çıktı alıyorsanız, PHP_EOL iyi bir fikir gibi görünebilir. Bununla birlikte, dosyanızın içinde gerçek bir satırsonu bulundurarak benzer bir etki elde edebilirsiniz ve bu, mevcut satırları (çift önyükleme sistemine sahip bir adam olarak) Unix'te Unix üzerinde bazı CRLF biçimli dosyaları çalıştırmaya çalışıyorsanız size yardımcı olacaktır. , İkinci davranışı tercih ettiğimi söyleyebilirim)

PHP_EOL o kadar saçma ki gerçekten kullanmaya değmez.


33
-1 "PHP_EOL çok gülünç uzun" için. Bu geçerli bir argüman değil.
viam0Zah

1
Sana tamamen katılıyorum. * Nix dışında herhangi bir şeye php dağıtmanın hiçbir anlamı yoktur. Böylece - PHP_EOL veya DIRECTORY_SEPARATOR kullanmanın bir anlamı yoktur.
Stann

@Stann "php'yi * nix dışında herhangi bir şeye dağıtmanın hiçbir anlamı yok mu?"
Sajuuk

2
@Sajuuk Buna "alaycılık" deneceğine inanıyorum.
Félix Gagnon-Grenier

3

Yararlı olabileceği açık bir yer vardır: ağırlıklı olarak tek tırnak teli kullanan kod yazarken. Bu:

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

Sanatı tutarlı olmaktır. Karıştırma ve eşleştirme '' ve "" ile ilgili sorun, uzun dizeler aldığınızda, ne tür bir teklif kullandığınız için avlanmak zorunda kalmamanızdır.

Hayattaki her şeyde olduğu gibi, bağlama bağlıdır.


3

DOS / Windows standart "satırsonu" CRLF (= \ r \ n), LFCR (\ n \ r) değil. İkincisini koyarsak, beklenmedik (aslında, bir tür beklenen!: D) davranışlar üretmesi muhtemeldir.

Günümüzde neredeyse tüm (iyi yazılmış) programlar, posta gönderici artalan süreçleri (hatta RFC, CRLF'yi üstbilgiler ve ileti gövdesi için yeni satır olarak ayarlar) UNIX standart LF'sini (\ n) kabul eder .


2

Birden fazla satır çıkarıyorsanız, error_log () ile kullanışlı.

Geliştiriciler dizeleri parçalarken unix sonları aldıklarından beri hata ayıklama ifadelerinin Windows kurulumumda garip göründüğünü gördüm.


2

Ben yazmak zorunda bazı komut satırı komut dosyalarında PHP_EOL sabit kullanın. Yerel Windows makinemde geliştiriyorum ve sonra bir Linux sunucu kutusunda test ediyorum. Sabiti kullanmak, farklı platformların her biri için doğru satır sonunu kullanma konusunda endişelenmem gerekmiyordu.


2

Herhangi bir işletim sistemi kullanıyor olabilir kullanıcı bir eylem sonra bir günlük dosyası yeni bir metin satırı bir metin dosyasına yazdığı bir sitem var.

PHP_EOL kullanımı bu durumda optimal görünmüyor. Kullanıcı Mac OS'de ise ve metin dosyasına yazarsa \ n koyacaktır. Metin dosyasını bir Windows bilgisayarında açarken satır sonu göstermiyor. Bu nedenle dosyayı "herhangi bir işletim sisteminde açarken çalışan" \ r \ n "kullanıyorum.


1

Çoğunlukla tek tırnak dizeleri kullanan bir kod yazıyorsunuz.

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

0

WebCalendar kullanıyorum ve satır sonu xcal.php içinde "\ r \ n" olarak sabit kodlanmış olduğundan Mac iCal oluşturulan ics dosyasını alma konusunda barfs bulundu. İçeri girdim ve tüm tekrarları PHP_EOL ile değiştirdim ve şimdi iCal mutlu! Ayrıca Vista'da test ettim ve satır sonu karakteri "\ n" olmasına rağmen Outlook da dosyayı içe aktarabildi.


<late> Bu, uygulamanızın bir Windows sunucusuna dağıtıldığında arızalanacağı anlamına gelir. İsterseniz \n, bunu açıkça kullanın.
duskwuff -inaktif-

0

Jumi (PHP için joomla eklentisi) bir nedenle kodunuzu derlediğinde kodunuzdaki tüm ters eğik çizgileri kaldırır. Öyle bir şey $csv_output .= "\n";olur ki$csv_output .= "n";

Çok can sıkıcı bir hata!

Sonradan sonuç almak için PHP_EOL kullanın.


2
gerçekten GERÇEKTEN bu henüz bulamadığınız bir yapılandırma sorunu olduğunu umuyoruz. i kullanılmış joomla sığınak, ama bu gerçekten nasıl çalışırsa ne korkunç bir davranış!
jon_darkstar

0

Bazı sistemlerde bu sabiti kullanmak yararlı olabilir, çünkü örneğin bir e-posta gönderiyorsanız, daha fazla sistemde çalışan bir sistemler arası komut dosyasına sahip olmak için PHP_EOL kullanabilirsiniz ... ancak bazen yararlı olabilir sürekli tanımsız, modern son php motoru ile hosting bu sorun yok ama iyi bir şey bu durumu kurtaran bir bit kodu yazmak olduğunu düşünüyorum:

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

Yani PHP_EOL sorunsuz kullanabilirsiniz ... açıkça PHP_EOL aynı anda daha fazla sistem üzerinde çalışması gereken komut dosyası üzerinde kullanılması gerektiğini aksi takdirde \ n veya \ r veya \ r \ n kullanabilirsiniz ...

Not: PHP_EOL olabilir

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

Umarım bu cevap yardımcı olur.


0

Bir Windows istemcisine çıktı verirken bu sorunu yaşadım. Elbette, PHP_EOL sunucu tarafı içindir, ancak php'den çoğu içerik çıktısı Windows istemcileri içindir. Bu yüzden bulgularımı bir sonraki kişi için buraya yerleştirmeliyim.

A) 'Metnim' yankısı. PHP_EOL; // Kötü çünkü bu çıktı \ n ve windows not defteri sürümlerinin çoğu bunu tek bir satırda gösterir ve çoğu windows muhasebe yazılımı bu tür satır sonu karakteri içe aktaramaz.

B) 'Metim \ r \ n' yankısı; // Tek tırnaklı php dizeleri yorumlanmadığından kötü \ r \ n

C) "Metim \ r \ n" yankısı; // Yay çalışıyor! Not defterinde doğru görünüyor ve dosyayı windows muhasebe ve windows üretim yazılımı gibi diğer Windows yazılımlarına alırken çalışır.


-2

\ N \ r kullanmayı tercih ediyorum. Ayrıca bir windows sisteminde ve \ n benim deneyim iyi çalışıyor.

PHP_EOL normal ifadelerle çalışmadığından ve bunlar metinle baş etmenin en yararlı yolu olduğundan, gerçekten hiç kullanmadım veya buna ihtiyacım yoktu.


12
Newline char siparişine dikkat edin, \ r \ n (CR + LF) olmalıdır: en.wikipedia.org/wiki/Newline
azkotoki

Bir sorunu olabilir bu yüzden herhangi bir pc herhangi biri tarafından Kullanmak yok ama Siteniz açık olabilir
Owaiz Yusufi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.