Php faylni oxiridan o'qish. PHP: PHP faylini o'qing. PHP da fayllar bilan ishlash: o'qish, yozish va tavsiyalar. Fayllarni yaratish va o'chirish

PHP

file_exists("test.txt")//Fayl mavjudmi? filesize("test.txt");//Fayl hajmini bilib oling //Vaqt tamg'asi qaytarildi: fileatime("test.txt");//Faylga oxirgi marta kirish sanasi //date("d M Y" , $atime); filemtime("test.txt");//Faylni o'zgartirish sanasi //date("d M Y", $mtime); filectime("test.txt");//Fayl yaratilgan sana (Windows) //date("d M Y", $ctime);

Fayllar: ish rejimlari

PHP

resurs fopen (string fayl nomi, string rejimi) // resurs - muvaffaqiyatli bo'lsa faylga ko'rsatgichni qaytaradi yoki xato bo'lsa FALSE
Ish tartibi Tavsif
r faqat o'qish uchun ochiq fayl;
r+ o'qish va yozish uchun faylni ochish;
w faylni faqat yozish uchun oching. Agar u mavjud bo'lsa, faylning joriy tarkibi yo'q qilinadi. Joriy pozitsiya boshiga o'rnatiladi;
w+ o'qish va yozish uchun faylni oching. Agar u mavjud bo'lsa, faylning joriy tarkibi yo'q qilinadi. Joriy pozitsiya boshiga o'rnatiladi;
A faylni yozish uchun oching. Joriy pozitsiya faylning oxiriga o'rnatiladi;
a+ o'qish va yozish uchun faylni oching. Joriy pozitsiya faylning oxiriga o'rnatiladi;
b ikkilik faylni qayta ishlash. Bu belgi Windowsda ikkilik fayllar bilan ishlashda talab qilinadi.

PHP da fayllarni ochish va yopish

PHP

$fi = fopen("test.html", "w+") yoki die("Xato"); //Misollar $fi = fopen("http://www.you/test.html", "r"); $fi = fopen("http://ftp.you/test.html", "r"); //fclose($fi) ni yopish

PHP da fayllarni o'qish

PHP

//Faylni o'qing fread(int fi, int length) $str = fread($fi, 5); // Birinchi 5 ta belgini o'qing echo $str; // kursor ko'chirilganligi sababli $str = fread($fi, 12); // Keyingi 12 ta belgini o'qing echo $str; fgets(int fi[, int uzunligi]) // Fayldan satrni o'qish fgetss(int fi, int uzunligi [, string ruxsat etilgan]) // Fayldan satrni o'qish va HTML teglarini o'chirish // string ruxsat etilgan - teglar qoldirish kerak fgetc(int fi) //Fayldan belgini o'qiydi

Dastlab, Write faylning boshida mavjud ma'lumotlarni, agar mavjud bo'lsa, ustiga yozish orqali sodir bo'ladi. Shuning uchun, agar siz faylning oxiriga biror narsa yozishingiz kerak bo'lsa, mos keladiganini belgilashingiz kerak o'qish rejimi, masalan, a+.

PHP fayllarida kursorni manipulyatsiya qilish

PHP

int fseek(int fi, int ofset [, int qaerdan]) //Kursorni o'rnatish // int fi - faylga ko'rsatgich //offset - ko'chirish uchun belgilar soni. //qaerdan: //SEEK_SET - harakat fayl boshidan boshlanadi; //SEEK_CUR - harakat joriy holatdan boshlanadi; //SEEK_END - harakat fayl oxiridan boshlanadi. fseek($fi, -10, SEEK_END); //Oxirgi 10 ta belgini o'qing $s = fread($fi, 10); $pos = ftell($fi); //Joriy joylashuvni aniqlang orqaga o'tkazish($f)//kursorni tiklash bool feof($f) //fayl oxiri

