Php kā izrunāt. Darbs ar failiem php: atvēršana, rakstīšana, lasīšana. Tradicionālās fopen metodes

Pēdējā atjaunināšana: 1.11.2015

Tāpat kā lielākā daļa programmēšanas valodu, PHP atbalsta darbu ar failiem, kas ir viens no informācijas glabāšanas veidiem.

Failu lasīšana un rakstīšana

Failu atvēršana un aizvēršana

Lai atvērtu failus PHP, ir definēta funkcija fopen (). Tam ir šāda definīcija: resurss fopen(string $faila nosaukums, virkne $režīms) . Pirmais parametrs $filename apzīmē ceļu uz failu, bet otrais ir atvēršanas režīms. Atkarībā no atvēršanas mērķa un faila veida šim parametram var būt šādas vērtības:

    "r": fails tiek atvērts tikai lasāms. Ja fails neeksistē, atgriež false

    "r+": fails tiek atvērts tikai lasāms un rakstāms. Ja fails neeksistē, atgriež false

    "w": fails tiek atvērts rakstīšanai. Ja šāds fails jau pastāv, tad tas tiek pārrakstīts, ja nē, tad tiek izveidots.

    "w+": fails tiek atvērts rakstīšanai un lasāms. Ja šāds fails jau pastāv, tad tas tiek pārrakstīts, ja nē, tad tiek izveidots.

    "a": fails tiek atvērts rakstīšanai. Ja šāds fails jau pastāv, tad dati tiek ierakstīti faila beigās, un vecie dati paliek. Ja fails neeksistē, tas tiek izveidots

    "a+": fails tiek atvērts lasīšanai un rakstīšanai. Ja fails jau pastāv, dati tiek pievienoti faila beigās. Ja fails neeksistē, tas tiek izveidots

Fopen funkcijas izvade būs faila deskriptors. Šis rokturis tiek izmantots faila operācijām un faila aizvēršanai.

Pēc darba pabeigšanas fails ir jāaizver, izmantojot fclose() funkciju, kas kā parametru ņem faila deskriptoru. Piemēram, atvērsim un aizvērsim failu:

$fd = fopen("form.php", "r") vai die("nevarēja atvērt failu"); fclose($fd);

Konstrukcija or die ("kļūdas teksts") ļauj skriptam pārtraukt darbību un parādīt kļūdas ziņojumu, ja funkcija fopen nevarēja atvērt failu.

Faila lasīšana

Faila lasīšanai varat izmantot vairākas funkcijas. Lasīšanai pa rindiņām tiek izmantota funkcija fgets(), kas saņem faila deskriptoru un atgriež vienu nolasītu rindiņu. Izejam cauri visam failam rindiņai pa rindiņai:

Katru reizi, kad tiek izsaukts fgets(), PHP novietos rādītāju lasītās rindas beigās. Lai izsekotu faila beigām, tiek izmantota funkcija feof(), kas atgriež patieso vērtību, kad fails ir pabeigts. Un līdz ir sasniegts faila beigas, mēs varam izmantot fgets() funkciju.

Visa faila lasīšana

Šajā gadījumā mums nav skaidri jāatver fails, jāiegūst rokturis un pēc tam fails jāaizver.

Bloķēt lasīšanu

Varat arī veikt lasīšanu pa blokiem, tas ir, nolasīt noteiktu skaitu baitu no faila, izmantojot funkciju fread():

Funkcijai fread () ir nepieciešami divi parametri: lasāmais faila rokturis un lasāmo baitu skaits. Kad bloks ir nolasīts, faila rādītājs pārvietojas uz šī bloka beigām. Un arī izmantojot funkciju feof () jūs varat izsekot faila pabeigšanai.

Uzrakstiet failu

Lai rakstītu failu, izmantojiet funkciju fwrite(), kas failā ieraksta šādu rindiņu:

Cita funkcija fputs () darbojas līdzīgi:

Darbs ar faila rādītāju

Atverot failu lasīšanai vai rakstīšanai "w" režīmā, faila rādītājs tiek novietots sākumā. Lasot datus, PHP pārvieto rādītāju failā uz nolasītā datu bloka beigām. Tomēr mēs varam arī manuāli manipulēt ar rādītāju failā un iestatīt to uz patvaļīgu atrašanās vietu. Lai to izdarītu, jums ir jāizmanto funkcija fseek, kam ir šāda formāla definīcija:

Int fseek (resurss $handle , int $offset [, int $whence = SEEK_SET ])

Parametrs $handle apzīmē faila turi. Parametrs $offset ir nobīde baitos attiecībā pret faila sākumu, no kura sāksies lasīšana/rakstīšana. Trešais izvēles parametrs norāda, kā tiek iestatīta nobīde. Tam var būt trīs vērtības:

    SEEK_SET: noklusējuma vērtība, iestata nobīdi nobīdes baitos attiecībā pret faila sākumu

    SEEK_CUR: iestata nobīdi nobīdes baitos attiecībā pret pašreizējās pozīcijas sākumu failā

    SEEK_END : iestata nobīdi, lai nobīdītu baitus no faila beigām

Ja rādītājs ir veiksmīgi instalēts, funkcija fseek() atgriež 0, un, ja rādītājs ir neveiksmīgs, tā atgriež -1.

Funkcijas izmantošanas piemērs:

$fd = fopen("hello.txt", "w+") vai die("nevarēja atvērt failu"); $str = "Sveika pasaule!"; // rinda, lai rakstītu fwrite($fd, $str); // ieraksta rindiņu sākuma fseek($fd, 0); // novieto faila rādītāju sākumā fwrite($fd, "Oink"); // ierakstiet rindiņu sākumā fseek($fd, 0, SEEK_END); // novieto rādītāju beigās fwrite($fd, $str); // beigās ierakstiet vēl vienu rindiņu fclose($fd);

