Bir dosyadan php okuma satırları. Php dosyası oluşturma, okuma ve yazma. Bir dosyanın olup olmadığını kontrol etme

  • 20.06.2020

PHP'de, genellikle bir dosya oluşturma ile uğraşmak zorunda kalırsınız ... her şey çok basittir, diskte dosya yoktur, kod çalıştırılır ve dosya belirir, sonra bu dosyayı başka bir değişkende veya hatta herhangi bir sayfada okuyabilirsiniz. İnternet ve sonra oraya bir şeyler yazın ... ama bunun için özel işlevleri bilmeniz gerekiyor ... bu makalede bunun hakkında daha fazla bilgi ...

Yürütülebilir komut dosyasında bir php dosyası oluşturmak için birkaç işlev belirtmeniz yeterlidir:

Hemen bir örnek düşünelim:

$ text = "Dosyaya yazılacak bir metin buraya";
$ fp = fopen ("dosya.txt", "w");
fwrite ($ fps, $ metin);
fclose ($ fps);
?>

Burada bilmelisin:

fopen ()- işlev dosyayı okumak veya yazmak ve iyileştirmeler için açar;

Bu iyileştirmeler (fopen işlevinin mod parametresi) çok önemlidir:

  • "r"- php'de dosyayı aç sadece okumak için... İmleç başlangıca yerleştirilir.
  • "+"- php'de dosyayı aç okumak ve yazmak için... İmleç başlangıca yerleştirilir. !!! - bu iki mod r ve r + ile dosyaların önceden oluşturulmuş olması gerekir (aksi takdirde bir hata çıkacaktır) Uyarı: fopen (file.txt): akış açılamadı: Böyle bir dosya veya dizin yok ...) ve sadece okuduk veya ekleme fırsatımız oldu.
  • "w"- dosya SADECE yazmak için açılır. Dosya sıfır uzunlukta kesilir - yani üzerine yazılır. Gereken yazılır ve İmleç başa yerleştirilir.
  • "w +"- dosya yazmak VE OKUMAK için açılır! Gerisi" w " modundaki ile aynıdır. !!! - bu iki mod ile - dosya oluşturulmadıysa - OLUŞTURMAYA ÇALIŞIN!
  • "a"- dosyayı YALNIZCA yazmak için açın. "w"nin aksine, bu parametre dosyanın içeriğinin üzerine yazmaz, imleci satırın sonuna getirir ve eklemek istediğimiz içeriği sonuna ekler.
  • "bir +"- yazmak ve okumak için bir dosya açın.

fwrite($ fp, $ text) - php'de bir dosyaya yazma işlevi - yani, $ text değişkeninde ne varsa, $ fp değişkeninde olan dosyaya yazılır;

fclose($ fp) - yazdığımız dosyayı $ fp değişkenine kapatma fonksiyonu;

Artık php'de güvenli bir şekilde dosyalar oluşturabilir, bunları okumak ve düzenlemek için açabilirsiniz.

Açık bir dosyayla çalışmak için faydalı PHP eklentileri ve işlevleri:

while (! feof ($ fp)) (
$ mytext = fgets ($ fp, 99);
yankı $ metnim."
";
}

burada koşul yerine getirilir - "dosyanın sonuna ulaşılana kadar, o zaman bunu yapın" while (! feof ($ fps))

1. İşlev fget'lar($ fp, 99) - tüm içeriği 99 baytlık bölümlere ayırmanıza izin verir ve dahası, bunu daha net görmek için bir etiket koyduk

Bu dize işlevi fget'lar(kaynak tanıtıcı [, int uzunluk]) varsayılan olarak 1024 bayt (1 kilobayt) uzunluğundadır, belirtilmemişse olacaktır. Bu parametre PHP 4.2.0'dan beri isteğe bağlıdır (hata halinde YANLIŞ döndürür)

Dosya açmak, yazmak ve oluşturmak için ek işlevler

işlev - int okuma dosyası(dize dosya adı [, bool use_include_path [, kaynak bağlamı]]) - dosyayı bir bütün olarak okuyun.

Dosyayı okur ve içeriğini çıktı arabelleğine yazar. Ve yazdırılan bayt sayısını döndürür. Bir hata durumunda, köpek kullanılmazsa - @readfile döner.

Bunun gibi bir şey ortaya çıkacak:

Bir kelimenin sonunda, etiket
.

B. işlev - dizi dosya(dize dosya adı [, int use_include_path [, kaynak bağlamı]]), readfile işleviyle aynı şeyi yapar, bir istisna dışında dosyanın içeriğini diziye ekler:

Böylece İnternet'teki herhangi bir sayfayı okuyabilirsiniz: $ satır = dosya ("http: // site /"); ve foreach işlevi aracılığıyla diziyi yineleyin;

3 A. dize işlevi file_get_contents(string filename [, bool use_include_path [, resource context [, int offset [, int maxlen]]]]) - içeriği tek bir satır olarak almanızı sağlar.

Bu, bir dosyayı okumak için daha çok yönlü bir PHP işlevidir, dosya işlevine benzer, bir diziye değil, yalnızca içerik bir dizgeye döndürülür ve koşullar ayarlanabilir - hangi baytla başlanacağı - telafi etmek ve hangisiyle bitecek - maxlen... Başarısızlık durumunda YANLIŞ döndürür.

Önemli!!!- bu durumda, işlev 3'ün yerini aynı anda alır: fopen (), fread () ve fclose () ve böylece damgalardan kurtulur.

3b. int işlevi file_put_contents(dize dosya adı, karma veri [, int bayrakları [, kaynak bağlamı]]) - fopen (), fwrite () ve fclose () işlevlerinin sıralı çağrısıyla aynıdır - yazılan bayt sayısını döndürür.

Bu konuyu incelerken, bazı PHP işlevlerinin bir dosyaya erişmek için dosya tanıtıcısını, diğerlerinin ise dosya yolunu kullandığını unutmayın.

Bir dosyadan okuma

fread() işlevi, bir dosyadan belirli bir miktarda veri almak için kullanılabilir.

fread (dosya, uzunluk)

Seçenekler:

dosya - dosya tanımlayıcı

uzunluk - bayt cinsinden verilerin boyutu

İşlev belirtilen veri boyutunu okumadan önce dosyanın sonuna ulaşılırsa, daha küçük bir dize döndürür. Bu işlev, ikili dosyaları okumak için kullanışlıdır.

Dizenin uzunluğunu belirlerken ve işaretçiyi hareket ettirirken, Rus harflerinin bir bayt değil, daha fazla olduğunu dikkate almanız gerekir. Daha fazla bilgi için, bkz. Dizelerle Çalışma. Ayrıca UTF-8 kodlu dosyanın başında birkaç bayt olduğunu unutmayın. BOM içermeyen UTF-8 kodlamasında bu baytlar eksiktir.

myfile.txt dosyasından ilk 10 baytı okuyalım. "r +" modunda açalım. İşaretçi başlangıçta olacaktır.

$ dosya = fopen ("dosyam.txt", "r +"); $ al = fread ($ dosya, 10); yankı $ al;

Dosya Rusça harfler içeriyorsa, son harf doğru görüntülenmeyebilir. Bunun nedeni karakterin birden fazla bayt boyutunda olması ve bir bölümünün okunup diğerinin okunmamış olmasıdır.

fgets() işlevi, işaretçiden satırın sonuna kadar bir satır döndürür.

fgets (dosya, uzunluk)

Seçenekler:

dosya - dosya tanımlayıcı

uzunluk - dizenin boyutunu bayt olarak belirtmenize olanak tanır. Ayrıca, satırın sonuna ulaşılırsa, satır belirtilen uzunluktan küçük olsa bile sonraki satır işlevin sonucuna dahil edilmez. İsteğe bağlı parametre.

Uzunluk belirtilmemişse, PHP'nin eski sürümlerinde döndürülen dizenin maksimum uzunluğu sınırlıydı. Daha yeni sürümlerde bu sınırlama yoktur.

İşlevi bir döngüde çalıştırmak, dosyayı satır satır okumanıza olanak tanır.

myfile.txt dosyasından bir satır okuyalım. İşaretçi zaten taşınmış olduğundan, satırın tamamı değil, işaretçiden okunacaktır.

$ al = fgets ($ dosya); Eko "
".$ al;

fgetss () işlevi de bir dize döndürür, ancak HTML etiketlerini ondan kaldırır. Kodda bir PHP betiği varsa, o da kaldırılacaktır.

fgetss (dosya, uzunluk, istenen etiketler)

Seçenekler:

dosya - dosya tanımlayıcı

uzunluk - dizenin bayt cinsinden boyutu. İsteğe bağlı parametre.

gerekli etiketler - silinmeyecek etiketleri belirlemenizi sağlar.

Bir dosyadan bir karakter döndüren bir fgetc() işlevi vardır.

file() işlevi tüm dosyayı okur ve verileri bir diziye koyar. Her satır, dizinin bir elemanına yerleştirilir. Bu özelliğin çalışması için bir dosya açmanıza gerek yoktur. İşaretçinin konumu yoksayılır.

dosya (dosya yolu, bayraklar, bağlam)

Seçenekler:

dosya yolu - mutlak veya göreli dosya yolu

bayraklar - işlevin nasıl çalıştığını belirleyen bayraklar. İsteğe bağlı parametre.

bağlam - bir bağlam kaynağı belirtmenize olanak tanır

Aşağıdaki bayrakları belirtebilirsiniz:

FILE_USE_INCLUDE_PATH - dahil edilen yol klasörlerinde bir dosya aramanıza izin verir.

FILE_IGNORE_NEW_LINES - satır sonu karakterini kaldırır. Bu bayrak ayarlanmazsa, her satırda bir satır sonu karakteri olacaktır.

FILE_SKIP_EMPTY_LINES - diziye boş satır eklemez.

Birden çok bayrak belirtilirse, bunlar "|" operatörüyle ayrılır.

Sayfada myfile.txt dosyasını görüntüleyelim.