PHP da fayllar (ma'lumotlar) bilan bevosita ishlash

PHP

massiv fayli(string fayl nomi) // fayl mazmunini massiv koʻrinishida olish // file_get_contents(string fayl nomi) maʼlumotlari bilan toʻgʻridan-toʻgʻri ishlashning yana bir varianti // Oʻqish (butun faylni bir qatorga olish) // fayl (dastlab qayta yozilgan) file_put_contents(string fayl nomi, aralash ma'lumotlar[,int bayrog'i]); //FILE_APPEND // Fayl oxirigacha yozing: file_put_contents("test.txt", "data", FILE_APPEND); //Agar siz massiv yozsangiz, $array = array("Men", "jonli"); file_put_contents("test.txt",$massiv); // keyin biz "Ilive" ni olamiz

php da fayllarni boshqarish

PHP

nusxa ko'chirish (satr manbai, satrning maqsadi); // Fayl nomini o'zgartirish (str oldname, str newname); // fayl nomini o'zgartirish (string fayl nomi); // Faylni o'chirish

Fayllarni PHP serveriga yuklash

//PHP.ini sozlamalari file_uploads (yon|off) // faylni yuklash upload_tmp_dirga ruxsat berish yoki taqiqlash // Yuklangan fayllar uchun vaqtinchalik papka. sukut bo'yicha vaqtinchalik papka upload_max_filesize (standart = 2 Mb) // maks. yuklash fayl hajmi post_max_size // yuborilgan shaklning umumiy hajmi (load_max_filesize dan kattaroq boʻlishi kerak) // oddiy yuklash

HTML

Serverda fayllar bilan ishlash

PHP

//Ma'lumotlarni qabul qilish $tmp = $_FILES["userfile"]["tmp_name"]; $name = $_FILES["userfile"]["name"]; //Faylni ko'chiring move_uploaded_file($tmp, nomi); move_uploaded_file($tmp, "yuklash/".name); // faylni yuklash papkasiga yo'naltirish // joriy faylga nisbatan // $_FILES massivida nima bor $_FILES["userfile"]["name"] // fayl nomi, masalan, test.html $_FILES[ "userfile"][" tmp_name"] // vaqtinchalik fayl nomi (yo'l) $_FILES["userfile"]["size"] // fayl hajmi $_FILES["userfile"]["type"] // fayl turi $ _FILES["userfile"] ["xato"] // 0 - xatolik yo'q, raqam - ha qatori fgets(resurs tutqichi [, uzunlik uzunligi])

Tutqich bilan ko'rsatilgan fayl identifikatoridan o'qilgan 1 bayt uzunlikdagi qatorni qaytaradi. O'qilgan baytlar soni uzunlikka yetganda - 1 ga, satr oxiriga (qaytish qiymatiga kiritilgan) yoki fayl oxiriga yetganda (qaysi biri birinchi bo'lsa) o'qish tugaydi. Agar uzunlik ko'rsatilmagan bo'lsa, u sukut bo'yicha 1 kilobayt yoki 1024 baytga teng.

Agar xatolik yuzaga kelsa, funktsiya qaytadi FALSE .

Eng keng tarqalgan xatolar:

Dasturchilar "C" funksiyalarining semantikasiga o'rganib qolgan fgets(), fayl oxiri (EOF) bayrog'i qanday qaytarilishidagi farqni hisobga olishi kerak.

Fayl ko'rsatkichi to'g'ri bo'lishi va funksiyalar tomonidan muvaffaqiyatli ochilgan faylga ishora qilishi kerak fopen() yoki fsockopen() .

Quyida oddiy misol keltirilgan:


Misol 1. Faylni satr bo'yicha o'qish

$handle = fopen("/tmp/inputfile.txt" , "r" );
esa (! feof ($handle )) (
$bufer = fgets($handle, 4096);
echo $bufer ;
}
fclose($dastasi);
?>

Izoh: Uzunlik parametri PHP 4.2.0 versiyasidan boshlab ixtiyoriy bo'ldi. Agar bu parametr o'tkazib yuborilsa, satr uzunligi 1024 deb qabul qilinadi. PHP 4.3 dan boshlab uzunlik parametrini o'tkazib yuborish oqimning satr oxirigacha o'qilishiga olib keladi. Agar fayldagi satrlarning ko'pchiligi 8 kilobaytdan uzun bo'lsa, skript tomonidan ishlatiladigan resurslar bo'yicha eng samarali qaror maksimal satr uzunligini belgilashdir.

Izoh: Bu funksiya PHP 4.3 dan boshlab ikkilik ma'lumotlarni to'g'ri qayta ishlay oladi. Ilgari versiyalarda bunday funktsiya yo'q edi.

fopen, fclose, feof, fgets, fgetss va fscanf funksiyalaridan foydalanish haqida

Keling, barcha imkoniyatlarni sanab o'tamiz

PHP kabi zamonaviy dasturlash tillari bilan ishlashning afzalliklaridan biri bu mavjud funksiyalar soni. PHP Perl shiorini bemalol qabul qilishi mumkin: "Biror narsa qilishning bir nechta yo'llari bor", ayniqsa fayllarni qayta ishlashda. Ammo mavjud vositalarning ko'pligi bilan, ishni bajarish uchun qaysi biri yaxshiroq degan savol tug'iladi. Albatta, bu savolga javob faylni qayta ishlashda qanday maqsadlar qo'yganingizga bog'liq, shuning uchun tilning barcha imkoniyatlarini o'rganish vaqtingizga arziydi.

An'anaviy fopen usullari

Fopen usullari, ehtimol, C va C++ dasturchilari uchun eng tanish bo'lgan usullardir, chunki agar siz ushbu dasturlash tillari bilan ishlagan bo'lsangiz, ular ko'p yoki kamroq yillar davomida sizning qo'lingizda bo'lgan vositalardir. Ushbu usullarning har qandayida faylni ochish uchun fopen, maʼlumotlarni oʻqish funksiyasi va 1-roʻyxatda koʻrsatilganidek, faylni yopish uchun fclose funksiyasidan foydalangan holda standart protseduraga amal qilasiz.

Listing 1. fgets yordamida faylni ochish va o'qish
$file_handle = fopen("mening faylim", "r"); while (!feof($file_handle)) ( $line = fgets($file_handle); echo $line; ) fclose($file_handle);