Par funkciju fopen, fclose, feof, fgets, fgetss un fscanf izmantošanu

Uzskaitīsim visas iespējas

Viena no priekšrocībām, strādājot ar modernām programmēšanas valodām, piemēram, PHP, ir pieejamo funkciju skaits. PHP varētu viegli pieņemt Perl moto: "Ir vairāk nekā viens veids, kā kaut ko darīt", it īpaši, ja runa ir par failu apstrādi. Taču, ņemot vērā pieejamo rīku pārpilnību, rodas jautājums, kurš no tiem ir vislabākais darba veikšanai. Protams, atbilde uz šo jautājumu patiešām ir atkarīga no tā, kādi ir jūsu mērķi, apstrādājot failu, tāpēc visu valodas iespēju apguve ir jūsu laika vērta.

Tradicionālās fopen metodes

Fopen metodes, iespējams, ir vispazīstamākās C un C++ programmētājiem agrāk, jo tie ir vairāk vai mazāk rīki, kas ir bijuši jūsu rokai jau gadiem ilgi, ja esat strādājis ar šīm programmēšanas valodām. Jebkurai no šīm metodēm izpildiet standarta procedūru, izmantojot fopen, lai atvērtu failu, funkciju, lai nolasītu datus, un pēc tam fclose, lai aizvērtu failu, kā parādīts 1. sarakstā.

Saraksts 1. Faila atvēršana un lasīšana, izmantojot fgets
$ faila_rokturis = fopen ("mans fails", "r"); while (!feof($file_handle)) ( $line = fgets($faila_handle); echo $line; ) fclose($faila_rokturis);

Lai gan šīs funkcijas ir pazīstamas lielākajai daļai pieredzējušu programmētāju, ļaujiet man analizēt, kā tās darbojas. Patiesībā jūs veicat šīs darbības:

  1. Atveriet failu. $file_handle saglabā saiti uz pašu failu.
  2. Pārbaudiet, vai esat sasniedzis faila beigas.
  3. Turpiniet lasīt failu, līdz esat sasniedzis beigas, izdrukājot katru lasīto rindiņu.
  4. Aizveriet failu.

Paturot to prātā, es apskatīšu katru šeit izmantoto faila funkciju.

fopen funkcija

Funkcija fopen izveido savienojumu ar failu. Es saku "izveido savienojumu", jo papildus faila atvēršanai fopen var atvērt arī URL:

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

Šī programmas rinda izveido saiti uz iepriekš minēto lapu un ļauj sākt to lasīt kā vietējo failu.

Piezīme: Opcija "r", ko izmanto fopen, norāda, ka fails ir atvērts tikai lasāms. Tā kā rakstīšana failā nav iekļauta šajā rakstā apskatīto problēmu lokā, es neuzskaitīšu visas iespējamās parametra vērtības. Tomēr jums ir jāmaina "r" uz "rb", ja lasāt no binārajiem failiem, lai nodrošinātu saderību starp platformām. Zemāk ir šāda veida piemērs.

feof funkcija

Komanda feof nosaka, vai lasīšana ir sasniegusi faila beigas, un atgriež True vai False. Parādītā cilpa turpinās līdz faila "myfile" beigām. Ņemiet vērā, ka feof arī atgriež False, ja lasāt URL un savienojuma noildze beidzas, jo nav vairāk datu, ko nolasīt.

Funkcija fclose

Izlaidīsim 1. saraksta vidu un dosimies līdz beigām; fclose darbojas pretēji fopen: tas aizver savienojumu ar failu vai URL. Pēc šīs funkcijas izpildes jūs vairs nevarēsit lasīt no faila vai ligzdas.

fgets funkcija

Atgriežoties dažas rindiņas 1. sarakstā, jūs nokļūstat faila apstrādes procesa būtībā: faktiski tiek lasīts fails. Fgets funkcija ir jūsu izvēlētais ierocis pirmajā piemērā. Tas paņem datu rindu no faila un atgriež to kā virkni. No turienes jūs varat parādīt datus vai citādi tos apstrādāt. Piemērā 1. sarakstā tiek izdrukāts viss fails.

Ja nolemjat ierobežot datu gabala lielumu, ar kuru strādājat, varat pievienot argumentu fgets, lai ierobežotu tvertās datu virknes maksimālo garumu. Piemēram, izmantojiet šo kodu, lai ierobežotu rindas garumu līdz 80 rakstzīmēm:

$virkne = fgets($faila_rokturis, 81);

Padomājiet par “\0”, C rindas beigu indikatoru, un iestatiet garumu uz vienu rakstzīmi garāku, nekā jums faktiski nepieciešams. Kā redzat, iepriekš minētajā piemērā ir izmantota 81 rakstzīme, bet jums ir nepieciešamas 80 rakstzīmes. Izveidojiet ieradumu pievienot papildu rakstzīmi ikreiz, kad ir jāiestata rindiņas garuma ierobežojums noteiktai funkcijai.

fread funkcija

Fgets funkcija ir tikai viena no daudzajām faila lasīšanai pieejamajām funkcijām. Šī ir viena no visbiežāk izmantotajām funkcijām, jo ​​vairumā gadījumu faila apstrāde pēc rindas ir vissaprātīgākā. Faktiski vairākas citas funkcijas piedāvā līdzīgas iespējas. Lai kā arī būtu, rindu pa rindiņai analīze ne vienmēr ir tas, kas jums nepieciešams.