$ ar = dosya ("dosyam.txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); Eko "
"; print_r ($ ar);

dosyaya yaz

fwrite () işlevi, verileri bir dosyaya yazar.

fwrite (dosya, veri, uzunluk)

Seçenekler:

dosya - dosya tanımlayıcı

data - yazılmakta olan veri

uzunluk - bayt cinsinden yazılacak verilerin maksimum boyutu. Satırın tamamı değil, yalnızca belirtilen bayt sayısı yazılabilir. İsteğe bağlı parametre.

İşaretçi dosyanın başında veya ortasındaysa, işlev dosyadaki karakterleri yenileriyle değiştirir. Yani 5 karakter yazılırsa dosyadan 5 karakter çıkarılır ve yerlerine yenileri eklenir.

Rusça harfler yazdığınızda, komut dosyası kodlaması dosya kodlamasıyla eşleşmelidir.

Dosyaya "script from script" satırını yazalım. Örneğimizde, tanımlayıcı dosyanın ortasındadır ve satır oraya yazılacaktır. Dosyanın sonuna veri eklemeniz gerektiğinde "a" modunda açabilirsiniz. Ve bir dosyanın üzerine yazmanız gerektiğinde "w" modunda açılır. İşaretçiyi hareket ettirmeyeceğiz, verileri olduğu yere yazacağız.

$ metin = "komut dosyasından metin"; fwrite ($ dosya, $ metin);
16.5K

Aslında, bir php dosyasını açmaktan daha büyük bir sorun değil. Ormanın ortasındayken bir şişe bira açmak daha zor olabilir. Ancak yalnızca hevesli programcılar böyle düşünür. Ve yeni başlayanlar için, size dosyalarla çalışmak için php'nin tüm olanaklarından bahsedeceğiz:

php dosyaları

Php uzantılı dosyalar aynı adı taşıyan programlama dilinde yazılmış kodlar içerir. Diğer dillerden farklı olarak php, sunucu taraflı bir programlama dilidir. Yani sunucu tarafında yürütülür. Bu nedenle, kodunda hata ayıklamak için istemci makineye yerel bir sunucu kurulmalıdır.

Php dosyalarıyla çalışmak için özel uygulamalar kullanılır - yazılım editörleri. En yaygın olanları:

  • Dreamweaver.
  • PHPDüzenle.
  • Eclipse PHP Geliştirme.
Php tabanlı siteler oluştururken program kodunu yeniden kullanmanız gerekebilir. Bu gibi durumlarda başka bir dosyada bulunan hazır çözümlerin dahil edilmesi uygundur. Bunun için include yapısı kullanılır. Sözdizimi:

dosya adını dahil et

Bağlantı örneği:

Dahil edilen dosya:


Require yapısını kullanarak bir dosya eklemek de mümkündür. Dahil etmekten farklı olarak, program kodu yürütülmeden önce bile dosyayı içerir. Koddaki require yardımı ile bu dosyaya yalnızca bir çağrı yapılabilir. Tekrar ararsanız, sistem genel bir hata mesajı verir ve programın yürütülmesini durdurur.

include yapısı, kaynağı yalnızca programın yürütülmesi sırasında içerir. PHP dosyasının birden çok okunmasını destekler. Bir hata oluşursa, yalnızca bir uyarı mesajı görüntülenecek ve kod yürütme bir sonraki satırdan devam edecektir.

Dosyaları açma ve kapatma

Php'de dosyalarla yapılan tüm işlemler birkaç aşamada gerçekleştirilir:

  • Dosya açma;
  • İçeriği düzenleme;
  • Dosyayı kapatıyorum.

Dosyayı açmak için fopen() işlevi kullanılır. Sözdizimi:

int fopen (dize dosya adı, dize modu [, int use_include_path])

Kabul edilen argümanlar:

  • string filename - dosya adı veya mutlak yolu. Dosyanın yolu belirtilmemişse, geçerli dizinde aranacaktır. Aradığınız dosya eksikse, sistem bir hata mesajı görüntüler. Örnek:

  • string mode - dosyayı açma modunu gösterir. Argüman tarafından kabul edilen değerler:
  • r - dosya sadece okumaya açıktır, dosya işaretçisi başlangıçta ayarlanır;
  • r + - dosya okuma ve yazma için açıktır;
  • w - yeni bir salt okunur dosya oluşturulur. Aynı ada sahip bir dosya zaten varsa, içindeki tüm veriler otomatik olarak silinir;
  • w + - yazma ve okuma için yeni bir dosya oluşturur. Böyle bir dosya varsa, verilerinin üzerine tamamen yenileri yazılır;
  • a - dosya yazmaya açıktır. İşaretçi sonunda konumlandırılır. Yani php dosyasına yazmak baştan değil, sondan başlayacak;
  • a + - bir dosyayı okuma ve yazma modunda açar. Kayıt sondan başlayacak;
  • b - ikili veri içeren bir dosyayla çalışma modu (ikili hesap sisteminde). Bu mod yalnızca Windows işletim sisteminde kullanılabilir.

Bir dosyaya erişimi kapatmak için fclose() işlevini kullanın. Sözdizimi:

int fclose (int dosyası), burada int dosyası kapatılacak site tanımlayıcısıdır.

Her okuma veya yazma işleminden sonra dosya bu fonksiyonla kapatılmalıdır. Aksi takdirde, dosya için oluşturulan akış açık kalır. Bu da sunucu kapasitelerinin gereksiz tüketimine yol açar.

Örnek:

Dosyaları okuma ve yazma

readfile () işlevi, bir dosyanın tüm içeriğini basitçe görüntülemek için idealdir. Sözdizimi:

readfile (dize dosya adı), burada dize dosya adı, dize dosya adıdır (tanımlayıcı değil).


Aynı dosya fpassthru () işlevi kullanılarak da okunabilir. İşaretçinin son konumundan dosyanın sonuna kadar olan verileri okur. Sözdizimi:

int fpassthru (int dosyası)

İşlev, bir dosyanın açılmasını ve kapatılmasını gerektirir. Örnek:

Sonuç öncekine benzer.

Php'deki dosyalarla çalışma işlevleri, içeriği satır satır ve karakter karakter okumanıza izin verir:

  • string fgets (int dosyası, int uzunluğu)- işlev, uzunluk uzunluğunda bir dize okur. Örnek:

  • string fread (int dosyası, int uzunluğu)- eylem öncekiyle aynıdır.

Bir dosyaya metin verisi yazmak için iki özdeş işlev vardır:

  • int fputs (int dosyası, dize dizesi [, int uzunluk])
  • int fwrite (int dosyası, dize dizesi [, int uzunluk])

İşlevler, int dosyasına belirtilen uzunlukta bir dize dizesi dizesi yazar int uzunluğu ( isteğe bağlı argüman). Örnek:

Dosya oluşturma ve silme

Bir php dosyası oluşturmak için "w" veya "w +" erişim modunda fopen () işlevini kullanabilirsiniz. Veya dokunma () işlevi. Dosya değiştirme zamanını ayarlar. Gerekli ada sahip eleman yoksa, oluşturulacaktır. Onun sözdizimi.

Dosyayla çalışmayı denemeden önce, dosyanın var olduğundan emin olmanız önerilir. Bu görevi gerçekleştirmek için yaygın olarak iki işlev kullanılır:

file_exists() ve is_file().

f ilе_exists () işlevi, belirtilen dosyanın var olup olmadığını kontrol eder. Dosya varsa, işlev DOĞRU, aksi halde YANLIŞ döndürür. file_exists() işlevinin sözdizimi şöyledir:

bool file_exists (dize dosyası)

Bir dosyanın varlığını kontrol etmeye bir örnek:

if (! file_exists ($ dosya adı)):

print "Dosya $ dosya adı mevcut değil!";

is_file()

is_file() işlevi, belirtilen dosyanın varlığını ve üzerinde okuma/yazma işlemleri gerçekleştirme yeteneğini kontrol eder. Özünde, is_file (), yalnızca bir dosyanın var olup olmadığını değil, aynı zamanda veri okuyup yazamadığını da kontrol eden file_exists () öğesinin daha sağlam bir sürümüdür:

bool is_file (dize dosyası)

Aşağıdaki örnek, bir dosyanın var olduğunun ve üzerinde çalıştırılabileceğinin nasıl doğrulanacağını gösterir:

$ dosya = "bir dosya.txt";

if (is_file ($ dosyası)):

print "$ dosyası geçerli ve var!";

print "$ dosyası mevcut değil veya geçerli bir dosya değil!";

Gerekli dosyanın var olduğundan ve onunla çeşitli okuma / yazma işlemleri yapabileceğinizden emin olduktan sonra, bir sonraki adıma - dosyayı açmaya geçebilirsiniz.

Filesize () işlevi, belirtilen ada sahip dosyanın boyutunu (bayt olarak) veya hata durumunda FALSE değerini döndürür. Dosya boyutu () işlevinin sözdizimi şöyledir:

int dosya boyutu (dize dosya adı)

Diyelim ki pastry.txt dosyasının boyutunu belirlemek istiyorsunuz. İstediğiniz bilgiyi almak için dosya boyutu () işlevini kullanabilirsiniz:

$ fs = dosya boyutu ("pastry.txt"); print "Pastry.txt $ fs bayttır.";

Aşağıdaki çıktı görüntülenir:

Pastry.txt 179 bayttır.

Bir dosya üzerinde işlem yapabilmeniz için önce onu açmanız ve bir dosya tanıtıcısı ile ilişkilendirmeniz ve dosyayla çalışmayı bitirdikten sonra kapatmanız gerekir. Bu konular bir sonraki bölümde tartışılmaktadır.

Dosyaları açma ve kapatma

Bir dosya üzerinde G/Ç işlemlerini gerçekleştirmeden önce fopen() fonksiyonu ile açmalısınız.

fopen () işlevi bir dosyayı (varsa) açar ve bir tamsayı döndürür - sözde dosya manipülatörü(dosya tutacağı). fopen() işlevinin sözdizimi şöyledir:

int fopen (dize dosyası, dize modu [, int etkinleştirme_yolu])

Açılmakta olan dosya yerel dosya sisteminde bulunabilir, standart giriş/çıkış akışı olarak bulunabilir veya HTTP veya FTP tarafından alındığı şekliyle uzak bir sistemdeki dosyayı temsil edebilir.

Dosya parametresi, aşağıda listelenen çeşitli biçimlerde belirtilebilir:

Parametre yerel bir dosyanın adını içeriyorsa, fopen () bu dosyayı açar ve bir tanıtıcı döndürür.

Parametre php: // stdin, php: // stdout veya php: // stderr olarak belirtilirse, ilgili standart giriş/çıkış akışı açılır.

Parametre http:// önekiyle başlıyorsa, işlev sunucuya bir HTTP bağlantısı açar ve belirtilen dosya için bir tanıtıcı döndürür.

Parametre ftp: // öneki ile başlıyorsa, işlev sunucuya bir FTP bağlantısı açar ve belirtilen dosya için bir tanıtıcı döndürür. Bu durumda iki şeye özellikle dikkat etmelisiniz: Eğer sunucu pasif FTP'yi desteklemiyorsa fopen() çağrısı başarısız olacaktır. Ayrıca, FTP dosyaları okuma veya yazma için açılır.

Pasif modda çalışırken, YR sunucusu istemci tarafından bir bağlantı bekler. Aktif modda çalışırken, sunucunun kendisi istemci ile bağlantı kurar. Varsayılan, genellikle etkin moddur.

mode parametresi, dosyaya okuma ve yazma yeteneğini belirler. Tablo 7.1, bir dosya açma modunu belirleyen bazı değerleri listeler.

Tablo 7.1. Dosya açma modları

mod Açıklama
Sadece okumak. Geçerli konum işaretçisi dosyanın başlangıcına ayarlanır
+ Okuma ve yazma. Geçerli konum işaretçisi dosyanın başlangıcına ayarlanır
w Sadece yaz. Geçerli konum işaretçisi dosyanın başına ayarlanır ve dosyanın tüm içeriği yok edilir. Dosya yoksa, işlev onu oluşturmaya çalışır.
w + Okuma ve yazma. Geçerli konum işaretçisi dosyanın başına ayarlanır ve dosyanın tüm içeriği yok edilir. Dosya yoksa, işlev onu oluşturmaya çalışır.
a Sadece yaz. Geçerli konum işaretçisi dosyanın sonunda bulunur. Dosya yoksa, işlev onu oluşturmaya çalışır.
bir + Okuma ve yazma. Geçerli konum işaretçisi dosyanın sonunda bulunur. Dosya yoksa, işlev onu oluşturmaya çalışır.

İsteğe bağlı üçüncü parametre içerme_yolu 1 ise, dosya yolu php.ini dosyasında belirtilen içerme dizinine göredir (bkz. bölüm 1).

Aşağıda fopen () işleviyle bir dosya açma örneği verilmiştir. fopen () ile birlikte kullanılan Die (), dosya açılamıyorsa bir hata mesajı verir:

$ dosya = "userdata.txt"; // Bazı dosya

$ fh = fopen ($ file, "a +") veya die ("Dosya ($ dosyası) yok!");

Aşağıdaki pasaj, bir PHP sitesine (http://www.php.net) bir bağlantı açar:

$ site = "http://www.php.net": // Sunucuya HTTP üzerinden erişilebilir

$ sh = fopen ($ site., "r"); // Manipülatörü php.net dizin sayfasına bağla

Bittiğinde dosya her zaman fclose() ile kapatılmalıdır.

fclose () işlevi, belirtilen tutamaçla dosyayı kapatır. Başarılı tamamlandığında TRUE, başarısızlık durumunda FALSE döndürür. fclose() işlevinin sözdizimi şöyledir:

int fclose (int manipülatör)

fclose () işlevi, yalnızca önceden fopen () veya fsockopen () ile açılmış dosyaları başarıyla kapatır. Bir dosyayı kapatma örneği:

$ dosya = "userdata.txt";

if (file_exists ($ dosya)):

$ fh = fopen ($ dosya, "r");

// Dosya işlemlerini gerçekleştir

print "Dosya Dosyası yok!";

dosyaya yaz

Açık dosyalarla gerçekleştirilen iki ana işlem vardır - okuma ve yazma.

is_writeable () işlevi, dosyanın var olduğunu ve yazılabilir olduğunu doğrulamanıza olanak tanır. Yazılabilirlik hem dosya hem de dizin için kontrol edilir. is_writeable () işlevinin sözdizimi şöyledir:

bool is_writeable (dize dosyası)

Önemli bir nokta: PHP büyük olasılıkla web sunucusu tarafından kullanılan kullanıcı kimliği altında çalışacaktır (genellikle "hiç kimse"). is_writeable () kullanımına ilişkin bir örnek için fwrite () işlevine bakın.

fwrite () işlevi, bir dize değişkeninin içeriğini dosya tanıtıcısı tarafından belirtilen dosyaya yazar. fwrite () işlevinin sözdizimi şöyledir:

int fwrite (int manipülatör, dize değişkeni [, int uzunluk])

Fonksiyon çağrısında isteğe bağlı uzunluk parametresi geçirilirse, belirtilen karakter sayısı yazıldıktan sonra veya satır sonuna ulaşıldığında kayıt durur. Bir dosyaya yazma yeteneğinin kontrol edilmesi aşağıdaki örnekte gösterilmiştir:

// Kullanıcının sitesindeki trafik hakkında bilgi

$ veri = "08: 13:00 | 12: 37: 12 | 208.247.106.187 | Win98";

$ dosyaadı = "bir dosya.txt";

// Dosya varsa ve şuraya yazılabilirse

if (is_writeable ($ dosya adı)):

$ fh = fopen ($ dosya adı, "a +");

// $ datanın içeriğini bir dosyaya yaz

$ başarı - fwrite ($ fh, $ veri);

// Dosyayı kapat

fclose ($ fh); Başka:

print "Sfilename yazmak için açılamadı";

fputs() işlevi, fwrite() için bir takma addır ve fwrite() işlevinin kullanıldığı her yerde kullanılabilir.

fputs() işlevi, fwrite() için bir takma addır ve tam olarak aynı sözdizimine sahiptir. fputs() işlevinin sözdizimi şöyledir:

int fputs (int manipülatör, dize değişkeni [, int uzunluk])

Şahsen fputs () kullanmayı tercih ederim. Bunun sadece bir tarz meselesi olduğunu ve iki işlev arasındaki herhangi bir farkla ilgisi olmadığını unutmayın.

Bir dosyadan okuma

Dosyalar üzerinde yapılan en önemli işlem şüphesiz okumadır. Bir dosyadan okuma verimliliğini artırmak için bazı özellikler aşağıda açıklanmıştır. Bu işlevlerin sözdizimi, benzer yazma işlevlerinin sözdizimini neredeyse tam olarak kopyalar.

i s_readable() işlevi, dosyanın var olduğundan ve okunabilir olduğundan emin olur. Hem dosya hem de dizin için okunabilirlik kontrol edilir. is_readable() işlevinin sözdizimi şöyledir:

yuh! is_readable (dize dosyası]

PHP büyük olasılıkla web sunucusu tarafından kullanılan kullanıcı kimliği (genellikle "hiç kimse") altında çalışacaktır, bu nedenle is_readable() işlevinin DOĞRU döndürmesi için herkesin dosyadan okumasına izin verilmelidir. Aşağıdaki örnek, bir dosyanın var olduğundan ve okunabilir olduğundan nasıl emin olunacağını gösterir:

if (is_readable ($ dosya adı)):

// Dosyayı açın ve mevcut konum işaretçisini dosyanın sonuna ayarlayın

$ fh = fopen ($ dosya adı, "r");

print "$ dosya adı okunamıyor!";

fread() işlevi, dosya tanıtıcısı tarafından belirtilen dosyadan belirtilen sayıda baytı okur. fwrite () işlevinin sözdizimi şöyledir:

int fread (int manipülatör, int uzunluk)

Manipülatör açık, okunabilir bir dosyaya başvurmalıdır (is_readable () işlev açıklamasına bakın). Belirtilen bayt sayısı okunduğunda veya dosyanın sonuna ulaşıldığında okuma durur. Liste 7.1'de gösterilen pastry.txt metin dosyasını düşünün. Bu dosyanın bir tarayıcıda okunması ve görüntülenmesi aşağıdaki snippet ile yapılır:

$ fh = fopen ("pastry.txt", "r") or die ("Dosya açılamıyor!");

$ dosya = fread ($ fh, dosya boyutu ($ fh));

pastry.txt dosyasının bayt cinsinden boyutunu belirlemek için fllesize() işlevini kullanarak, fread() işlevinin dosyanın tüm içeriğini okumasını sağlarsınız.

Listeleme 7.1. Pastry.txt metin dosyası

Tarif: Pasta Hamuru

1 1/4 su bardağı çok amaçlı un

3/4 çubuk (6 yemek kaşığı) tuzsuz tereyağı, doğranmış

2 yemek kaşığı sebze yağı 1/4 çay kaşığı tuz

3 yemek kaşığı su

fgetc () işlevi, geçerli işaretçi konumunda dosyadan bir karakter içeren bir dize veya dosyanın sonuna ulaşıldığında FALSE döndürür. fgetc() işlevinin sözdizimi şöyledir:

string fgetc (int manipülatör)

Manipülatör açık okunabilir bir dosyaya başvurmalıdır (bu bölümün başlarındaki is_readable() işlevine bakın). Aşağıdaki örnek, fgetc () işlevini kullanarak bir dosyanın karakter karakter okunmasını ve çıktısının alınmasını gösterir:

$ fh = fopen ("pastry.txt", "r"); while (! feof ($ fh)):

$ karakter = fgetc ($ fh):

$ karakter yazdır; son zaman;

fgets() işlevi, dosya tanıtıcısı tarafından belirtilen dosyadaki işaretçinin geçerli konumundan okunan dizeyi döndürür. Dosya işaretçisi açık okunabilir bir dosyaya işaret etmelidir (bu bölümün başlarındaki is_readable() işlevine bakın). fgets() işlevinin sözdizimi şöyledir:

string fgets (int manipülatör, int uzunluk)

Aşağıdaki koşullardan biri karşılandığında okuma durur:

  • dosyadan okunan uzunluk - 1 bayt;
  • dosyadan bir satırsonu karakteri okundu (döndürülen dizeye dahil edildi);
  • dosyadan bir dosya sonu (EOF) işareti okundu.

Dosyanın satır satır okunmasını düzenlemek istiyorsanız, ikinci parametreye satırdaki bayt sayısını açıkça aşan bir değer iletin. Bir dosyanın satır satır okunmasına ve çıktısına bir örnek:

$ fh = fopen ("pastry.txt", "r");

while (! feof ($ fh));

$ satır = fgets ($ fh, 4096);

$ satırı yazdır. "
";

fgetss() işlevi, bir istisna dışında fgets() işlevine tamamen benzer - okunan metinden tüm HTML ve PHP etiketlerini kaldırmaya çalışır:

string fgetss (Int manipülatör, int uzunluk [, string allow_tags])

Örneklere geçmeden önce Liste 7.2'nin içeriğini kontrol edin - bu dosya Liste 7.3 ve 7.4'te kullanılmaktadır.

Liste 7.2. Science.html dosyası

Son Dakika Haberleri - Bilim

Uzaylı yaşam formu keşfedildi


20.2000 ağustos

Bu sabah erken saatlerde, W. J. Gilmore'un eski apartman buzdolabının dolabında büyüyen tuhaf yeni bir mantar türü bulundu. Kiracının bilgisayar monitöründen yayılan güçlü radyasyonun bu evrime yardımcı olup olmadığı bilinmiyor.

Liste 7.3. Tarayıcıda görüntülemeden önce etiketleri HTML dosyasından kaldırın

$ fh = fopen ("bilim.html", "r");

while (! feof ($ fh)):

fgetss yazdır ($ fh, 2048);

Sonuç aşağıda gösterilmiştir. Gördüğünüz gibi, bilim.html dosyasından tüm HTML etiketleri kaldırıldı, bu da biçimlendirme kaybına neden oldu:

Bazı durumlarda, bazıları hariç tüm etiketler dosyadan kaldırılır - örneğin, satır sonu etiketleri
... Liste 7.4 bunun nasıl yapıldığını gösterir.

Liste 7.4. Etiketleri HTML dosyasından seçici olarak kaldırın

$ fh = fopenC "bilim.html", "r");

$ izin verilebilir = "
";

while (! feof ($ fh)):

fgetss yazdır ($ fh. 2048, $ izin verilebilir);

Sonuç:

Son Dakika Haber - Bilim Uzaylı yaşam formu keşfedildi 20 Ağustos 2000 Bu sabah erken saatlerde, WJ Gilmore'un eski apartman buzdolabının dolabında büyüyen garip yeni bir mantar türü bulundu. Kiracının bilgisayarından güçlü radyasyon yayılıp yayılmadığı bilinmiyor. monitör bu evrimde yardımcı oldu.

Gördüğünüz gibi, fgetss () işlevi, özellikle benzer şekilde biçimlendirilmiş çok sayıda HTML dosyanız varsa, dosyaları dönüştürmeyi kolaylaştırır.

Bir diziye dosya okuma

file() işlevi, bir dosyanın tüm içeriğini indekslenebilir bir diziye yükler. Dizinin her elemanı dosyanın bir satırına karşılık gelir. file() işlevinin sözdizimi şöyledir:

dizi dosyası (dize dosyası [, int path_include])

İsteğe bağlı üçüncü parametre içerme_yolu 1 ise, dosya yolu php.ini dosyasında belirtilen içerme dizinine göredir (bkz. bölüm 1). Liste 7.5, pastry.txt dosyasını yüklemek için file() işlevini kullanır (bkz. Liste 7.1).

$ file_array = dosya ("pastry.txt");

while (liste ($ satır_sayısı. $ satır) = her biri ($ dosya_dizisi)):

Yazdır " Satır $ satır_sayısı:", htmlspecialchars ($ satırı),"
\ n "

Dizinin her satırı bir sayı ile birlikte görüntülenir:

Satır 0: Tarif: Pasta Hamuru

Hat 1: 1 1/4 su bardağı çok amaçlı un

2. satır: 3/4 çubuk (6 yemek kaşığı) tuzsuz tereyağı, doğranmış

Satır 3: 2 yemek kaşığı sebze katı yağı

4. satır: 1/4 çay kaşığı tuz

5. satır: 3 yemek kaşığı su

Bir dosyayı standart çıktıya yönlendirme

readfile () işlevi bir dosyanın içeriğini okur ve onu standart çıktıya (çoğu durumda tarayıcıya) yönlendirir. readfile() işlevinin sözdizimi şöyledir:

int okuma dosyası (dize dosyası [, int path_include])

İşlev, okunan bayt sayısını döndürür. Dosya yerel dosya sisteminde bulunabilir, standart bir G/Ç akışı olarak bulunabilir veya HTTP veya FTP tarafından alındığı şekliyle uzak bir sistemdeki bir dosyayı temsil edebilir. Dosya parametresi, fopen () işlevindekiyle aynı kurallara göre ayarlanır.

Tarayıcıda görüntülemek istediğiniz bir latorre.txt dosyanız olduğunu varsayalım:

"La Torre" restoranı. İtalya, Nettuno'da bulunan, eklektik bir stil karışımı sunuyor. tarih ve kaliteli deniz ürünleri mutfağı. Şehri çevreleyen orta çağdan kalma borgo duvarları içinde, köy butiklerinde yoldan geçenleri seyrederken yemek yiyebilirsiniz. Sadece en taze deniz ürünleri ile birleşen konfor, La Torre'yi İtalya'nın en iyi restoranlarından biri yapıyor.

Aşağıdaki snippet yürütüldüğünde, latorre.txt dosyasının tüm içeriği standart çıktı akışına gönderilir:

$ restaurant_file = "latorre.txt";

// Tüm dosyayı standart çıktıya gönder

okuma dosyası ($ restaurant_file);

Bir işlem dosyası tanıtıcısını açma

Normal dosyalarla birlikte, sunucudaki işlemlerle etkileşim kurmak için dosya manipülatörlerini açabilirsiniz. Sorun, aşağıdaki sözdizimine sahip olan poren () işleviyle çözülür:

int popen (dize komutu, dize modu)

Komut parametresi yürütülecek sistem komutunu tanımlar ve mod parametresi erişim modunu tanımlar:

// "spices.txt" dosyasını yazmak için aç

$ fh = fopen ("spices.txt", "w");

// Birden çok metin satırı ekleyin

fputs ($ fh, "Maydanoz, adaçayı, biberiye \ n");

fputs ($ fh, "Paprika, tuz, karabiber \ n");

fputs ($ fh, "Fesleğen, adaçayı, zencefil \ n");

// Manipülatörü kapat

// Baharatlar.txt dosyasında Basil'i bulmak için UNIX grep işlemini açın

$ fh - popen ("grep Fesleğen< spices.txt", "r");

// grep çıktısını yazdır

Sonuç şöyle görünür:

Fesleğen, adaçayı, zencefil

fpassthru () işlevi, bu bölümün "Harici Programları Çalıştırma" bölümünde açıklanan passthru () işlevine benzer.

Tüm işlemler tamamlandıktan sonra dosya veya işlem kapatılmalıdır. pclose () işlevi, manipülatör tarafından belirtilen işlemle olan bağlantıyı, fclose ()'nin fopen () ile açılan bir dosyayı kapatmasına benzer şekilde kapatır. pclose() işlevinin sözdizimi şöyledir:

int pclose (int manipülatör)

parametrede manipülatör poren()'e yapılan başarılı bir çağrıdan daha önce alınan manipülatör iletilir.

Soket bağlantısının açılması

PHP, dosyalar ve süreçlerle etkileşimle sınırlı değildir - ayrıca soketler üzerinden de bağlantı kurabilirsiniz. Priz(soket), başka bir bilgisayardaki çeşitli servislerle iletişime izin veren bir yazılım soyutlamasıdır.

fsockopen () işlevi, İnternet'teki bir sunucuya soket bağlantısı kurar

TCP veya UDP aracılığıyla. fsockopen() işlevinin sözdizimi şöyledir:

int fsockopen (dize düğümü, int bağlantı noktası [, int hata_kodu [, dize error_text [, int zaman aşımı]]])

İsteğe bağlı olan error_code ve error_text parametreleri, sunucuya bağlantı başarısız olursa görüntülenecek bilgileri içerir. Her iki parametre de referans olarak iletilmelidir. Üçüncü isteğe bağlı parametre olan zaman aşımı, sunucudan yanıt için ne kadar süre bekleneceğini (saniye cinsinden) belirtir. Liste 7.6, bir sunucu hakkında bilgi almak için fsockopen()'ın nasıl kullanılacağını gösterir. Ancak, Liste 7.6'ya bakmadan önce, socket_set_blocking () adlı başka bir işleve aşina olmanız gerekir.

UDP (Kullanıcı Datagram Protokolü), bağlantısız bir iletişim protokolüdür.

socket_set_blocking ()

Socket_set_b1ocki ng () işlevi, sunucu işlemleri için zaman aşımı denetimi ayarlamanıza olanak tanır:

socket_set_blocking (int manipülatör, boole modu)

Handle parametresi önceden açılmış bir soketi belirtir ve mode parametresi soketin değiştirildiği modu belirtir (engelleme modu için TRUE, bloke olmayan mod için FALSE). fsockopen() ve socket_set_blocking() işlevlerinin kullanımına ilişkin bir örnek Liste 7.6'da gösterilmektedir.

Liste 7.6. Sunucu Bilgilerini Almak için fsockopen () İşlevini Kullanma

function getthehost ($ host. $ path) (

// Düğüme bir bağlantı aç

$ fp - fsockopen ($ ana bilgisayar, 80 ve $ errno ve $ errstr, 30);

// Engelleme moduna geç

socket_set_blocking ($ fp, 1),

// Başlıkları gönder

fputs ($ fp, "GET $ yolu HTTP / 1.1 \ r \ n");

fputs ($ fp, "Ana bilgisayar: $ ana bilgisayar \ r \ n \ r \ n"); $x = 1;

// Başlıkları al

süre ($ x< 10) :

$ başlıklar = fgets ($ fp, 4096);

// Manipülatörü kapat

getthehost ("www.apress.com", "/");

7.6 listesi aşağıdaki çıktıyı üretir:

НТТР / 1.1 200 OK Sunucu: Microsoft-IIS / 4.0 İçerik-konumu:

2000 20:25:06 GMT ETag: "f0a61666dbff1bf1: 34a5" İçerik Uzunluğu: 1311

pfsockopen () işlevi, fsockopen () işlevinin kalıcı bir sürümüdür. Bu, işlevin çağrıldığı komut dosyası sona erdiğinde bağlantının otomatik olarak sonlandırılmayacağı anlamına gelir. pfsockopen() işlevinin sözdizimi şöyledir:

int pfsockopen (dize düğümü, int bağlantı noktası [, int hata_kodu [, dize metin_hatası [, int zaman aşımı]]])

Uygulamanızın özel amacına bağlı olarak, fsockopen () yerine pfsockopen () kullanmak daha uygun olabilir.

Harici programları başlatma

PHP betikleri, sunucuda bulunan programları da çalıştırabilir. Bu özellik, özellikle sistem bir web tarayıcısı aracılığıyla yönetilirken ve sistem hakkında daha kolay özet bilgiler elde etmek için kullanılır.

exec () işlevi belirtilen programı başlatır ve çıktısının son satırını döndürür. exec() işlevinin sözdizimi şöyledir:

string exec (string komutu [, string dizisi [, int dönüş]])

Lütfen dikkat: exec () işlevi, çalışmasının sonuçlarını görüntülemeden yalnızca komutu yürütür. Tüm komut çıktıları, isteğe bağlı dizi parametresinde saklanabilir. Ayrıca, verilen parametre için dönüş değişkeni de belirtilmişse, diziye yürütülen komutun dönüş kodu atanır.

Liste 7.7, UNIX sistem ping işlevini yürütmek için exec () işlevinin nasıl kullanılacağını gösterir.

Listeleme 7.7. exec () işlevini kullanarak sunucuyla iletişimi kontrol etme

exec ("ping -c 5 www.php.net", $ ping);

// Windows'ta - exec ("ping -n 5 www.php.net. $ Ping);

için ($ ben = 0; $ ben< count($ping);$i++) :

Yazdır "
$ ping [$ ben] ";

Sonuç:

PING www.php.net (208.247.106.187): 56 veri baytı

208.247.106.187'den 64 bayt: icmp_seq = 0 ttl = 243 zaman = 66.602 ms

208.247.106.187'den 64 bayt: icmp_seq = 1 ttl = 243 zaman = 55.723 ms

208.247.106.187'den 64 bayt: icmp_seq = 2 ttl = 243 zaman = 70.779 ms

208.247.106.187'den 64 bayt: icmp_seq = 3 ttl = 243 zaman = 55.339 ms

208.247.106.187'den 64 bayt: icmp_seq = 4 ttl = 243 zaman = 69.865 ms

Www.php.net ping istatistikleri -

5 paket iletildi. 5 paket alındı. %0 paket kaybı

gidiş-dönüş min / ortalama / maks / standart - 55.339 / 63.662 / 70.779 / 6.783 ms

Backticks

Çağrı işlevleri gerektirmeyen sistem komutlarını yürütmenin başka bir yolu daha vardır - yürütülmekte olan komut geri tepmeler (``) içine alınır ve çalışmasının sonuçları tarayıcıda görüntülenir. Örnek:

Yazdır "

$ çıktı
";

Bu snippet, komut dosyasını içeren dizinin içeriğini tarayıcıya verir.

Dahili parametre ping -c 5 (Windows'ta -n 5), sunucu yoklamalarının sayısını belirtir.

Yalnızca bir komutun biçimlendirilmemiş sonuçlarını döndürmek istiyorsanız, aşağıda açıklanan passthru () işlevini kullanın.

passthru () işlevi, bir istisna dışında, exec () işleviyle hemen hemen aynı şekilde çalışır - komutun çıktısını otomatik olarak yazdırır. passthru () işlevinin sözdizimi şöyledir:

geçersiz geçiş (string komutu [, int dönüş])

passthru () çağrılırken isteğe bağlı bir dönüş parametresi iletilirse, bu değişkene yürütülen komutun dönüş kodu atanır.

kaçış kabuğucmd ()

escapeshellcmd () işlevi, kullanıcının exec (), passthru (), system () veya popn () komutlarını yürütmek için girebileceği (örneğin, bir HTML formunda) tüm potansiyel olarak tehlikeli karakterlerden kaçar. Sözdizimi:

string escapeshellcmd (dize komutu)

Kullanıcı girişi her zaman biraz dikkatli olmalıdır, ancak o zaman bile kullanıcılar sistem komut başlatma işlevleri tarafından yürütülecek komutları girebilir. Aşağıdaki parçacığı göz önünde bulundurun:

$ user_input = `rm -rf *`; // Üst dizini ve tüm alt dizinlerini kaldırın

yürüt ($ user_input); // $ user_input'u yürütün !!!

Herhangi bir önlem almazsanız, böyle bir komut felakete yol açacaktır. Ancak, kullanıcı girişinden kaçmak için escapeshellcmd () işlevlerini kullanabilirsiniz:

$ user_input = `rm - rf *`; // Üst dizini ve tüm alt dizinlerini kaldırın

exec (escapeshellcmd ($ user_input)); // Tehlikeli karakterlerden kaçış

Kaçış kabuğucmd () işlevi, katastrofik komut yürütmesini önlemek için * karakterinden kaçar.

Güvenlik, web programlamanın en önemli yönlerinden biridir, bu yüzden bütün bir bölümü bu konuya ve PHP programlama ile ilişkisine ayırdım. Daha fazla bilgi için 16. bölüme bakın.

Dosya sistemi ile çalışma

PHP, sunucudaki dosyalar üzerinde çeşitli işlemleri görüntülemek ve gerçekleştirmek için işlevler sağlar. Sunucu dosyalarının öznitelikleri (konum, sahip ve ayrıcalıklar) hakkındaki bilgiler genellikle yararlıdır.

basename () işlevi, geçirilen nitelikli addan dosya adını çıkarır. basename () işlevinin sözdizimi şöyledir:

dize taban adı (dize tam_adı)

Temel dosya adının tam addan çıkarılması aşağıdaki gibidir:

$ yol = "/usr/local/phppower/htdocs/index.php"; $ dosya = temel ad ($ yol); // $ dosya = "index.php"

Aslında, bu işlev yolu tam addan kaldırır ve yalnızca dosya adını bırakır.

getlastmod() işlevi, işlevin çağrıldığı sayfanın son değişikliğinin tarihini ve saatini döndürür. getlastmod() işlevinin sözdizimi şöyledir:

int getlastmod (geçersiz)

Dönüş değeri, UNIX tarih/saat biçimini takip eder ve tarih () işlevi kullanılarak biçimlendirilebilir. Aşağıdaki snippet, sayfanın en son değiştirildiği tarihi görüntüler:

echo "Son değiştirilme:" .date ("H: i: s a". getlastmod ());

stat () işlevi, verilen ada sahip dosya hakkında ayrıntılı bilgi içeren dizinlenebilir bir dizi döndürür:

dizi statüsü (dize dosya adı)

Dizinin öğelerinde aşağıdaki bilgiler döndürülür:

0 İnşaat

2 Düğüm koruma modu

3 Bağlantı sayısı

4 Sahip kullanıcı kimliği

5 Sahibin grup kimliği

6 İnode cihaz tipi

7 Bayt cinsinden boyut

8 Son erişim zamanı

9 Son değişiklik zamanı

10 Son değişiklik zamanı

11 Dosya sistemi G / Ç için blok boyutu

12 Tahsis edilen blok sayısı

Bu nedenle, son dosya erişiminin zamanını bilmek istiyorsanız, döndürülen dizinin 8. öğesine bakın. Bir örnek düşünelim:

$ dosya - "datafile.txt";

list ($ dev, $ inode, $ inodep, $ nlink, $ uid, $ gid, $ inodev, $ size, $ atime, $ mtime, $ ctime,

$ bsize) = stat ($ dosya);

print "$ dosyası, $ boyutunda bayttır.
";

print "Son erişim zamanı: $ atime
";

print "Son değişiklik zamanı: $ mtime
";

Sonuç:

popen.php 289 bayttır.

Son erişim zamanı: 15 Ağustos 2000 12:00:00

Son değişiklik zamanı: 15 Ağustos 2000 10:07:18

Bu örnekte, her bir dönüş değerini adlandırmak için list() yapısını kullandım. Tabii ki, bir dizi döndürebilir, öğeler üzerinde döngü yapabilir ve gerekli tüm bilgileri görüntüleyebilirsiniz. Gördüğünüz gibi, stat () işlevi bir dosya hakkında çeşitli yararlı bilgiler sağlar.

Dosya özelliklerini görüntüleme ve değiştirme

UNIX sistemlerindeki her dosyanın üç önemli özelliği vardır:

  • bir gruba ait;
  • sahip;
  • izinler.

Tüm bu özellikler, uygun PHP işlevleri kullanılarak değiştirilebilir. Bu bölümde açıklanan özellikler Windows ailesi sistemlerinde çalışmaz.

UNIX işletim sistemlerinde yeniyseniz, UNIX dosya sistemi özellikleriyle ilgili bilgileri http://sunsite.auc.dk/linux-newbie/FAQ2.htm adresinden edinebilirsiniz. Grup üyeliği, sahipliği ve izinleri konuları Bölüm 3.2.6'da tartışılmaktadır.

chgrp() işlevi, belirtilen dosyanın ait olduğu grubu değiştirmeye çalışır. chgrp() işlevinin sözdizimi şöyledir:

int chgrp (dize dosya adı, karışık grup)

filegroup () işlevi, verilen ada sahip dosyanın sahibinin grup kimliğini veya hata durumunda FALSE değerini döndürür. filegroup() işlevinin sözdizimi şöyledir:

int dosya grubu (dize dosya adı)

chmod () işlevi, verilen adla dosyanın izinlerini değiştirir. chmod() işlevinin sözdizimi şöyledir:

int chmod (dize dosya adı, int izinleri)

İzinler sekizli olarak verilmiştir. chmod () işlevine bir parametre ayarlamanın özellikleri aşağıdaki örnekte gösterilmiştir:

chmod ("veri_dosyası.txt", g + r); // çalışmıyor

chmod ("data_file.txt", 766); // Çalışmıyor

chmod ("data_file.txt", 0766); // İşler

fileperms () işlevi, verilen ada sahip dosyanın izinlerini veya hata durumunda FALSE döndürür. fileperms() işlevinin sözdizimi şöyledir:

int dosya izinleri (dize dosya adı)

chown () işlevi, bir dosyanın sahibini değiştirmeye çalışır. Yalnızca ayrıcalıklı kullanıcı bir dosyanın sahibini değiştirme hakkına sahiptir. chown() işlevinin sözdizimi şöyledir:

int chown (dize dosya adı, karışık kullanıcı)

fileowner () işlevi, verilen ada sahip dosyanın sahibi için kullanıcı kimliğini döndürür. dosya sahibi () işlevinin sözdizimi şöyledir:

int dosya sahibi (dize dosya adı)

Dosyaları kopyalama ve yeniden adlandırma

PHP betiklerinin gerçekleştirebileceği diğer yararlı sistem işlevleri arasında, sunucudaki dosyaların kopyalanması ve yeniden adlandırılması yer alır. Bu işlemler iki işlev tarafından gerçekleştirilir: litter() ve rename().

Bir PHP betiğindeki bir dosyayı kopyalamak, UNIX komutu cf'yi kullanmaktan daha zor değildir. Görev, PHP işlevi sopu () tarafından çözülür. copu() işlevinin sözdizimi şöyledir:

int kopyası (dize kaynağı, dize hedefi)

copu () işlevi, kaynak dosyayı hedef dosyaya kopyalamaya çalışır; başarı durumunda TRUE, başarısızlık durumunda FALSE döndürür. Hedef dosya yoksa, litter() işlevi onu oluşturur. Aşağıdaki örnek, copu () işlevini kullanarak bir dosyanın nasıl yedekleneceğini gösterir:

$ data_file = "datal.txt";

kopyala ($ data_file. $ data_file ".bak") veya die ("$ data_file kopyalanamadı");

rename () işlevi bir dosyayı yeniden adlandırır. Başarı durumunda TRUE, başarısızlık durumunda FALSE döndürür. rename () işlevinin sözdizimi şöyledir:

bool yeniden adlandır (dize eski_adı, dize yeni_adı)

rename () işleviyle bir dosyayı yeniden adlandırmaya bir örnek:

$ data_file = "datal.txt";

yeniden adlandır ($ veri dosyası, $ veri dosyası ".old") veya öl ("$ veri dosyası yeniden adlandırılamadı");

Dosyaları silme

unlink () işlevi, belirtilen ada sahip dosyayı kaldırır. Sözdizimi:

int bağlantısını kaldır (dize dosyası)

PHP ile bir Windows sisteminde çalışıyorsanız, bu işlevi kullanırken bazen sorunlar ortaya çıkabilir. Bu durumda yukarıda anlatılan system() fonksiyonunu kullanabilir ve DOS del komutu ile dosyayı silebilirsiniz:

sistem ("del dosyaadı.txt");

Dizinlerle çalışma

PHP işlevleri, dizinleri görüntülemenize ve gezinmenize olanak tanır. Liste 7.8, tipik bir UNIX dizin yapısını gösterir.

Listeleme 7.8. Tipik dizin yapısı

dirname () işlevi, yolu tam dosya adından çıkarmak için basename () işlevini tamamlar. dirname() işlevinin sözdizimi şöyledir:

string dirname (dize yolu)

Tam nitelikli bir addan bir yol çıkarmak için dirname () kullanımına bir örnek:

$ yol = "/usr/locla/phppower/htdocs/index.php";

$ dosya = dizinadı ($ yol); // $ dosya = "usr / local / phppower / htdocs"

dirname () işlevi bazen komutun çalıştırıldığı komut dosyasının tam yolunu almak için $ SCRIPT_FILENAME değişkeni ile birlikte kullanılır:

$ dizin - dizin adı ($ SCRIPT_FILENAME);

is_dir () işlevi, verilen ada sahip dosyanın bir dizin olup olmadığını kontrol eder:

bool is_dir (dize dosya adı)

Aşağıdaki örnek, Liste 7.8'deki dizin yapısını kullanır:

$ isdir = is_dir ("index.html"); // YANLIŞ döndürür

$ isdir = is_dir ("kitap"); // DOĞRU döndürür

mkdir () işlevi, aynı addaki UNIX komutuyla aynı şeyi yapar - yeni bir dizin oluşturur. mkdir() işlevinin sözdizimi şöyledir:

int mkdir (dize yolu, int modu)

path parametresi, yeni bir dizin oluşturma yolunu tanımlar. Parametreyi yeni dizinin adıyla bitirmeyi unutmayın! mode parametresi, oluşturulan dizine atanan izinleri belirler.

Tıpkı fopen () işlevinin belirli bir dosyayı işlemek için bir manipülatör açması gibi, opendir () bir dizini işlemek için bir manipülatör açar. opendir() işlevinin sözdizimi şöyledir:

int opendir (dize yolu)

closedir () işlevi, parametre olarak iletilen dizin tanıtıcısını kapatır. closedir() işlevinin sözdizimi şöyledir:

void closedir (int dir_manipulator)

readdir () işlevi, belirtilen dizindeki sonraki girişi döndürür. Sözdizimi:

string readdir (int dir_manipulator)

Bu işlevle, geçerli dizindeki tüm dosyaları ve alt dizinleri kolayca listeleyebilirsiniz:

$ dh = opendir (".);

while ($ dosya = readdir ($ dh)):

"$ dosyasını yazdır
"; son;

chdir () işlevi, UNIX cd komutuyla aynı şekilde çalışır - parametre tarafından belirtilen dizine gider. chdir() işlevinin sözdizimi şöyledir:

int chdir (dize dizini)

Aşağıdaki örnekte kitap/alt dizine gidiyoruz ve içeriğini görüntülüyoruz:

$ yenidir = "kitap";

chdir ($ newdir) veya die ("Dizin değiştirilemedi ($ newdir)"); $ dh = opendir (".");

while ($ dosya = readdir ($ dh));

"$ dosyasını yazdır
";

rewlnddir () işlevi, mevcut konum işaretçisini opendir () işlevi tarafından açılan dizinin başına taşır. rewinddir () işlevinin sözdizimi şöyledir:

void rewinddir (int dir_nip)

Proje 1: basit bir vuruş sayacı

Bu bölümde sunulan komut dosyası, bulunduğu sayfaya gelen isabet sayısını sayar. Liste 7.9'daki koda geçmeden önce, sözde kod algoritmasını inceleyin:

  1. $ erişim değişkenini, sayaç değerinin saklanacağı dosyanın adına ayarlayın.
  2. $ ziyaretleri dizisine $ erişiminin içeriğini okumak için file() işlevini kullanın. İşlev adının önündeki @ öneki olası hataları (örneğin, belirtilen ada sahip bir dosyanın olmaması) gizler.
  3. $ current_visitors değişkenini $ ziyaretleri dizisindeki ilk (ve tek) öğeye ayarlayın.
  4. $ current_visitors değerini 1 artırın.
  5. Yazmak için $ access dosyasını açın ve mevcut konum işaretçisini dosyanın başına ayarlayın.
  6. $ current_visitors değerini $ access dosyasına yazın.
  7. $ erişimine başvuran tutamacı kapatın.

Listeleme 7.9. Basit vuruş sayacı

// Senaryo: basit vuruş sayacı

// Amaç: dosyadaki isabet sayısını kaydetmek

$ erişim = "hits.txt"; // Dosya adı isteğe bağlı olarak seçilir

$ current_visitors = $ ziyaret; // İlk (ve tek) öğeyi al

++ $ mevcut_ziyaretçiler; // İsabet sayacını artır

$ fh = fopen ($ erişim. "w"); // hits.txt dosyasını açın ve kurun

// dosyanın başına geçerli konumun işaretçisi

@fwrite ($ fh, $ current_visitors); // Yeni sayaç değeri yaz

// "hits.txt" dosyasına

fclose ($ fh); // "hits.txt" dosya tanıtıcısını kapatın

Proje 2: site haritası oluşturma

Liste 7-10'daki komut dosyası, belirli bir dizinden başlayarak sunucudaki tüm klasörlerin ve dosyaların hiyerarşik bir görünümü olan bir site haritası oluşturur. Site haritasını oluşturan öğelerin girintisi hesaplanırken bu ve önceki bölümlerde tanımlanan işlevler kullanılır. Programa geçmeden önce pseudocode ile yazılmış algoritmayı inceleyin:

  1. Üst dizini, klasör görüntüsüyle birlikte grafik dosyasının adını, sayfa adını ve sunucu işletim sistemi bayrağını (Windows veya diğer sistem) depolamak için hizmet değişkenlerini bildirin.
  2. Dizinin içeriğini okuyan ve tarayıcıda görüntülenmek üzere biçimlendiren bir display_directory () işlevi bildirin.
  3. $ dir1 değişkeninde geçirilen adı $ dir ile birleştirerek dizin yolunu oluşturun.
  4. Dizini açın ve içeriğini okuyun. Dizin ve dosya adlarını biçimlendirin ve tarayıcıda görüntüleyin.
  5. Geçerli dosya bir dizinse, yinelemeli olarak display_di rectory () öğesini çağırın ve görüntülenecek yeni dizinin adını iletin. Çıktıyı biçimlendirirken kullanılan girintiyi hesaplayın.

Dosya bir dizin değilse, köprü olarak görüntülenecek şekilde biçimlendirilir (ve biçimlendirme için kullanılan girinti de hesaplanır).

Liste 7.10. Sitemap.php programı

// Dosya: sitemap.php

// Amaç: bir site haritası oluşturmak

// Haritayı oluşturmaya başlayacağınız dizin

$ beg_path = "C:\Program FilesVApache Group\Apache\htdocs\phprecipes";

// Klasörün grafik görüntüsünü içeren dosya.

// Yol, Apache sunucusunun kök dizini * Göreli olarak ayarlanmalıdır

$ folder_location = "C: \ Belgelerim \ Programcılar için PHP \ NİHAİ CHPS \ grafikler \ klasör.gif";

// Pencerenin başlığındaki metin $ page_name = "PHPRecipes SiteMap";

// Komut dosyası Linux'ta mı yoksa Windows'ta mı kullanılacak?

// (0 - Windows; 1 - Linux)

$ kullanmajinux = 0;

// fonksiyon: display_directory

// Amaç: parametre tarafından belirtilen dizinin içeriğini okumak

// $ dir1, ardından dizin ve dosya hiyerarşisini biçimlendirme.

// Fonksiyon yinelemeli olarak çağrılabilir.

function display_directory ($ dir1, $ klasör_konumu, $ using_linux, $ init_depth) (

// Yolu güncelle

Sdh = opendir ($ dizin);

while ($ dosya = readdir ($ dh)):

// Dizin öğeleri "." ve ".." görüntülenmez.

if (($ dosya! = ".") && ($ dosya! = "..")):

if ($ using_linux == 0):

$ derinlik = patlat ("\\", $ dizin): başka:

$ derinlik = patlat ("/", $ dizin); endif; $ curtent_depth = sizeof ($ derinlik);

// Yolu kullanılan işletim sisteminin kurallarına göre oluşturun. if ($ using_linux == 0):

$ tab_depth = $ current_deptn - $ init_depth;

$ dosya = $ dizin. "\\", $ dosyası; Başka:

$ dosya = $ dizin. "/", $ dosyası; endif;

// $ dosya değişkeni bir dizin içeriyor mu? if (dir ($ dosyası)):

// Girintiyi hesapla

süre ($ x< ($tab_depth * 2)) :

$x++; son zaman;

Yazdır "

".basename ($ dosyası)."
";

// Sayacı artır

// display_directory () işlevini yinelemeli olarak çağır

display_directory ($ dosya, $ klasör_konumu, $ using_linux, $ init_depth);

// O dizini

// Yolu kullanılan kurallara göre oluşturun

// işletim sistemi.

if ($ using_linux == 0):

$ tab_depth = ($ current_depth - $ init_depth) - 2; $x = 0;

// Girintiyi hesapla

süre ($ x< (($tab_depth * 2) + 5)) :

Yazdır " ".basename ($ dosyası)."
";

Yazdır " ".basename ($ dosyası)."
";

endif; // Is_dir (dosya) endif: // Eğer! "." veya ".."

// Dizini kapat closedir ($ dh);

<? print "$page_name"; ?>

// Başlangıç ​​dolgusunu hesapla

if ($ using_linux == 0):

$ derinlik = patlat ("\\", $ beg_path);

$ derinlik = patlat ("/", $ beg_path);

$ init_depth = sizeof ($ derinlik);

display_directory ($ beg_path, $ folder_location, $ using_linux, $ init_depth);

İncirde. 7.1, bu kitaptaki birkaç bölümü olan bir dizin için bir komut dosyasının çıktısını gösterir.

Pirinç. 7.1. Sitemap.php betiğini kullanarak sunucudaki dizin yapısını görüntüleme

sonuçlar

Bu bölüm, dosyalarla çalışmak için birçok PHP aracını tanıttı. Özellikle, aşağıdaki konulara baktık:

  • dosyaların varlığını kontrol etmek;
  • dosyaları ve G/Ç akışlarını açma ve kapatma;
  • bir dosyaya yazma ve dosyadan okuma;
  • bir dosyayı bir çıktı akışına yönlendirmek;
  • harici programların başlatılması;
  • dosya sistemi işlemleri.

Bu bölüm, bir sonraki bölüm olan "Dizeler ve Normal İfadeler" için zemin hazırlar, çünkü dize işleme ve G / Ç web geliştirmede çok yakından ilişkilidir.

fopen, fclose, feof, fgets, fgetss ve fscanf işlevlerini kullanma

Tüm olasılıkları sıralayalım

PHP gibi modern programlama dilleriyle çalışmanın faydalarından biri, mevcut yeteneklerin çokluğudur. PHP, özellikle dosya işleme söz konusu olduğunda, Perl'in "Bir şeyi yapmanın birden çok yolu vardır" sloganını kolayca benimseyebilirdi. Ancak mevcut fon bolluğu ile, işi halletmek için hangisinin en iyi olduğu sorusu ortaya çıkıyor. Elbette gerçekte bu sorunun cevabı dosyayı işlerken belirlediğiniz hedeflere bağlıdır, bu nedenle dilin tüm özelliklerini öğrenmek zaman ayırmaya değer.

Geleneksel fopen yöntemleri

fopen yöntemleri, eski günlerin C ve C ++ programcılarına belki daha aşinadır, çünkü onlar, az ya da çok, tam olarak bu programlama ile çalıştıysanız, uzun yıllardır parmaklarınızın ucunda olan araçlardır. Diller. Bu yöntemlerden herhangi biri için, Liste 1'de gösterildiği gibi, dosyayı açmak için fopen, verileri okumak için bir işlev ve ardından dosyayı kapatmak için fclose kullanarak standart bir prosedür izlersiniz.

Liste 1. fgets ile Dosya Açma ve Okuma
$ file_handle = fopen ("dosyam", "r"); while (! feof ($ dosya_tanıtıcı)) ($ satır = fgets ($ dosya_tanıtıcı); echo $ satır;) fclose ($ dosya_tanıtıcı);

Bu işlevler çoğu deneyimli programcıya tanıdık gelse de, nasıl çalıştıklarını analiz etmeme izin verin. Gerçekte, şu adımları izliyorsunuz:

  1. Dosyayı aç. $ file_handle, dosyanın kendisine bir bağlantı saklar.
  2. Dosyanın sonuna ulaşıp ulaşmadığınızı kontrol edin.
  3. Okuduğunuz her satırı yazdırarak sonuna ulaşana kadar dosyayı okumaya devam edin.
  4. Dosyayı kapatın.

Bunu akılda tutarak, burada kullanılan her dosya işlevini gözden geçireceğim.

fopen işlevi

fopen işlevi bir dosyaya bir bağlantı kurar. "Bağlanıyor" diyorum çünkü fopen bir dosyayı açmanın yanı sıra bir URL de açabilir:

$ fh = fopen ("http://127.0.0.1/", "r");

Bu kod satırı, yukarıdaki sayfaya bir bağlantı oluşturur ve onu yerel bir dosya olarak okumaya başlamanıza olanak tanır.

Not: fopen'de kullanılan "r" parametresi, dosyanın salt okunur açık olduğunu gösterir. Bir dosyaya yazmak bu makalenin kapsamı dışında olduğu için parametrenin olası tüm değerlerini listelemeyeceğim. Ancak, platformlar arası uyumluluk için ikili dosyalardan okuyorsanız "r"yi "rb" olarak değiştirmeniz gerekir. Aşağıda bu türden bir örnek verilecektir.

feof işlevi

Feof komutu, dosyanın sonuna bir okuma yapılıp yapılmadığını belirler ve True veya False değerini döndürür. Verilen döngü "dosyam" dosyasının sonuna kadar devam eder. Bir URL okuyorsanız ve okunacak daha fazla veri olmadığından bağlantı zaman aşımına uğradıysa feof öğesinin False değerini de döndürdüğünü unutmayın.

Kapatma işlevi

Liste 1'in ortasını atlayın ve sonuna gidin; fclose, fopen'in tersini yapar: bir dosya veya URL bağlantısını kapatır. Bu işlevi yürüttükten sonra artık bir dosyadan veya soketten okuma yapamayacaksınız.

Fgets işlevi

Liste 1'de birkaç satır geriye giderseniz, dosya işleme sürecinin tam merkezindesiniz: doğrudan dosyayı okumak. fgets işlevi, ilk örnek için seçtiğiniz "silahınızdır". Bir dosyadan bir satır veri alır ve onu bir dizge olarak döndürür. Oradan, verileri çıkarabilir veya başka şekilde işleyebilirsiniz. Liste 1'deki örnek tüm dosyayı yazdırır.

Çalıştığınız veri yığınının boyutunu sınırlamaya karar verirseniz, yakalanan veri satırının maksimum uzunluğunu sınırlamak için fgets öğesine bir argüman ekleyebilirsiniz. Örneğin, dize uzunluğunu 80 karakterle sınırlamak için aşağıdaki kodu kullanın:

$ string = fgets ($ file_handle, 81);

C satırının sonundaki "\ 0"ı düşünün ve uzunluğu gerçekten ihtiyacınız olandan bir karakter fazlasına ayarlayın. Gördüğünüz gibi, yukarıdaki örnekte 81 kullanılırken, 80 karaktere ihtiyacınız var. Belirli bir işlev için bir dize uzunluğu sınırı belirlemeniz gerektiğinde fazladan bir karakter eklemeyi alışkanlık haline getirin.

Sıkma işlevi

fgets işlevi, bir dosyayı okumak için kullanılabilen birçok işlevden yalnızca biridir. Bir dosyanın satır satır işlenmesi çoğu durumda en mantıklı olduğu için bu en yaygın kullanılan işlevlerden biridir. Aslında, birkaç başka özellik de benzer yetenekler sunar. Ancak, satır satır analiz her zaman istediğiniz gibi değildir.

İşte tam da bu noktada fread'e dönüyoruz. fread işlevi, fgets'ten biraz farklı bir amaç için kullanılır: ikili dosyalardan (yani, orijinal olarak insan tarafından okunabilir olmayan dosyalardan) okumak için tasarlanmıştır. "Dizeler" kavramı ikili dosyalar için geçerli olmadığından (mantıksal veri yapıları genellikle satırlara bölünmez), okunacak bayt sayısını belirtmeniz gerekir.

$ fh = fopen ("dosyam", "rb"); $ veri = fread ($ dosya_tutucu, 4096);

Yukarıdaki örnek, 4096 bayt (4 KB) veri okur. Belirttiğiniz değerden bağımsız olarak fread'in 8192 bayttan (8 KB) fazla okumayacağını unutmayın.

Dosyanın 8 KB'den fazla olmadığını varsayarsak, aşağıdaki kod parçasının tüm dosyayı tek satırda okuması gerekir.

$ fh = fopen ("dosyam", "rb"); $ veri = fread ($ fh, dosya boyutu ("dosyam")); fclose ($ fh);

Dosya daha büyükse, geri kalanını okumak için bir döngü kullanmanız gerekecektir.

fscanf işlevi

Satır işlemeye geri dönersek, fscanf'ın aynı zamanda geleneksel dosya tabanlı C kitaplığı işlevinin ardılı olduğunu unutmayın.Buna aşina değilseniz, fscanf veri alanlarını bir dosyadan değişkenlere okur.

liste ($ alan1, $ alan2, $ alan3) = fscanf ($ fh, "% s% s% s");

Bu fonksiyonda kullanılan biçimlendirme dizgileri PHP.net gibi birçok kaynakta belgelenmiştir, bu yüzden bu bilgiyi burada tekrar etmeyeceğim. Dize biçimlendirmesinin çok esnek olduğunu söylemek yeterli. Ayrıca tüm alanların fonksiyon tarafından döndürülen bir değişkene yerleştirildiği de belirtilmelidir. (C'de argüman olarak iletilirler.)

Fgets işlevi

fgetss işlevi, geleneksel dosya işlevlerinden farklıdır ve size PHP'nin neler yapabileceği hakkında daha iyi bir fikir verir. Fget'ler gibi çalışır, ancak karşılaştığı tüm HTML veya PHP etiketlerini çıkarır ve yalnızca "çıplak" metin bırakır. Aşağıdaki HTML dosyasını alın.

Liste 2. Örnek HTML dosyası
benim başlığım

"Çünkü sana acı verecek kimse yok"un ne anlama geldiğini anlıyorsanız, o zaman America grubunu çok fazla dinliyorsunuz demektir.



Bunu fgetss fonksiyonundan geçirelim.

Liste 3. fgetss kullanma
$ file_handle = fopen ("dosyam", "r"); while (! feof ($ file_handle)) (echo = fgetss ($ file_handle);) fclose ($ file_handle);

Çıktı olarak şunları elde edersiniz:

Başlığım "Çünkü sana acı verecek kimse yok"un ne anlama geldiğini anlıyorsanız, o zaman America grubunu çok fazla dinliyorsunuz demektir.

Fpassthru işlevi

Dosyadan verileri nasıl okuduğunuza bakılmaksızın, fpassthru işlevini kullanarak standart çıktı borusunu kullanarak kalan verileri yazdırabilirsiniz.

fpassthru ($ fh);

Bu işlev verileri yazdırır, böylece bir değişkene koymanız gerekmez.

Doğrusal olmayan dosya işleme: dosya içinde hareket etme

Tabii ki, yukarıdaki işlevler yalnızca bir dosyadan sırayla okumanıza izin verir. Daha karmaşık dosyalar, dosyanın başında veya sonunda farklı bölümlerine geçmenizi gerektirebilir. Bunu yapmak için fseek işlevine ihtiyacınız var.

fseek ($ fh, 0);

Yukarıdaki örnek, dosyanın başına geri döner. Dosyanın en başına gitmek istemiyorsanız - örneğin, bir kilobayt yeterlidir - şunu yazmanız yeterlidir:

fseek ($ fh, 1024);

PHP V4.0'dan itibaren başka seçenekler de mevcuttur. Örneğin, mevcut konumunuzdan 100 bayt ileri atlamak istiyorsanız, aşağıdaki kodu kullanabilirsiniz:

fseek ($ fh, 100, SEEK_CUR);

Benzer şekilde, 100 bayt geri atlamak şu şekilde yapılır:

fseek ($ fh, -100, SEEK_CUR);

Dosyanın bitiminden önce 100 bayta geri atlamak istiyorsanız, bunun yerine SEEK_END'i kullanın.

fseek ($ fh, -100, SEEK_END);

Yeni konumunuza ulaştığınızda, verileri okumak için fgets, fscanf veya başka bir işlevi kullanabilirsiniz.

Not: URL'lere atıfta bulunan dosya tanımlayıcılarda fseek kullanamazsınız.

Tüm bir dosyayı yakalama

Şimdi PHP'nin bazı benzersiz dosya işleme yeteneklerine bakacağız: bir veya iki satırda büyük veri bloklarını işlemek. Örneğin, bir dosyayı nasıl alıp tüm içeriğini Web sayfanızda görüntüleyebilirsiniz? Fgets ile bir döngü kullanmanın bir örneğini gördünüz. Ama bunu nasıl kolaylaştırabilirsin? İşlem, tüm dosyayı bir dizgeye koyan fgetcontents ile neredeyse gülünç derecede basittir.

$ my_file = file_get_contents ("dosyaadım"); echo $ benim_dosyam;

En iyi seçenek olmasa da, bu komutu daha da kısa yazabilirsiniz:

echo file_get_contents ("dosyaadım");

Bu makale öncelikle yerel dosyaların işlenmesiyle ilgilidir, ancak açıklanan işlevleri kullanarak diğer Web sayfalarını da yakalayabileceğinizi, görüntüleyebileceğinizi ve ayrıştırabileceğinizi belirtmekte fayda var.

echo file_get_contents ("http://127.0.0.1/");

Bu komut aslında şununla aynıdır:

$ fh = fopen ("http://127.0.0.1/", "r"); fpassthru ($ fh);

Bu örneklere bakıyor ve "Bu hala çok zaman alıyor" diye düşünüyor olmalısınız. PHP geliştiricileri sizinle aynı fikirde. Bu nedenle, yukarıdaki komutu şu şekilde kısaltabilirsiniz:

okuma dosyası ("http://127.0.0.1/");

readfile işlevi, bir dosyanın veya Web sayfasının tüm içeriğini varsayılan olarak çıktı arabelleğine yazar. Varsayılan olarak, bu komut hata durumunda bir hata mesajı görüntüler. Bu davranıştan kaçınmak için (isterseniz), şu komutu deneyin:

@readfile ("http://127.0.0.1/");

Tabii ki, dosyaların içeriğini işlemeniz gerekiyorsa, o zaman file_get_contents tarafından döndürülen tek satır muhtemelen çok fazladır. Önce split () işlevini kullanarak parçalara bölmek isteyebilirsiniz.

$ dizi = bölme ("\ n", file_get_contents ("dosyam"));

Ama işi sizin için yapacak mükemmel bir uygun işlev varsa neden tüm bu komplikasyonlara ihtiyacınız var? PHP file() işlevi bunu tek adımda yapar: öğeleri dosyanın dizeleri olan bir dize dizisi döndürür.

$ dizi = dosya ("dosyam");

Yukarıdaki iki örnek arasında küçük bir fark olduğuna dikkat edilmelidir. split komutu yeni satırları kaldırırken file komutu yeni satırlarla biter (tıpkı fget'lerde olduğu gibi).

Ancak PHP'nin yetenekleri yukarıda açıklananların çok ötesindedir. PHP stili .ini dosyalarının tamamını tek bir komutla parse_ini_file ayrıştırabilirsiniz. parse_ini_file komutu, Liste 4'tekilere benzer dosyalar için geçerlidir.

Liste 4. Örnek .ini dosyası
; Yorum adı = "Kral Arthur" görevi = Kutsal kaseyi aramak için favori rengi = Mavi Samuel Clemens = Mark Twain Caryn Johnson = Whoopi Goldberg

Aşağıdaki komutlar bir dosyayı dizi olarak temsil eder ve ardından bu diziyi yazdırır:

$ file_array = parse_ini_file ("holy_grail.ini"); print_r $ dosya_dizisi;

Bu, aşağıdaki çıktıyı üretecektir:

Liste 5. Çıktı
Dizi (=> Kral Arthur => Kutsal Kase'yi aramak için => Mavi => Mark Twain => Whoopi Goldberg)

Tabii ki, bu komutun bölümleri birleştirdiğini görebilirsiniz. Bu varsayılandır, ancak bir Boolean değişkeni olan parse_ini_file: process_sections için ikinci argümanı kullanarak gerekli ayarlamaları kolayca yapabilirsiniz. process_sections öğesini True olarak ayarlayın.

$ file_array = parse_ini_file ("holy_grail.ini", true); print_r $ dosya_dizisi;

Ve çıktınız şöyle görünecek:

Liste 6. Çıktı
Dizi (=> Dizi (=> Kral Arthur => Kutsal Kase'yi aramak için => Mavi) => Dizi (=> Mark Twain => Whoopi Goldberg))

PHP, verileri analiz için kolayca ayrıştırılabilen çok boyutlu bir diziye yerleştirir.

Ancak konu PHP'de dosya işlemeye geldiğinde bu sadece buzdağının görünen kısmı. tidy_parse_file ve xml_parse gibi daha karmaşık işlevler, sırasıyla HTML ve XML belgelerini ayrıştırmanıza yardımcı olabilir. Bu işlevlerin nasıl çalıştığı hakkında daha fazla bilgi için bölüme bakın. Bu tür dosyalarla çalışıyorsanız her ikisi de dikkate değerdir, ancak olası tüm dosya türlerine bakmak yerine, tanımladığım işlevlerle çalışmak için bazı iyi genel kuralların olduğu bu makalenin içeriğini dikkatlice okuyabilirsiniz. şu ana kadar.

İyi programlama stili

Programınızdaki her şeyin istendiği gibi çalışacağını asla varsaymayın. Örneğin: ya aradığınız dosya taşınmışsa? İzinlerdeki bir değişikliğin sonucu olarak dosyanın içeriğini okuyamazsanız ne olur? file_exists ve is_readable yöntemlerini kullanarak bir dosyanın varlığını ve onu okuma izinlerini önceden kontrol edebilirsiniz.

Liste 7. file_exists ve is_readable kullanımı
$ dosyaadı = "dosyam"; if (file_exists ($ dosya adı) && is_readable ($ dosya adı)) ($ fh = fopen ($ dosya adı, "r"); # İşlem fclose ($ fh);)

Bununla birlikte, pratikte, bu kod parçası muhtemelen göreviniz için aşırıya kaçacaktır. fopen tarafından döndürülen değerlerin işlenmesi daha basit ve daha doğrudur.

if ($ fh = fopen ($ dosya adı, "r")) (# İşleme fclose ($ fh);)

fopen hata durumunda False döndürdüğünden, bu, dosyanın yalnızca dosya açılabiliyorsa işlenmesini sağlar. Elbette, dosya mevcut değilse veya okunamıyorsa, dönüş değerinin negatif olmasını beklersiniz. Bu nedenle, böyle bir kontrol, tüm potansiyel sorunların düştüğü bir tuzaktır. Alternatif olarak, dosya açılamıyorsa program sonlandırmayı kullanabilir veya bir hata mesajı görüntüleyebilirsiniz.

fopen gibi, file_get_contents, file ve readfile işlevleri, dosya açılamıyor veya işlenemiyorsa False döndürür. fgets, fgetss, fread, fscanf ve fclose işlevleri de hata durumunda False döndürür. Tabii ki, fclose dışında, muhtemelen döndürdükleri sonuçları zaten işlediniz. fclose söz konusu olduğunda, dosya tanıtıcı düzgün kapanmazsa yapılabilecek çok az şey vardır, bu nedenle fclose'nin dönüş değerini kontrol etmek genellikle aşırıya kaçar.

Seçim senin

PHP, dosyaları okumak ve ayrıştırmak için verimli yollar sıkıntısı çekmez. fread gibi klasik işlevler çoğu zaman size güvenilir bir şekilde hizmet edebilir veya görevi tamamlamak için gerekirse readfile'ın basitliğinden daha fazla etkilenebilirsiniz. Seçim gerçekten neyi başarmaya çalıştığınıza bağlıdır.

Büyük miktarda veri işliyorsanız, fscanf'ın, örneğin file sonraki split ve sprintf komutlarıyla birlikte kullanılmasından daha yararlı ve verimli olması muhtemeldir. Alternatif olarak, küçük değişikliklerle yalnızca büyük metin görüntülüyorsanız, bunun yerine dosya, file_get_contents veya readfile işlevlerini kullanmak daha uygun olabilir. PHP'yi önbelleğe almak ve hatta geçici bir proxy oluşturmak için kullanırken bu çözüm muhtemelen doğru olacaktır.

PHP, dosyalarla çalışmak için birçok araç sağlar. Her birini daha iyi tanıyın ve üzerinde çalıştığınız proje için hangi araçların en iyi olduğunu öğrenin. Aralarından seçim yapabileceğiniz, bunlardan en iyi şekilde yararlanabileceğiniz ve dosyalarınızı PHP ile işlemenin keyfini çıkarabileceğiniz çok çeşitli yazılım araçlarına sahipsiniz.