Garchi bu funktsiyalar ko'pchilik tajribali dasturchilarga tanish bo'lsa-da, ularning qanday ishlashini tahlil qilishga ijozat bering. Haqiqatda siz quyidagi amallarni bajarasiz:

  1. Faylni oching. $file_handle faylga havolani saqlaydi.
  2. Faylning oxiriga yetganingizni tekshiring.
  3. Faylni oxirigacha o'qishni davom eting, o'qigan har bir qatorni chop eting.
  4. Faylni yoping.

Shuni yodda tutgan holda, men bu erda ishlatiladigan har bir fayl funktsiyasini ko'rib chiqaman.

fopen funktsiyasi

Fopen funktsiyasi faylga ulanishni o'rnatadi. Men "aloqa o'rnatadi" deyman, chunki fopen faylni ochishdan tashqari, URL manzilini ham ochishi mumkin:

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

Dasturning ushbu qatori yuqoridagi sahifaga havola yaratadi va uni mahalliy fayl sifatida o'qishni boshlash imkonini beradi.

Eslatma: Fopenda ishlatiladigan "r" opsiyasi faylning faqat o'qish uchun ochiq ekanligini bildiradi. Faylga yozish ushbu maqolada muhokama qilinadigan masalalar doirasiga kiritilmaganligi sababli, men parametrning barcha mumkin bo'lgan qiymatlarini sanab o'tmayman. Biroq, platformalararo muvofiqlik uchun ikkilik fayllardan o'qiyotgan bo'lsangiz, "r" ni "rb" ga o'zgartirishingiz kerak. Quyida ushbu turdagi misol keltirilgan.

feof funktsiyasi

Feof buyrug'i o'qish faylning oxiriga yetganligini aniqlaydi va True yoki False qaytaradi. Ko'rsatilgan tsikl "mening faylim" faylining oxirigacha davom etadi. Eʼtibor bering, agar siz URL manzilini oʻqiyotgan boʻlsangiz feof “False” qiymatini qaytaradi va ulanish vaqti tugaydi, chunki oʻqish uchun boshqa maʼlumotlar yoʻq.

fclose funktsiyasi

Keling, 1-listning o'rtasini o'tkazib yuboramiz va oxiriga o'tamiz; fclose fopenning teskarisini bajaradi: fayl yoki URL bilan ulanishni yopadi. Ushbu funktsiyani bajarganingizdan so'ng, siz endi fayl yoki rozetkadan o'qiy olmaysiz.

fgets funktsiyasi

Listing 1da bir necha satrlarni orqaga qaytarsangiz, siz faylni qayta ishlash jarayonining mohiyatiga tushasiz: aslida faylni o'qiysiz. fgets funktsiyasi birinchi misol uchun siz tanlagan quroldir. U fayldan ma'lumotlar qatorini oladi va uni satr sifatida qaytaradi. U yerdan siz ma'lumotlarni ko'rsatishingiz yoki boshqa usulda qayta ishlashingiz mumkin. Listing 1dagi misol butun faylni chop etadi.

Agar siz ishlaydigan ma'lumotlar hajmini cheklashga qaror qilsangiz, olingan ma'lumotlar qatorining maksimal uzunligini cheklash uchun fgets argumentini qo'shishingiz mumkin. Masalan, qator uzunligini 80 belgigacha cheklash uchun quyidagi koddan foydalaning:

$string = fgets($file_handle, 81);

C tilidagi satr oxiri ko'rsatkichi "\0" ni o'ylab ko'ring va uzunlikni sizga kerak bo'lganidan bir belgidan uzunroq qilib qo'ying. Ko'rib turganingizdek, yuqoridagi misolda 81 dan foydalaniladi, sizga esa 80 ta belgi kerak. Berilgan funktsiya uchun chiziq uzunligi chegarasini belgilash kerak bo'lganda qo'shimcha belgi qo'shishni odat qiling.

fread funktsiyasi

fgets funktsiyasi faylni o'qish uchun mavjud bo'lgan ko'plab funktsiyalardan biridir. Bu eng ko'p ishlatiladigan funktsiyalardan biridir, chunki ko'p hollarda faylni satr bo'yicha qayta ishlash eng mantiqiy bo'ladi. Darhaqiqat, bir nechta boshqa xususiyatlar shunga o'xshash imkoniyatlarni taklif qiladi. Qanday bo'lmasin, chiziqli tahlil har doim ham sizga kerak bo'lgan narsa emas.