Un šeit mēs piekļūstam Fread. Funkcijai fread ir nedaudz atšķirīgs mērķis nekā fgets: tā ir paredzēta lasīšanai no binārajiem failiem (tas ir, failiem, kas sākotnēji nesastāv no cilvēkiem lasāma teksta). Tā kā jēdziens "rindas" neattiecas uz binārajiem failiem (loģiskās datu struktūras parasti netiek sadalītas rindās), jums ir jānorāda lasāmo baitu skaits.

$ fh = fopen ("mans fails", "rb"); $dati = fread($faila_rokturis, 4096);

Iepriekš minētajā piemērā ir nolasīti 4096 baiti (4 KB) datu. Ņemiet vērā, ka neatkarīgi no norādītās vērtības fread nolasīs ne vairāk kā 8192 baitus (8 KB).

Pieņemot, ka fails nav lielāks par 8 KB, tālāk norādītajam programmas fragmentam ir jānolasa viss fails vienā rindā.

$ fh = fopen ("mans fails", "rb"); $dati = fread($fh, faila lielums("mans fails")); fclose($fh);

Ja faila lielums ir lielāks, jums būs jāizmanto cilpa, lai lasītu pārējo.

fscanf funkcija

Atgriežoties pie virkņu apstrādes, fscanf ir arī tradicionālās C failu bibliotēkas funkcijas pēctece. Ja jūs to nepārzināt, fscanf nolasa datu laukus mainīgajos no faila.

saraksts ($field1, $field2, $field3) = fscanf($fh, "%s %s %s");

Šajā funkcijā izmantotās formāta virknes ir aprakstītas daudzos avotos, piemēram, PHP.net, tāpēc es neatkārtošu šo informāciju šeit. Pietiek pateikt, ka virknes formatējums ir ļoti elastīgs. Jāpiemin arī tas, ka visi lauki tiek ievietoti funkcijas atgrieztajā mainīgajā. (C valodā tie tiks nodoti kā argumenti.)

fgetss funkcija

Fgetss funkcija atšķiras no tradicionālajām failu manipulācijas funkcijām un sniedz jums labāku izpratni par PHP iespējām. Tas darbojas kā fgets, taču atmet visus atklātos HTML vai PHP tagus, atstājot tikai tukšu tekstu. Ņemsim tālāk norādīto HTML failu.

Saraksts 2. HTML faila piemērs
Mans tituls

Ja saproti, ko nozīmē “Cause there ain”no one for do you no pain”, tad tu pārāk daudz klausies grupas America.



Izlaidīsim to caur fgetss funkciju.

Listing 3. Izmantojot fgetss
$ faila_rokturis = fopen ("mans fails", "r"); while (!feof($faila_rokturis)) ( echo = fgetss($faila_handle); ) fclose($faila_rokturis);

Tas ir tas, ko jūs saņemsit kā izvadi:

Mans virsraksts Ja tu saproti, ko nozīmē "Cause there ain"no one for give you no pain", tad jūs pārāk daudz klausāties grupu America

fpassthru funkcija

Neatkarīgi no tā, kā nolasāt datus no faila, atlikušos datus varat izdrukāt, izmantojot standarta izvades kanālu, izmantojot funkciju fpassthru.

fpassthru($fh);

Šī funkcija izdrukā datus, lai jums tie nebūtu jāievieto mainīgajā.

Nelineāra failu apstrāde: pārvietošanās pa failu

Protams, iepriekš aprakstītās funkcijas ļauj tikai secīgi lasīt no faila. Sarežģītākiem failiem var būt nepieciešams pārvietot uz dažādām faila daļām faila sākumā vai beigās. Lai to izdarītu, ir nepieciešama funkcija fseek.

fseek($fh, 0);

Iepriekš minētais piemērs attiecas uz faila sākumu. Ja nevēlaties pāriet uz pašu faila sākumu - teiksim, pietiek ar vienu kilobaitu - vienkārši ierakstiet:

fseek ($fh, 1024);

Sākot ar PHP V4.0, ir pieejamas arī vairākas citas iespējas. Piemēram, ja jums ir jāpāriet uz priekšu par 100 baitiem no pašreizējās pozīcijas, varat izmantot šādu kodu:

fseek($fh, 100, SEEK_CUR);

Tāpat pārvietošanu atpakaļ par 100 baitiem veic:

fseek($fh, -100, SEEK_CUR);

Ja vēlaties atgriezties 100 baitu pozīcijā pirms faila beigām, tā vietā izmantojiet SEEK_END.

fseek($fh, -100, SEEK_END);

Kad jaunā pozīcija ir sasniegta, datu nolasīšanai varat izmantot fgets, fscanf vai citu funkciju.

Piezīme: jūs nevarat izmantot fseek failu deskriptoros, kas atsaucas uz URL.

Uzņemiet visu failu

Tagad mēs pārejam pie dažām PHP unikālajām failu apstrādes iespējām: lielu datu bloku apstrādi vienā vai divās rindās. Piemēram, kā jūs varat satvert failu un parādīt visu tā saturu savā tīmekļa lapā? Nu, jūs redzējāt piemēru, kā izmantot cilpu ar fgets. Bet kā jūs varat to atvieglot? Process ir gandrīz smieklīgi vienkāršs, izmantojot fgetcontents, kas visu failu ievieto vienā rindā.

$mans_fails = fails_get_contents("mans faila nosaukums"); atbalss $mans_fails;

Lai gan tas nav labākais risinājums, varat rakstīt šo komandu vēl īsāk:

echo file_get_contents("mans faila nosaukums");

Šis raksts galvenokārt ir vērsts uz vietējo failu apstrādi, tomēr ir vērts atzīmēt, ka varat arī tvert, parādīt un parsēt citas Web lapas, izmantojot aprakstītās funkcijas.

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

Šī komanda faktiski ir tāda pati kā:

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

Jūs, iespējams, skatāties šos piemērus un domājat: "Tas ir daudz darba." PHP izstrādātāji jums piekrīt. Tātad jūs varat saīsināt iepriekš minēto komandu līdz:

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

Funkcija Readfile izvada visu faila vai Web lapas saturu noklusējuma izvades buferī. Pēc noklusējuma šī komanda parāda kļūdas ziņojumu, ja tā neizdodas. Lai izvairītos no šādas darbības (ja vēlaties), izmēģiniet komandu:

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

Protams, ja jums ir nepieciešams apstrādāt failu saturu, tad viena rinda, ko atgriež file_get_contents, iespējams, ir pārāk daudz. Iespējams, vēlēsities to vispirms sadalīt gabalos, izmantojot funkciju split ().

$masīvs = split("\n", file_get_contents("mans fails"));

Bet kāpēc jums ir vajadzīga visa šī sarežģītība, ja ir ideāli piemērota funkcija, kas paveiks šo darbu jūsu vietā? Funkcija PHP file() paveic šo uzdevumu vienā solī: tā atgriež virknes masīvu, kuras elementi ir faila rindas.

$masīvs = fails("mans fails");

Jāatzīmē, ka starp diviem iepriekš minētajiem piemēriem ir neliela atšķirība. Komanda sadalīšana noņem jaunās rindiņas, savukārt faila komanda pabeidz masīva rindas ar jaunām rindiņām (tāpat kā fgets).

Tomēr PHP iespējas pārsniedz iepriekš aprakstītās. Visus .ini failus var parsēt PHP stilā, izmantojot tikai vienu komandu parse_ini_file. Komanda parse_ini_file attiecas uz failiem, kas ir līdzīgi tiem, kas parādīti 4. sarakstā.

4. saraksts. Ini faila piemērs
; Komentāra nosaukums = "Karalis Arturs" uzdevums = meklēt Svētā Grāla mīļāko krāsu = Zils Samuels Klemenss = Marks Tvens Kerīna Džonsone = Vūpija Goldberga

Šīs komandas attēlo failu kā masīvu un pēc tam izdrukā masīvu:

$fails_masīvs = parse_ini_file("holy_grail.ini"); print_r $ failu_masīvs;

Rezultāts būs šāda izvade:

Uzskaitījums 5. Izvade
Masīvs (=> Karalis Artūrs => Meklēt Svēto Grālu => Zils => Marks Tvens => Vūpi Goldberga)

Protams, jūs varat pamanīt, ka šī komanda ir apvienojusi sadaļas. Šī ir noklusējuma darbība, taču to var viegli pielāgot, izmantojot parse_ini_file otro argumentu: process_sections, kas ir Būla mainīgais. Iestatiet process_sections vērtību True.

$file_array = parse_ini_file("holy_grail.ini", true); print_r $ failu_masīvs;

Un jūsu izvade izskatīsies šādi:

Uzskaitījums 6. Izvade
Masīvs ( => Masīvs ( => Karalis Artūrs => meklēt Svēto Grālu => Zils) => Array ( => Marks Tvens => Vūpi Goldberga))

PHP ievieto datus viegli parsējamā daudzdimensiju masīvā.

Bet tas ir tikai aisberga redzamā daļa, kad runa ir par failu apstrādi PHP. Sarežģītākas funkcijas, piemēram, tidy_parse_file un xml_parse, var palīdzēt parsēt attiecīgi HTML un XML dokumentus. Sīkāku informāciju par šo funkciju darbību skatiet sadaļā. Abus šos ir vērts apsvērt, ja strādājat ar šiem failu tipiem, taču tā vietā, lai apskatītu visus iespējamos failu tipus, iespējams, vēlēsities sīkāk izpētīt šī raksta saturu, kurā ir daži labi vispārīgi noteikumi strādājot ar līdz šim aprakstītajām funkcijām.

Labs programmēšanas stils

Nekad neuzņemieties, ka viss jūsu programmā darbosies kā paredzēts. Piemēram: ko darīt, ja jūsu meklētais fails ir pārvietots? Ko darīt, ja atļaujas maiņa izraisa to, ka nevarat lasīt faila saturu? Varat pārbaudīt faila esamību un tiesības to lasīt iepriekš, izmantojot metodes file_exists un is_readable.