Va bu erda biz freadga kiramiz. Fread funksiyasi fgets funksiyasidan bir oz farq qiladi: u ikkilik fayllardan (ya'ni dastlab odam o'qiy oladigan matndan iborat bo'lmagan fayllardan) o'qish uchun mo'ljallangan. Ikkilik fayllar uchun "chiziqlar" tushunchasi tegishli emasligi sababli (mantiqiy ma'lumotlar tuzilmalari odatda satrlarga bo'linmaydi), o'qilishi kerak bo'lgan baytlar sonini ko'rsatishingiz kerak.

$fh = fopen("mening faylim", "rb"); $data = fread($file_handle, 4096);

Yuqoridagi misol 4096 bayt (4 KB) ma'lumotni o'qiydi. E'tibor bering, siz ko'rsatgan qiymatdan qat'i nazar, fread maksimal 8192 baytni (8 KB) o'qiydi.

Agar fayl 8 KB dan katta bo'lmasa, quyidagi dastur parchasi butun faylni bir qatorda o'qishi kerak.

$fh = fopen("mening faylim", "rb"); $ma'lumotlar = fread($fh, fayllar hajmi("mening faylim")); fclose($fh);

Agar fayl hajmi kattaroq bo'lsa, qolgan qismini o'qish uchun tsikldan foydalanishingiz kerak bo'ladi.

fscanf funktsiyasi

Satrlarni qayta ishlashga qaytsak, fscanf ham an'anaviy C fayl kutubxonasi funksiyasining vorisi hisoblanadi.Agar siz u bilan tanish bo'lmasangiz, fscanf ma'lumotlar maydonlarini fayldan o'zgaruvchilarga o'qiydi.

ro'yxat ($field1, $field2, $field3) = fscanf($fh, "%s %s %s");

Ushbu funktsiyada ishlatiladigan format satrlari PHP.net kabi ko'plab manbalarda tasvirlangan, shuning uchun men bu ma'lumotni bu erda takrorlamayman. String formatlash juda moslashuvchan ekanligini aytish kifoya. Shuni ham ta'kidlash kerakki, barcha maydonlar funktsiya tomonidan qaytarilgan o'zgaruvchiga joylashtiriladi. (Cda bu argumentlar sifatida qabul qilinadi.)

fgetss funktsiyasi

fgetss funksiyasi an'anaviy fayllarni manipulyatsiya qilish funksiyalaridan farq qiladi va sizga PHP imkoniyatlarini yaxshiroq tushunish imkonini beradi. U fgets kabi ishlaydi, lekin aniqlangan HTML yoki PHP teglarini o'chirib tashlaydi va faqat yalang'och matnni qoldiradi. Quyidagi HTML faylni olaylik.

Listing 2. Misol HTML fayl
Mening sarlavham

Agar siz "Cause there ain"t nobody for to give you hihem dard" nimani anglatishini tushunsangiz, Amerika guruhini juda ko'p tinglaysiz.

Keling, uni fgetss funksiyasi orqali o'tkazamiz.

Listing 3. fgetss dan foydalanish
$file_handle = fopen("mening faylim", "r"); while (!feof($file_handle)) ( echo = fgetss($file_handle); ) fclose($file_handle);

Bu siz chiqish sifatida olasiz:

Mening sarlavham Agar "Cause there ain"t no one for to give you hic og'riq" nimani anglatishini tushunsangiz, Amerika guruhini juda ko'p tinglaysiz.

fpassthru funktsiyasi

Fayldan ma'lumotlarni qanday o'qiganingizdan qat'i nazar, fpassthru funksiyasidan foydalangan holda standart chiqish kanali yordamida qolgan ma'lumotlarni chop etishingiz mumkin.

fpassthru($fh);

Bu funksiya maʼlumotlarni chop etadi, shuning uchun uni oʻzgaruvchiga qoʻyish shart emas.

Chiziqli bo'lmagan fayllarni qayta ishlash: fayl bo'ylab harakatlanish

Albatta, yuqorida tavsiflangan funktsiyalar faqat fayldan ketma-ket o'qish imkonini beradi. Keyinchalik murakkab fayllar faylning boshida yoki oxirida faylning turli qismlariga o'tishni talab qilishi mumkin. Buning uchun fseek funksiyasi kerak bo'ladi.

fseek($fh, 0);

Yuqoridagi misol faylning boshiga qaytadi. Agar siz faylning eng boshiga o'tishni xohlamasangiz - aytaylik, bir kilobayt kifoya qiladi - shunchaki yozing:

fseek($fh, 1024);

PHP V4.0 dan boshlab bir qancha boshqa variantlar ham mavjud. Misol uchun, agar siz joriy joyingizdan 100 bayt oldinga siljishingiz kerak bo'lsa, quyidagi koddan foydalanishingiz mumkin:

fseek($fh, 100, SEEK_CUR);

Xuddi shunday, 100 baytni orqaga qaytarish:

fseek($fh, -100, SEEK_CUR);

Agar fayl tugaguniga qadar 100 baytlik holatiga qaytmoqchi boʻlsangiz, uning oʻrniga SEEK_END dan foydalaning.

fseek($fh, -100, SEEK_END);

Yangi pozitsiyaga erishilgandan so'ng, ma'lumotlarni o'qish uchun fgets, fscanf yoki boshqa funksiyadan foydalanishingiz mumkin.

Eslatma: URL manziliga havola qiluvchi fayl deskriptorlarida fseek dan foydalana olmaysiz.

Butun faylni yozib oling

Endi biz PHP ning ba'zi noyob fayllarni qayta ishlash imkoniyatlarini ko'rib chiqishga o'tamiz: bir yoki ikki qatorda katta ma'lumotlar bloklarini qayta ishlash. Masalan, qanday qilib faylni ushlash va uning butun mazmunini Web sahifangizda ko'rsatish mumkin? Xo'sh, siz fgetlar bilan tsikldan foydalanish misolini ko'rdingiz. Ammo buni qanday osonlashtirasiz? Butun faylni bir qatorga qo'yadigan fgetcontents yordamida jarayon deyarli kulgili darajada oson.

$mening_fayl = file_get_contents("mening faylim"); echo $my_file;

Bu eng yaxshi variant bo'lmasa-da, siz ushbu buyruqni yanada qisqaroq yozishingiz mumkin:

echo file_get_contents("mening fayl nomim");

Ushbu maqola birinchi navbatda mahalliy fayllarni qayta ishlashga qaratilgan, ammo shuni ta'kidlash kerakki, siz tasvirlangan funktsiyalardan foydalangan holda boshqa veb-sahifalarni ham olishingiz, ko'rsatishingiz va tahlil qilishingiz mumkin.

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

Bu buyruq aslida bir xil:

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

Siz ushbu misollarni ko'rib, "Bu juda ko'p ish" deb o'ylayotgandirsiz. PHP ishlab chiquvchilari siz bilan rozi. Shunday qilib, yuqoridagi buyruqni quyidagicha qisqartirishingiz mumkin:

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

Readfile funksiyasi fayl yoki veb-sahifaning butun mazmunini standart chiqish buferiga chiqaradi. Odatiy bo'lib, bu buyruq muvaffaqiyatsiz bo'lganda xato xabarini ko'rsatadi. Bunday xatti-harakatdan qochish uchun (agar xohlasangiz), buyruqni sinab ko'ring:

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

Albatta, agar siz fayllar tarkibini qayta ishlashingiz kerak bo'lsa, file_get_contents tomonidan qaytarilgan bitta qator juda ko'p bo'lishi mumkin. Avval uni split() funktsiyasidan foydalanib qismlarga bo'lishni xohlashingiz mumkin.

$massiv = split("\n", file_get_contents("mening faylim"));

Lekin, agar siz uchun ishni bajaradigan to'liq mos funksiya mavjud bo'lsa, nima uchun sizga bu murakkablik kerak? PHP file() funksiyasi bu vazifani bir qadamda bajaradi: elementlari fayl satrlari boʻlgan qatorli massivni qaytaradi.

$massiv = fayl("mening faylim");

Shuni ta'kidlash kerakki, yuqoridagi ikkita misol o'rtasida biroz farq bor. Split buyrug'i yangi qatorlarni olib tashlaydi, fayl buyrug'i esa massiv satrlarini yangi qatorlar bilan tugatadi (fgets kabi).

Biroq, PHP imkoniyatlari yuqorida tavsiflanganlardan ancha yuqori. Siz bitta parse_ini_file buyrug'i bilan butun .ini fayllarini PHP uslubida tahlil qilishingiz mumkin. parse_ini_file buyrug'i ro'yxat 4da ko'rsatilganlarga o'xshash fayllar uchun qo'llaniladi.

Listing 4. Misol .ini fayli
; Sharh nomi = "Qirol Artur" topshirig'i = Muqaddas kosaning sevimli rangini izlash = Moviy Samuel Klemens = Mark Tven Kerin Jonson = Vupi Goldberg

Quyidagi buyruqlar faylni massiv sifatida ifodalaydi va keyin massivni chop etadi:

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

Natijada quyidagi chiqish bo'ladi:

Listing 5. Chiqish
Massiv ( => Qirol Artur => Muqaddas Grailni izlash => Moviy => Mark Tven => Vupi Goldberg)

Albatta, bu buyruq bo'limlarni birlashtirganini sezishingiz mumkin. Bu standart amaldir, lekin uni parse_ini_file ikkinchi argumenti yordamida osongina sozlashingiz mumkin: process_sections, bu mantiqiy o'zgaruvchidir. Process_sections ni True ga o'rnating.

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

Va sizning chiqishingiz quyidagicha ko'rinadi:

Listing 6. Chiqish
Massiv ( => Array ( => Qirol Artur => Muqaddas Grailni izlash => Moviy) => Massiv ( => Mark Tven => Vupi Goldberg))

PHP ma'lumotlarni oson tahlil qilinadigan ko'p o'lchovli massivga joylashtiradi.

Ammo bu PHP da fayllarni qayta ishlash haqida gap ketganda, aysbergning faqat uchi. Tidy_parse_file va xml_parse kabi murakkabroq funksiyalar mos ravishda HTML va XML hujjatlarini tahlil qilishga yordam beradi. Ushbu funktsiyalar qanday ishlashi haqida batafsil ma'lumot olish uchun bo'limga qarang. Agar siz ushbu fayl turlari bilan ishlamoqchi bo'lsangiz, bularning ikkalasini ham ko'rib chiqishga arziydi, lekin barcha mumkin bo'lgan fayl turlarini ko'rib chiqish o'rniga, ushbu maqolaning mazmunini diqqat bilan ko'rib chiqishni xohlashingiz mumkin, unda bir nechta yaxshi umumiy qoidalar mavjud. Men hozirgacha tasvirlab bergan funktsiyalar bilan ishlash.

Yaxshi dasturlash uslubi

Hech qachon dasturingizdagi hamma narsa mo'ljallangandek ishlaydi deb o'ylamang. Masalan: agar siz izlayotgan fayl ko'chirilgan bo'lsa-chi? Agar ruxsatnomaning oʻzgarishi fayl mazmunini oʻqiy olmasligingizga sabab boʻlsa-chi? Siz faylning mavjudligini va uni o'qish huquqlarini file_exists va is_readable usullari yordamida oldindan tekshirishingiz mumkin.

Listing 7. file_exists va is_readable dan foydalanish
$filename = "mening faylim"; agar (fayl_mavjud($fayl) && o'qilishi mumkin ($fayl nomi)) ( $fh = fopen($filename, "r"); # fclose($fh); ) qayta ishlanmoqda

Biroq, amalda dasturning ushbu qismi sizning vazifangiz uchun ortiqcha bo'lishi mumkin. Fopen tomonidan qaytarilgan qiymatlarni qayta ishlash osonroq va aniqroq.

agar ($fh = fopen($fayl nomi, "r")) ( # fclose($fh); ) qayta ishlanmoqda

Fopen, agar u muvaffaqiyatsiz bo'lsa, False qiymatini qaytargani uchun, bu fayl faqat faylni ochish mumkin bo'lsa, qayta ishlanishini ta'minlaydi. Albatta, agar fayl mavjud bo'lmasa yoki o'qib bo'lmasa, qaytarish qiymati salbiy bo'lishini kutasiz. Shuning uchun, bunday tekshiruv barcha mumkin bo'lgan muammolar tushadigan tuzoqdir. Shu bilan bir qatorda, agar faylni ochib bo'lmasa, dasturdan chiqishingiz yoki xato xabarini ko'rsatishingiz mumkin.

Fopen kabi file_get_contents, file va readfile funksiyalari faylni ochish yoki qayta ishlash imkoni bo'lmasa False qaytaradi. Agar xatolik yuzaga kelsa, fgets, fgetss, fread, fscanf va fclose funksiyalari ham False ni qaytaradi. Albatta, fclose dan tashqari, siz ular qaytaradigan natijalarni allaqachon qayta ishlagansiz. fclose ga kelsak, agar fayl tutqichi to'g'ri yopilmasa, ko'p narsa qilish mumkin emas, shuning uchun fclose ning qaytish qiymatini tekshirish odatda ortiqcha bo'ladi.

Tanlov sizniki

PHP-da fayllarni o'qish va tahlil qilishning samarali usullari mavjud. Fread kabi klassik funktsiyalar sizga ko'pincha ishonchli xizmat qilishi mumkin yoki ishni bajarish uchun sizga kerak bo'lgan o'qish faylining soddaligi sizni ko'proq jalb qilishi mumkin. Tanlov, albatta, nimaga erishmoqchi ekanligingizga bog'liq.

Agar siz katta hajmdagi ma'lumotlarni qayta ishlayotgan bo'lsangiz, fscanf faylni keyingi split va sprintf buyruqlari bilan birgalikda ishlatishdan ko'ra foydaliroq va samaraliroq topasiz. Agar siz shunchaki kichik o'zgarishlar bilan katta hajmdagi matnni ko'rsatayotgan bo'lsangiz, fayl , file_get_contents yoki readfile funksiyalaridan foydalanish mantiqiyroq bo'lishi mumkin. Ushbu yechim, ehtimol, PHP-ni keshlash uchun ishlatganda yoki hatto vaqtinchalik proksi-serverni yaratishda to'g'ri bo'ladi.

PHP fayllar bilan ishlash uchun ko'plab vositalarni taqdim etadi. Ularning har birini yaxshiroq bilib oling va qaysi vositalar siz ustida ishlayotgan loyiha uchun eng yaxshi ekanligini bilib oling. Sizga dasturiy vositalarning keng tanlovi taklif etiladi, ulardan eng samarali foydalaning va PHP yordamida fayllaringizga ishlov berishdan zavqlaning.

PHP da siz tez-tez fayl yaratish bilan shug'ullanishingiz kerak ... bu juda oddiy: diskda fayl yo'q, kod ishga tushirildi va fayl paydo bo'ldi, keyin siz ushbu faylni boshqa o'zgaruvchiga yoki hatto istalgan sahifaga o'qishingiz mumkin. Internet va keyin u erda biror narsa yozing ... lekin buning uchun siz maxsus funktsiyalarni bilishingiz kerak ... bu haqda ushbu maqolada batafsilroq ...

PHP da bajariladigan skriptda fayl yaratish uchun bir nechta funksiyalarni belgilash kifoya:

Keling, bir misolni ko'rib chiqaylik:

$text = "Faylga yozish uchun qandaydir matn";
$fp = fopen("file.txt", "w");
fwrite($fp, $matn);
fclose($fp);
?>

Bu erda siz bilishingiz kerak:

fopen()- funksiya faylni o'qish yoki yozish va tushuntirishlar uchun ochadi;

Ushbu tushuntirish (fopen funktsiyasining rejim parametri) juda muhim:

  • "r" - php da faylni oching Faqat o'qish uchun. Kursor boshida joylashgan.
  • "r+" - php da faylni oching o'qish va yozish uchun. Kursor boshida joylashgan. !!! - ushbu ikki rejimda r va r+ bilan fayllar allaqachon yaratilgan bo'lishi kerak (aks holda xato paydo bo'ladi Ogohlantirish: fopen(file.txt): oqimni ochib bo'lmadi: Bunday fayl yoki katalog yo'q ...), va biz faqat o'qiymiz yoki qo'shish imkoniyati mavjud.
  • "w" - fayl FAQAT yozish uchun ochiladi. Fayl uzunligi nolga qisqartiriladi - ya'ni ustiga yoziladi. Kerakli narsa yoziladi va Kursor boshida joylashtiriladi.
  • "w+" - yozish va o'qish uchun faylni ochadi! Qolganlari "w" rejimida bo'lgani kabi. !!! - bu ikki rejimda - agar fayl yaratilmagan bo'lsa - UNING YARATISHGA URILADI!
  • "a" - faylni FAQAT yozish uchun oching. "w" dan farqli o'laroq, bu parametr fayl tarkibini qayta yozmaydi, balki kursorni satr oxiriga qo'yadi va biz qo'shmoqchi bo'lgan tarkibni oxiriga qo'shib qo'yadi.
  • "a+" - yozish va o'qish uchun faylni oching.

yozing($fp, $text) - PHP da faylga yozish funksiyasi - ya'ni $text o'zgaruvchisida bo'lgan narsa $fp o'zgaruvchisidagi faylga yoziladi;

fyopish($fp) - biz $fp o'zgaruvchisiga yozgan faylni yopish funksiyasi;

Endi siz php-da osongina fayllarni to'g'ri yaratishingiz, ularni o'qish va tahrirlash uchun ochishingiz mumkin.

Ochiq fayl bilan ishlash uchun foydali PHP qo'shimchalari va funktsiyalari:

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

bu erda shart bajariladi - "fayl oxirigacha buni bajaring" while(!feof($fp))

1. Funktsiya fgets($fp, 99) - barcha tarkibni 99 bayt va undan ortiq bo'limlarga bo'lish imkonini beradi, buni aniqroq ko'rish uchun biz teg joylashtiramiz.

Bu string funktsiyasi fgets(resurs tutqichi [, int length]) sukut bo'yicha uzunlik parametri sifatida 1024 baytni (1 kilobayt) qabul qiladi, agar ko'rsatilmagan bo'lsa, shunday bo'ladi. Ushbu parametr PHP 4.2.0 dan boshlab ixtiyoriy (xato bo'lsa, FALSE qaytaradi)

Faylni ochish, yozish va yaratish uchun qo'shimcha funktsiyalar

Funktsiya - int o'qish fayli(string fayl nomi [, bool use_include_path [, resurs konteksti]]) - faylni butun sifatida o'qing.

Faylni o'qiydi va tarkibini chiqish buferiga yozadi. Va chiqish bayt sonini qaytaradi. Xato bo'lsa, it ishlatilmasa, u qaytadi - @readfile.

Shunga o'xshash narsa bo'ladi:

So'z oxirida teg mavjud
.

b. Funktsiya - massiv fayl(fayl nomi [, int use_include_path [, resurs konteksti]]), oʻqish fayli funksiyasi bilan bir xil ishlaydi, bitta istisnodan tashqari, u fayl tarkibini massivga qoʻshadi:

Shu tarzda siz Internetdagi istalgan sahifalarni o'qishingiz mumkin: $lines = file("http://site/"); va foreach funksiyasidan foydalanib massiv bo'ylab takrorlash;

3a. string funktsiyasi file_get_contents(string fayl nomi [, bool use_include_path [, resurs konteksti [, int ofset [, int maxlen]]]] - tarkibni bitta satr sifatida olish imkonini beradi.

Bu faylni oʻqish uchun universal PHP funksiyasi boʻlib, fayl funksiyasiga oʻxshaydi, faqat tarkibi massiv emas, satr sifatida qaytariladi va siz shartlarni belgilashingiz mumkin - qaysi baytdan boshlash - ofset va qaerda tugatish - maxlen. Muvaffaqiyatsiz bo'lsa, u FALSE qiymatini qaytaradi.

Muhim!!!- bu holda funksiya birdaniga 3 ni almashtiradi: fopen(), fread() va fclose() va shu tariqa belgidan xalos bo'ladi.

3b. int funktsiyasi file_put_contents(string fayl nomi, aralash ma'lumotlar [, int bayroqlari [, resurs konteksti]]) - fopen(), fwrite() va fclose() funksiyalariga ketma-ket qo'ng'iroqlar bilan bir xil - yozilgan baytlar sonini qaytaradi.

(PHP 4 >= 4.3.0, PHP 5, PHP 7)

file_get_contents - Fayl mazmunini satrga o'qiydi

Tavsif

String file_get_contents (string $filename [, bool $use_include_path = noto'g'ri [, resurs $ kontekst [, int $ofset = -1 [, int $maxlen ]]]])

Bu funksiya funksiyaga o'xshaydi fayl() yagona farq shundaki file_get_contents() belgilangan ofsetdan boshlab va makslen baytgacha bo'lgan satrdagi fayl mazmunini qaytaradi. Muvaffaqiyatsiz bo'lgan taqdirda, file_get_contents() qaytadi FALSE.

Funktsiyadan foydalanish file_get_contents() Agar siz faylning butun mazmunini olishingiz kerak bo'lsa, bu afzalroqdir, chunki bu funktsiya operatsion tizimingiz tomonidan qo'llab-quvvatlansa, unumdorlikni oshirish uchun fayldan xotiraga xaritalash texnikasidan foydalanadi.

Izoh:

Agar siz bo'sh joy kabi maxsus belgilarni o'z ichiga olgan URI-ni ochayotgan bo'lsangiz, URI-ni foydalanib kodlashingiz kerak urlencode().

Parametrlar ro'yxati

O'qilayotgan fayl nomi.

Use_include_path

Izoh:

PHP 5 dan boshlab siz doimiydan foydalanishingiz mumkin FILE_USE_INCLUDE_PATH qo'shish yo'lidagi faylni qidirish uchun.

kontekst

Funktsiya yordamida yaratilgan to'g'ri kontekst resursi stream_context_create(). Agar maxsus kontekstdan foydalanishning hojati bo'lmasa, qiymatni o'tkazish orqali ushbu parametrni o'tkazib yuborishingiz mumkin NULL.

Asl oqimni o'qish boshlanadigan ofset.

Masofaviy fayllar bilan ishlashda ofset qidiruvi qo'llab-quvvatlanmaydi. Mahalliy bo'lmagan fayllarda ofsetni topishga urinish kichik ofsetlar uchun ishlashi mumkin, ammo natijani oldindan aytib bo'lmaydi, chunki u buferlangan oqimda ishlaydi.

O'qilgan ma'lumotlarning maksimal hajmi. Odatiy bo'lib, o'qish faylning oxirigacha amalga oshiriladi. Esda tutingki, bu sozlama filtrli oqimlarga ham tegishli.

Qaytariladigan qiymatlar

Funktsiya o'qilgan ma'lumotlarni qaytaradi yoki FALSE xato bo'lgan taqdirda.

Diqqat

Bu funktsiya boolean sifatida qaytishi mumkin FALSE, va mantiqiy bo'lmagan qiymatga uzatiladi FALSE. Qo'shimcha ma'lumot olish uchun Mantiqiy turdagi bo'limga qarang. Bu funksiya tomonidan qaytarilgan qiymatni tekshirish uchun === operatoridan foydalaning.

Xatolar

Darajali xatolik hosil bo'ladi E_OGOHLANTIRISH, agar fayl nomi parametrini topib bo'lmasa, maxlength parametri noldan kichik bo'lsa yoki oqimdagi ofset ofsetida qidirish muvaffaqiyatsiz tugadi.

Misollar

1-misol Veb-sayt bosh sahifasining manba kodini oling va ko'rsating

$homepage = file_get_contents("http://www.example.com/");
echo $homepage ;
?>

2-misol, include_path-da fayllarni topish

// <= PHP 5
$file = file_get_contents("./people.txt", true );
// > PHP 5
$file = file_get_contents("./people.txt" , FILE_USE_INCLUDE_PATH );
?>

3-misol Faylning bo'limini o'qish

// 21-belgidan boshlab 14 belgini o'qing
$section = file_get_contents("./people.txt" , NULL , NULL , 20 , 14 );
var_dump($bo'lim);
?>

Ushbu misolni ishga tushirish natijasi shunday bo'ladi:

string(14) "lle Bjori Ro"

4-misol Oqimli kontekstlardan foydalanish

// Mavzu yarating
$opts = massiv(
"http" =>massiv(
"metod" => "GET" ,
"header" => "Qabul qilish tili: en\r\n" .
"Cookie: foo=bar\r\n"
);

$kontekst = stream_context_create ($opts);

// Yuqoridagi HTTP sarlavhalari yordamida faylni oching
$file = file_get_contents ("http://www.example.com/" , noto'g'ri , $context );
?>

Close_notify. Maʼlumotlarning oxiriga yetganingizda PHP buni “SSL: Fatal Protocol Error” deb xabar qiladi. Buni hal qilish uchun siz error_reportingni E_WARNINGni istisno qiladigan darajaga o'rnatishingiz kerak. PHP 4.3.7 va undan yuqori versiyalari o‘ram yordamida oqimni ochishda server tomonida muammoli IIS mavjudligini aniqlashi mumkin. https:// va ogohlantirishni ko'rsatmaydi. Agar foydalanayotgan bo'lsangiz fsockopen() yaratish uchun ssl:// socket, bu ogohlantirishni aniqlash va bostirish sizning javobgarligingizdir.