Listing 7. Izmantojot file_exists un is_readable
$faila nosaukums = "mans fails"; if (faila_eksists($faila nosaukums) && ir_lasāms ($faila nosaukums)) ( $fh = fopen($faila nosaukums, "r"); # Notiek apstrāde fclose($fh); )

Tomēr praksē šī programmas daļa, iespējams, būs pārspīlēta jūsu uzdevumam. Fopen atgriezto vērtību apstrāde ir vienkāršāka un precīzāka.

if ($fh = fopen($faila nosaukums, "r")) ( # Notiek apstrāde fclose($fh); )

Tā kā fopen atgriež False, ja tas neizdodas, tas nodrošinās, ka fails tiks apstrādāts tikai tad, ja failu var atvērt. Protams, ja fails neeksistē vai ir nelasāms, atgriešanas vērtība ir negatīva. Tāpēc šāda pārbaude ir lamatas, kurās iekrīt visas iespējamās problēmas. Varat arī iziet no programmas vai parādīt kļūdas ziņojumu, ja failu nevar atvērt.

Tāpat kā fopen, funkcijas file_get_contents, file un readfile atgriež False, ja failu nevar atvērt vai apstrādāt. Funkcijas fgets, fgetss, fread, fscanf un fclose arī atgriež False, ja rodas kļūda. Protams, izņemot fclose , jūs, iespējams, jau esat apstrādājis to atgrieztos rezultātus. Kas attiecas uz fclose , nav daudz ko darīt, ja faila rokturis netiek pareizi aizvērts, tāpēc fclose atgriešanas vērtības pārbaude parasti ir pārmērīga.

Izvēle ir tava

PHP netrūkst efektīvu veidu, kā lasīt un parsēt failus. Klasiskās funkcijas, piemēram, fread, lielāko daļu laika var kalpot jums uzticami, vai arī jūs vairāk piesaistīs lasīšanas faila vienkāršība, ja tas ir nepieciešams, lai paveiktu darbu. Izvēle patiešām ir atkarīga no tā, ko jūs mēģināt paveikt.

Ja apstrādājat lielu datu apjomu, fscanf, visticamāk, būs noderīgāks un efektīvāks nekā, piemēram, faila izmantošana kopā ar sekojošajām sadalīšanas un sprintf komandām. Ja vienkārši rādāt lielu teksta daudzumu ar nelielām izmaiņām, tomēr var būt lietderīgāk izmantot funkcijas file , file_get_contents vai readfile. Šis risinājums, iespējams, būs pareizs, izmantojot PHP kešatmiņai vai pat pagaidu starpniekservera izveidei.

PHP nodrošina daudzus rīkus darbam ar failiem. Iepazīstiet katru no tiem labāk un uzziniet, kuri rīki ir vislabākie projektam, pie kura strādājat. Jums tiek piedāvāta plaša programmatūras rīku izvēle, izmantojiet tos visefektīvāk un izklaidējieties, apstrādājot failus, izmantojot PHP.

PHP parādījās daudz vēlāk, nekā programmēšanas valodas nostiprināja savas pozīcijas un formulēja vispārīgas idejas par sintaksi, loģiku, mainīgajiem un citiem programmas objektiem. Faili un funkcijas darbam ar tiem nesniedza panākumus, un pat failu kodēšanas problēma, kas radās dabisku iemeslu dēļ, neradīja radikāli jaunus risinājumus.

Vispārīgas piezīmes

Galvenais darbs ar failiem, lai kādi tie būtu, sastāv no atvēršanas, lasīšanas/rakstīšanas un aizvēršanas. Var izmantot piekļuves bloķēšanas/atbloķēšanas funkcijas failam, kamēr tas tiek apstrādāts, var iestatīt lasīšanas/rakstīšanas pozīciju failā - viss ir tāpat kā iepriekš, tālā pagātnē.

Svarīgs PHP punkts ir funkciju pārpilnība darbam ar failiem un to izmantošanas iespējas. Praksē pietiek ar vienkāršu, bet strādājošu iespēju izmantošanu. Fails, pirmkārt, ir programmas atmiņa. Tajā varat saglabāt informāciju. Jebkuras programmas mērķis, jebkuras tīmekļa vietnes mērķis ir prezentēt, apstrādāt un nodrošināt informācijas drošību.

Būtisks apstāklis

Iepriekš prasība pēc saderības vismaz no apakšas uz augšu bija nesatricināma. Tas ir, programma, kas reiz rakstīta vienā programmēšanas valodas versijā, ideālā gadījumā tiek kompilēta/interpretēta nākamajā versijā. Mūsdienu programmēšanā tas tā nav. Prasība pēc valodas sintaktisko struktūru savietojamības ir kļuvusi par vēstures lietu, un cīņa starp stiliem un programmēšanas rīkiem un atsevišķu rīku versijām ir kļuvusi par viņu dzīves normu.

Darbs ar failiem, kā arī ar datu bāzēm ir tikpat svarīgs kā vietnes saskarne. Pirmajam jābūt veidotam tā, lai, mainot platformu, hostingu vai valodas versiju, nebūtu jāmaina vietnes kods. Interfeiss darbam ar failiem ir jāiekļauj atsevišķā skriptā un jānodrošina pilnīga savietojamība, tāpat kā vietnes dizainam ir adekvāti jāpielāgojas jebkurai ierīcei, pārlūkprogrammai un jānodrošina pārējā vietnes funkcionalitāte ar tādām pašām iespējām.

Lasiet un mainiet sevi

Vai programma var mainīties pati, tas ir, vai skripts var uzlaboties? Līdz šai dienai šis jautājums interesē daudzus. Bet uzdevums izklausās daudz praktiskāks: PHP lasa PHP failu. Izstrādātājs ne vienmēr var atrisināt konkrētu problēmu, rakstot konkrētu kodu. Dažreiz tas ir jāmaina, kad apmeklētājs ierodas vietnē un formulē jautājumu, kas nebija paredzēts izstrādes stadijā.

Tāpat kā visos citos gadījumos, vispirms ir jāatver fails. Nav nozīmes tam, vai šis fails pastāv vai ne. Ja ir zināms, ka fails eksistē (funkcija file_exists() sniedz pozitīvu atbildi), funkcija fopen() tiek izmantota ar piekļuvi 'r', 'r+', 'a', 'a+'. Ja fails vēl neeksistē, tad ar piekļuvi ‘a’, ‘a+’, ‘w’, ‘w+’. Faila atvēršanas rezultāts būs tā deskriptors. Fails tiek aizvērts ar funkciju fclose().

Ir ērti izmantot PHP, lai nolasītu failu masīvā, ja lasīšanas laikā tas nav jāapstrādā.

if (file_exists($fName)) (

$aLines = fails($fName)

Izmantojot šo opciju, katra faila rinda secīgi nonāk masīva elementā. Jāņem vērā, ka faila() vai file_get_contents() funkcijām fails nav jāatver un jāaizver.

Ja ievades fails ir pārāk liels un jums ir jāatrod tikai nedaudz informācijas vai citu iemeslu dēļ, varat izmantot PHP, lai lasītu failu rindiņu pa rindiņai. PHP nodrošina iespēju to izdarīt ar fgets() un fgetc() funkcijām.

$fvs = fopen($fName, "r")

while ((false !== ($cLine = fgets($fvs, 2000)))) (

$cLines .= "
" . $i . "). $cLine

Abas iespējas darbojas nevainojami. Tomēr, veicot PHP faila lasīšanu vēlākai modificēšanai, ir jāievēro piesardzības pasākumi. Vietnes izstrādes stadijā ne vienmēr ir iespējams paredzēt, kā apmeklētājs to izmantos. Labāk, ja skripti tiek mainīti vietnes funkcijās, un apmeklētājs, tostarp resursa administrators, nevar kontrolēt šīs izmaiņas.

Rezultātu saglabāšana

Saņemto un atjaunināto informāciju failā ieraksta funkcija fputs() rindiņu pa rindiņai vai funkcija file_put_contents() kopumā.

$fName = $_SERVER["DOCUMENT_ROOT"] . "/tmp/scData.php"

$fvs = fopen($fName, "a")

ganāmpulks ($fvs, LOCK_EX)

$cLine = "1 rinda". chr (10)

fputs ($fvs, $cLine)

$cLine = "2 rindas" . chr (10)

fputs ($fvs, $cLine)

ganāmpulks ($fvs, LOCK_UN)

Ierakstīšanas opcijā rindiņa pa rindiņai varat manipulēt ar datiem ierakstīšanas procesā, otrajā gadījumā ierakstītā virkne vai masīvs tiek ievietots visā failā.

$file = " scData.php "

$cContents = file_get_contents($file)

// ieraksta pievienošana

$cContents .= "jauns ieraksts\n"

// ierakstiet failu atpakaļ

file_put_contents($file, $cContents)

PHP failu lasīšana un rakstīšana ir vienkārša un dabiska. Tomēr ir svarīgi paturēt prātā: katram failam ir nosaukums, paplašinājums un ceļš (mape). Lai PHP skripts varētu lasīt un rakstīt failus, skriptam ir jābūt atbilstošām tiesībām. Tie tiek automātiski parādīti mitināšanā, taču dažos gadījumos tie ir jāpaplašina.

Dažos gadījumos var būt vēlams pārbaudīt rezultātus, veicot testa nolasīšanu. Lai rakstītu PHP failus, tas ir nepieciešams izstrādes laikā, taču dažos gadījumos vietnes drošības vai uzticamības interesēs ir svarīgi pārbaudīt datu ierakstu.

Raksturīga PHP, MySQL, JavaScript un jo īpaši pārlūkprogrammu iezīme: klusi ļaujot notikt dažām kļūdām. “Nav atpazīts, nav izdarīts...” nav ļoti laba prakse informācijas tehnoloģiju progresīvākos, taču tas iemāca izstrādātājiem nekļūdīties un rakstīt tīru, kvalitatīvu kodu, kas arī nav slikti.

PHP un darbs ar reāliem dokumentiem

PHP lasīšana PHP failā noteikti ir praktiska interese, taču tā ir programmēšanas joma. Lietotāju un vietnes apmeklētāju interesē lietišķa rakstura informācija, kuru viņš ir pieradis redzēt tabulu un dokumentu veidā, jo īpaši *.xlsx un *.docx failu formātos. Tie ir faili MS Excel un MS Word formātā.

Preču saraksti, cenas, raksturlielumi parasti tiek veidoti tabulu veidā, tāpēc PHP lasīšana Excel failā ir būtiska.

PHPExcel un PHPWord bibliotēkas ir izstrādātas darbam ar šādiem failiem. Tomēr *.xlsx un *.docx failu saturs tiek parādīts OOXML standartā, tas ir, īstais, saprotamais dokuments tiek parādīts zip arhīvā. Zip arhīvs ir failu kopums, tostarp attēli, objekti, formulas un ieliktņi no citām programmām. Teksta faili šeit ir attēloti ar aprakstiem tagu veidā. Nepietiek ar šāda faila lasīšanu; jums tas ir jāparsē, lai iegūtu saturu un struktūru lietošanai un modificēšanai.

Tas nozīmē, ka lasīšanas darbība pārvēršas par arhīva atvēršanas procedūru. Šīs bibliotēkas neatkarīgi atver dokumentu arhīvu un nodrošina izstrādātājam plašas funkcijas šādu dokumentu lasīšanai, apstrādei un rakstīšanai.

Excel tabulas

include_once 'PhpOffice/PhpExcel/IOFactory.php'

funkcija scGetExcelFile($xls)(

$objPHPExcel = PHPExcel_IOFActory::load($xls)

$objPHPExcel->setActiveSheetIndex(0)

//šajā masīvā ir virkņu masīvi

$aSheet = $objPHPExcel->getActiveSheet()

$masīvs = masīvs()

//ārstēšana

foreach($aSheet->getRowIterator() kā $row)(

$cellIterator = $rinda->getCellIterator()

foreach($cellIterator kā $cell)(

array_push($item, iconv("utf-8", "cp1251", $cell->getCalculatedValue()))

masīvs_push($masīvs, $vienums)

Excel failu lasīšana un apstrāde ir daudz grūtāka nekā Word dokumentu apstrāde. Labākais variants, ja nepieciešams īstenot nopietnu projektu lietišķās informācijas lasīšanai un apstrādei, ir vispirms apgūt PHPWord bibliotēku. Tas sniegs jums labu pieredzi un ātru izpratni par problēmas specifiku.

Word dokumenti

Tikai divas rindas:

$oWord = jauns \PhpOffice\PhpWord\PhpWord()

$oDocx = $this->oWord->loadTemplate($cFileName)

Dokuments $cFileName tagad ir pieejams apstrādei. Tālāk tiek atvērts arhīvs, atlasīts un analizēts tā saturs, ko var attēlot vietnē, mainīt un atrakstīt atpakaļ.

$zipClass = jauns ZipArhīvs()

$zipClass->open($this->tempFileName)

// lasīt visu dokumenta saturu

priekš ($i=0; $i<$zipClass->numFiles; $i++) (

$cNameIn = $zipClass->getNameIndex($i)

$cNameInExt = substr($cNameIn, -4)

if (($cNameInExt == ".xml") || ($cNameInExt == "rels")) (

// faili ar paplašinājumiem ".xml" un ".xml.rels" tiek saglabāti dokumentu tabulā

// katra xml rinda ir rakstīta ar unikālu numuru secībā

$cBodyIn = $zipClass->getFromName($cNameIn)

$cBodyInLen = strlen($cBodyIn)

// visi pārējie faili tiek ierakstīti dokumentu mapē, kā tas ir

$cNameOnly = substr($cNameIn, strrpos($cNameIn, "/") + 1)

$zipClass->getFromName($cNameIn, $cWorkPath); // saturs kā fails

PHP Excel un PHP Word piedāvātās iespējas ļauj manipulēt ar reāliem dokumentiem un padarīt to saturu atbilstošu jebkurā brīdī. Mūsdienu dinamiskajā pasaulē tas kļūst ļoti svarīgi. Smaguma centrs jau sen ir pārcēlies no lokālas datortehnoloģiju izmantošanas uz virtuālo interneta telpu. Tāpēc tabulu un dokumentu veidošana lokālajos Microsoft produktos ir mazāk efektīva nekā darbs ar šādiem dokumentiem automātiskā un pusautomātiskā režīmā vietnē, kas ir pieejama ne tikai tabulas vai dokumenta veidotājam, bet arī tās patērētājiem.

Teksta faili, cita dzīve

Sākotnēji teksta faili ir vienkāršāki nekā PHP faili vai lietojumprogrammu dokumenti. Tomēr šeit ir par ko padomāt. Šādu failu lasīšanas/rakstīšanas darbības jau ir norādītas iepriekš, taču daudz svarīgāka ir šādu failu nozīme.

Tā kā ir tāda dota kā klients un serveris (pirmajā dominē JavaScript, otrajā PHP), tad pat sīkfailu un sesiju mehānismi nevar tikt galā ar nepieciešamību pārsūtīt informāciju starp skriptiem, lapām vai noteiktiem procesiem.

Ir iespējams atspoguļot vēlamās izmaiņas datu bāzē, taču, neskatoties uz visām priekšrocībām un ātrumu, mazie pagaidu vai pastāvīgie teksta faili var būt daudz interesantāks informācijas pārsūtīšanas variants. Ja neveidojat daudz mazu failu un nekontrolējat to lielumu, tie var būt specifiska un elastīgāka datu bāzes versija.

PHP teksta faila lasīšana ir ātra, to var nekavējoties parsēt struktūrā, masīvā vai objektā. Pēdējais ir ļoti svarīgs, jo ļauj izveidot objektus, kas dzīvo ārpus PHP skriptam atvēlētā laika, kurš, kā zināms, var pastāvēt tikai serverī un tikai lapas ielādes brīdī tiek saņemta AJAX atbilde. ģenerēts vai cita iemesla dēļ, kas izraisa PHP tulka palaišanu.

Ja domājat par to, ka teksta fails ir izstrādātāja saturs un struktūra, PHP fails ir tulka sintakse plus izstrādātāja loģika, un “atzīmētie” apraksti html, css, xml ir vairāk semantiski elementi, bet regulēti. pēc statiskajiem standartiem. Var secināt, ka, iespējams, ir pienācis laiks failiem iegūt jaunu saturu, un tam pašam vajadzētu noteikt to kvalitāti un lietošanas loģiku. Tieši tāpēc, ka programmēšana vēl nav gatava nākamajam attīstības posmam, faili mūsdienās paliek vienkārši faili, kurus veido izstrādātājs un nosaka to izmantošanu.

Pats interesantākais un daudzsološākais ir tad, kad PHP patstāvīgi nolasa PHP failu, kad rodas tāda nepieciešamība. Un vienkārši PHP nolasot rindiņu no faila, tiek izveidots objekts, vismaz tādā stāvoklī, kādā tas tika saglabāts. Tās nav gluži pazīstamas idejas, taču mūsdienu pasaulē viss mainās tik ātri.

16,5 tūkst

Faktiski php faila atvēršana nav liela problēma. Var būt grūtāk atvērt alus pudeli, atrodoties meža vidū. Taču šādi domā tikai dedzīgi programmētāji. Un iesācējiem mēs jums pastāstīsim par visām PHP iespējām darbam ar failiem:

php faili

Faili ar php paplašinājumu satur kodu, kas rakstīts tāda paša nosaukuma programmēšanas valodā. Atšķirībā no citām valodām, php ir servera puses programmēšanas valoda. Tas ir, tas darbojas servera pusē. Tāpēc, lai atkļūdotu tā kodu, klienta datorā ir jāinstalē vietējais serveris.

Lai strādātu ar php failiem, tiek izmantotas īpašas lietojumprogrammas - programmatūras redaktori. Visizplatītākie ir:

  • Dreamweaver.
  • PHPEdit.
  • Eclipse PHP izstrāde.
Veidojot tīmekļa vietnes, kuru pamatā ir PHP, iespējams, būs atkārtoti jāizmanto programmas kods. Šādās situācijās ir ērti savienot gatavus risinājumus, kas atrodas citā failā. Šim nolūkam tiek izmantota iekļautā konstrukcija. Tās sintakse ir:

iekļaut faila nosaukumu

Savienojuma piemērs:

Iekļauts fails:


Faila iekļaušana ir iespējama arī, izmantojot prasību konstrukciju. Atšķirībā no include, tas ietver failu pirms programmas koda izpildes. Kodā izmantojot prasību, ir iespējams tikai viens šī faila izsaukums. Atkārtoti piekļūstot, sistēma parādīs globālu kļūdas ziņojumu un apturēs programmas izpildi.

Iekļautā konstrukcija ietver tikai avotu programmas izpildes laikā. Tā atbalsta vairākas php failu lasīšanas. Ja rodas kļūda, tiks parādīts tikai brīdinājuma ziņojums, un koda izpilde tiks turpināta no nākamās rindas.

Failu atvēršana un aizvēršana

php visas darbības ar failiem tiek veiktas vairākos posmos:

  • Faila atvēršana;
  • Satura rediģēšana;
  • Faila aizvēršana.

Funkcija fopen () tiek izmantota, lai atvērtu failu. Tās sintakse ir:

int fopen (virknes faila nosaukums, virknes režīms [, int use_include_path])

Pieņemtie argumenti:

  • virknes faila nosaukums – faila nosaukums vai absolūtais ceļš uz to. Ja faila ceļš nav norādīts, tas tiks meklēts pašreizējā direktorijā. Ja meklētā faila trūkst, sistēma parādīs kļūdas ziņojumu. Piemērs:

  • virknes režīms – norāda faila atvēršanas režīmu. Argumentā pieņemtās vērtības:
  • r – fails tiek atvērts tikai lasīšanai, faila rādītājs ir iestatīts sākumā;
  • r+ – fails ir atvērts lasīšanai un rakstīšanai;
  • w – izveido jaunu failu tikai rakstīšanai. Ja fails ar tādu pašu nosaukumu jau pastāv, visi tajā esošie dati tiek automātiski dzēsti;
  • w+ - izveido jaunu failu rakstīšanai un lasīšanai. Kad šāds fails pastāv, tā dati tiek pilnībā pārrakstīti ar jauniem;
  • a – fails ir atvērts rakstīšanai. Rādītājs ir iestatīts beigās. Tas ir, rakstīšana php failā sāksies nevis no sākuma, bet no beigām;
  • a+ – atver failu lasīšanas-rakstīšanas režīmā. Ieraksts sāksies no beigām;
  • b – režīms darbam ar failu, kas satur bināros datus (bināro skaitļu sistēmā). Šis režīms ir pieejams tikai operētājsistēmā Windows.

Lai aizvērtu piekļuvi failam, izmantojiet funkciju fclose(). Sintakse:

int fclose (int fails) , kur int fails ir vietnes aizvēršanas rokturis.

Pēc katras lasīšanas vai rakstīšanas fails ir jāaizver ar šo funkciju. Pretējā gadījumā failam izveidotā straume paliek atvērta. Un tas noved pie nevajadzīga servera jaudas patēriņa.

Piemērs:

Failu lasīšana un rakstīšana

Lai vienkārši parādītu visu faila saturu, funkcija readfile () ir ideāla. Tās sintakse ir:

readfile (virknes faila nosaukums) , kur virknes faila nosaukums ir virknes faila nosaukums (nevis rokturis).


To pašu failu var nolasīt, izmantojot funkciju fpassthru(). Tas nolasa datus no beigu rādītāja pozīcijas līdz faila beigām. Tās sintakse ir:

int fpassthru (int fails)

Funkcijai ir jāatver un jāaizver fails. Piemērs:

Rezultāts ir līdzīgs iepriekšējam.

Funkcijas darbam ar failiem programmā php ļauj lasīt saturu pa rindiņai un rakstzīmei pēc rakstzīmes:

  • virkne fgets (int fails, int garums)– funkcija nolasa virkni, kuras garums ir . Piemērs:

  • string fread (int fails, int garums)– darbība ir identiska iepriekšējai.

Lai failā ierakstītu teksta datus, ir divas identiskas funkcijas:

  • int fputs (int fails, virknes virkne [, int garums ])
  • int fwrite(int fails, virknes virkne [, int garums ])

Funkcijas ieraksta failā int failā virknes virkni ar norādīto garumu int garumu ( izvēles arguments). Piemērs:

Failu izveide un dzēšana

Lai izveidotu php failu, varat izmantot funkciju fopen() piekļuves režīmā "w" vai "w+". Vai arī touch() funkcija. Tas nosaka faila modifikācijas laiku. Ja nav elementa ar meklēto nosaukumu, tas tiks izveidots. Tās sintakse.




Tops