PHP прочете съдържанието на файла в променлива. Създаване, четене и писане на PHP файл. Полезни PHP добавки и функции за работа с отворен файл

изтегляния $ _ (8)

Трябва да заредя PHP файл в променлива. Например включва ();

Изтеглих прост HTML файл като този:

$ Vdata = file_get_contents ("textfile.txt");

Но сега трябва да изтегля PHP файла.

Отговори

Ако вашият файл има изявление за връщане:

"Afeganistão", "ZA" => "África do Sul", ... "ZW" => "Zimbabué");

Можете да получите тази променлива по следния начин:

$ data = включва $ filePath;

Като алтернатива можете да започнете буфериране на изхода, да включите / изисквате и след това да спрете буферирането. С ob_get_contents (), можете просто да получите неща, които са били издадени от друг PHP файл, в променлива.

Ако искате да изтеглите файл, без да го изпълнявате през уеб сървър, следното трябва да работи.

$ string = eval (file_get_contents ("file.php"));

След това съдържанието на файла ще бъде заредено. PHP файлът трябва да бъде напълно оформен с таговеЗа да го оцени eval.

Предполагам, че искате да получите Съдържание, генерирано от PHP, ако е вярно:

$ Vdata = file_get_contents ("http: //ВАШИЯТ_ХОСТ/ВАШИЯТ/FILE.php");

В противен случай, ако искате да получите Изходен код на PHP файл, това е същото като .txt файла:

$ Vdata = file_get_contents ("път / към / ВАШИЯ / FILE.php");

На теория можете просто да използвате fopen и след това да използвате stream_get_contents.

$ stream = fopen ("file.php", "r"); $ string = stream_get_contents ($ поток); fclose ($ поток);

Ако използвате http: //както предложи eyel, ще можете да четете само изхода на PHP скрипта. Можете да четете PHP скрипт само ако се намира на същия сървър като вашия скрипт. След това можете да използвате нещо подобно

$ Vdata = file_get_contents ("/ път / към / вашия / file.php");

Ето как го правя (има много начини):

  1. Преобразуване на данни в Json
  2. Повикване AJAXза да получите файла Json
  3. Трансформация Jsonв обект Javascript

ЕТАП 1

connect_error) (die ("Неуспешна връзка:". $ conn-> connect_error);) $ sql = "ИЗБЕРЕТЕ идентификатор, име, изображение ОТ телефона"; $ резултат = $ conn-> заявка ($ sql); while ($ ред = $ резултат-> fetch_assoc ()) ($ v = $ ред;) echo json_encode ($ v); $ conn-> затвори (); ?>

СТЪПКА 2

Функция showUser (fnc) (var xhttp = new XMLHttpRequest (); xhttp.onreadystatechange = функция () (if (this.readyState == 4 && this.status == 200) (// СТЪПКА 3 var p = JSON.parse ( this.responseText);)))

Преди да се опитате да работите с файла, препоръчително е да се уверите, че той съществува. Две функции обикновено се използват за изпълнение на тази задача:

file_exists () и is_file ().

Функцията f ilе_exists () проверява дали посоченият файл съществува. Ако файлът съществува, функцията връща TRUE, в противен случай се връща FALSE. Синтаксисът за функцията file_exists () е:

bool file_exists (низ файл)

Пример за проверка на съществуването на файл:

ако (! file_exists ($ filename)):

print "File $ filename не съществува!";

is_file ()

Функцията is_file () проверява съществуването на посочения файл и възможността за извършване на операции за четене/запис върху него. По същество is_file () е по-стабилна версия на file_exists (), която не само проверява дали файл съществува, но и дали може да чете и записва данни:

bool is_file (низ файл)

Следният пример показва как да проверите дали файл съществува и може да се работи с него:

$ file = "somefile.txt";

if (is_file ($ файл)):

print "Файлът $ файл е валиден и съществува!";

print "Файлът $ файл не съществува или не е валиден файл!";

След като се уверите, че необходимият файл съществува и че можете да извършвате различни операции за четене/запис с него, можете да продължите към следващата стъпка - отваряне на файла.

Функцията Filesize () връща размера (в байтове) на файла с даденото име или FALSE при грешка. Синтаксисът за функцията file size () е:

int размер на файла (низово име на файл)

Да приемем, че искате да определите размера на файла pastry.txt. Можете да използвате функцията file size (), за да получите информацията, която искате:

$ fs = размер на файла ("pastry.txt"); print "Pastry.txt е $ fs байтове.";

Показва се следният изход:

Pastry.txt е 179 байта.

Преди да можете да извършвате операции с файл, трябва да го отворите и да го свържете с манипулатора на файла и след като приключите с работата с файла, да го затворите. Тези теми са обсъдени в следващия раздел.

Отваряне и затваряне на файлове

Преди да извършите I/O операции върху файл, трябва да го отворите с функцията fopen ().

Функцията fopen () отваря файл (ако съществува) и връща цяло число - т.нар. файлов манипулатор(дръжка на файла). Синтаксисът на функцията fopen () е:

int fopen (низ файл, низов режим [, int enable_path])

Отваряният файл може да се намира в локалната файлова система, да съществува като стандартен I/O поток или да представя файла на отдалечена система, както е получен от HTTP или FTP.

Параметърът на файла може да бъде зададен в няколко форми, изброени по-долу:

Ако параметърът съдържа името на локален файл, fopen () отваря този файл и връща манипулатор.

Ако параметърът е посочен като php: // stdin, php: // stdout или php: // stderr, съответният стандартен входен/изходен поток се отваря.

Ако параметърът започва с префикса http: //, функцията отваря HTTP връзка към сървъра и връща манипулатор за посочения файл.

Ако параметърът започва с префикса ftp: //, функцията отваря FTP връзка към сървъра и връща манипулатор за посочения файл. В този случай трябва да обърнете специално внимание на две неща: ако сървърът не поддържа пасивен FTP, извикването на fopen () ще се провали. Освен това FTP файловете се отварят за четене или запис.

Когато работи в пасивен режим, YR сървърът чака връзка от страна на клиента. Когато работи в активен режим, сървърът сам установява връзка с клиента. По подразбиране обикновено е активен режим.

Параметърът mode определя способността за четене и запис във файла. Таблица 7.1 изброява някои от стойностите, които определят режима на отваряне на файл.

Таблица 7.1. Режими на отваряне на файлове

режим Описание
Само четене. Текущият указател на позиция е зададен в началото на файла
r + Четене и писане. Текущият указател на позиция е зададен в началото на файла
w Пишете само. Текущият указател на позиция се задава в началото на файла и цялото съдържание на файла се унищожава. Ако файлът не съществува, функцията се опитва да го създаде
w + Четене и писане. Текущият указател на позиция се задава в началото на файла и цялото съдържание на файла се унищожава. Ако файлът не съществува, функцията се опитва да го създаде
а Пишете само. Текущият указател на позиция е позициониран в края на файла. Ако файлът не съществува, функцията се опитва да го създаде
а + Четене и писане. Текущият указател на позиция е позициониран в края на файла. Ако файлът не съществува, функцията се опитва да го създаде

Ако незадължителният трети параметър include_path е 1, тогава пътят на файла е относителен към директорията за включване, посочена във файла php.ini (вижте глава 1).

По-долу е даден пример за отваряне на файл с функцията fopen (). Die (), използван във връзка с fopen (), предоставя съобщение за грешка, ако файлът не може да бъде отворен:

$ file = "userdata.txt"; // Някакъв файл

$ fh = fopen ($ файл, "a +") или умре ("Файл ($ файл) не съществува!");

Следният фрагмент отваря връзка към PHP сайт (http://www.php.net):

$ site = "http://www.php.net": // Сървър, достъпен чрез HTTP

$ sh = fopen ($ site., "r"); // Свържете манипулатора към индексната страница на php.net

Когато приключите, файлът винаги трябва да се затваря с fclose ().

Функцията fclose () затваря файла с посочения манипулатор. Връща TRUE при успешно завършване, FALSE при неуспех. Синтаксисът на функцията fclose () е:

int fclose (int манипулатор)

Функцията fclose () затваря успешно само онези файлове, които преди това са били отворени с fopen () или fsockopen (). Пример за затваряне на файл:

$ file = "userdata.txt";

if (file_exists ($ файл)):

$ fh = fopen ($ файл, "r");

// Извършване на файлови операции

print "File Sfile не съществува!";

Пишете във файла

Има две основни операции, извършвани с отворени файлове – четене и запис.

Функцията is_writeable () ви позволява да проверите дали файлът съществува и може да се записва. Проверява се възможността за запис както за файла, така и за директорията. Синтаксисът за функцията is_writeable () е:

bool is_writeable (низ файл)

Един важен момент: PHP най-вероятно ще работи под потребителския идентификатор, използван от уеб сървъра (обикновено "никой"). За пример за използване на is_writeable (), вижте функцията fwrite ().

Функцията fwrite () записва съдържанието на низова променлива във файла, определен от манипулатора на файла. Синтаксисът на функцията fwrite () е:

int fwrite (int манипулатор, низова променлива [, int дължина])

Ако в извикването на функцията бъде предаден параметърът за дължина по избор, записът спира или след запис на определения брой знаци, или когато се достигне краят на реда. Проверката на възможността за запис във файл е демонстрирана в следния пример:

// Информация за трафика в сайта на потребителя

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

$ filename = "somefile.txt";

// Ако файлът съществува и може да бъде записан

if (is_writeable ($ filename)):

$ fh = fopen ($ име на файл, "a +");

// Записване на съдържанието на $ data във файл

$ успех - fwrite ($ fh, $ данни);

// Затваряне на файла

fclose ($ fh); друго:

print "Не можах да отворя Sfilename за писане";

Функцията fputs () е псевдоним за fwrite () и може да се използва навсякъде, където се използва fwrite ().

Функцията fputs () е псевдоним за fwrite () и има абсолютно същия синтаксис. Синтаксисът за функцията fputs () е:

int fputs (int манипулатор, низова променлива [, int дължина])

Аз лично предпочитам да използвам fputs (). Имайте предвид, че това е само въпрос на стил и няма нищо общо с разликата между двете функции.

Четене от файл

Четенето несъмнено е най-важната операция, извършвана върху файлове. Някои от функциите, които правят четенето от файл по-ефективно, са описани по-долу. Синтаксисът на тези функции почти точно копира синтаксиса на аналогичните функции за запис.

Функцията i s_readable () гарантира, че файлът съществува и е четим. Четимостта се проверява както за файла, така и за директорията. Синтаксисът за функцията is_readable () е:

буу! is_readable (низ файл]

PHP най-вероятно ще работи под потребителския идентификатор, използван от уеб сървъра (обикновено "никой"), така че, за да може is_readable () да върне TRUE, всеки трябва да има право да чете от файла. Следният пример показва как да се гарантира, че файл съществува и е четим:

if (is_readable ($ filename)):

// Отворете файла и задайте показалеца на текущата позиция в края на файла

$ fh = fopen ($ име на файл, "r");

print "$ filename не се чете!";

Функцията fread () чете определения брой байтове от файла, определен от манипулатора на файла. Синтаксисът на функцията fwrite () е:

int fread (int манипулатор, int дължина)

Манипулаторът трябва да се отнася към отворен файл за четене (вижте описанието на функцията is_readable ()). Четенето спира, когато определеният брой байтове са прочетени или когато се достигне края на файла. Помислете за текстовия файл pastry.txt, показан в листинг 7.1. Четенето и показването на този файл в браузър се извършва със следния фрагмент:

$ fh = fopen ("pastry.txt", "r") или умре ("Не мога" да отворя файл! ");

$ файл = fread ($ fh, размер на файла ($ fh));

Като използвате функцията fllesize () за определяне на размера на pastry.txt в байтове, вие гарантирате, че функцията fread () чете цялото съдържание на файла.

Списък 7.1. Текстов файл Pastry.txt

Рецепта: Тесто за сладкиши

1 1/4 чаши универсално брашно

3/4 пръчка (6 супени лъжици) несолено масло, нарязано

2 супени лъжици зеленчукова смес 1/4 чаена лъжичка сол

3 супени лъжици вода

Функцията fgetc () връща низ, съдържащ един знак от файла в текущата позиция на показалеца или FALSE при достигане до края на файла. Синтаксисът на функцията fgetc () е:

низ fgetc (int манипулатор)

Манипулаторът трябва да се отнася към отворен файл за четене (вижте функцията is_readable () по-рано в тази глава). Следният пример демонстрира четене и извеждане на файл символ по знак с помощта на функцията fgetc ():

$ fh = fopen ("pastry.txt", "r"); докато (! feof ($ fh)):

$ char = fgetc ($ fh):

печат $ char; крайно време;

Функцията fgets () връща низа, прочетен от текущата позиция на показалеца във файла, определен от манипулатора на файла. Указателят на файла трябва да сочи към отворен файл за четене (вижте функцията is_readable () по-рано в тази глава). Синтаксисът на функцията fgets () е:

низови fgets (int манипулатор, int дължина)

Четенето спира, когато е изпълнено едно от следните условия:

  • дължина, прочетена от файл - 1 байт;
  • символ за нов ред беше прочетен от файла (включен в върнатия низ);
  • от файла е прочетен знак за край на файла (EOF).

Ако искате да организирате четене на файла ред по ред, подайте във втория параметър стойност, която очевидно надвишава броя на байтовете в реда. Пример за четене ред по ред и извеждане на файл:

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

докато (! feof ($ fh));

$ линия = fgets ($ fh, 4096);

отпечатайте ред $. "
";

Функцията fgetss () е напълно подобна на fgets () с едно изключение - тя се опитва да премахне всички HTML и PHP тагове от прочетения текст:

string fgetss (Int манипулатор, int дължина [, низ разрешени_tags])

Преди да преминете към примерите, вижте съдържанието на листинг 7.2 — този файл се използва в листинги 7.3 и 7.4.

Списък 7.2. Science.html файл

Актуални новини - Наука

Открита е извънземна форма на живот


20 август 2000 г

Рано тази сутрин странна нова форма на гъбички беше открита, растяща в килера на стария хладилник в апартамента на W. J. Gilmore. Не е известно дали мощната радиация, излъчвана от компютърния монитор на наемателя, е помогнала за тази еволюция.

Списък 7.3. Премахнете тагове от HTML файл, преди да се покажат в браузъра

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

докато (! feof ($ fh)):

отпечатайте fgetss ($ fh, 2048);

Резултатът е показан по-долу. Както можете да видите, всички HTML тагове са премахнати от файла science.html, което води до загуба на форматиране:

В някои ситуации всички тагове се премахват от файла, с изключение на някои - например маркери за прекъсване на реда
... Списък 7.4 показва как се прави това.

Списък 7.4. Селективно премахване на тагове от HTML файл

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

$ допустимо = "
";

докато (! feof ($ fh)):

отпечатайте fgetss ($ fh. 2048, $ допустимо);

Резултат:

Актуални новини - Науката Открита форма на живот на извънземните на 20 август 2000 г. Рано тази сутрин беше открита странна нова форма на гъбички, растяща в килера на стария хладилник в апартамента на WJ Gilmore. Не е известно дали мощна радиация се излъчва от компютъра на наемателя мониторът помогна в тази еволюция.

Както можете да видите, функцията fgetss () улеснява конвертирането на файлове, особено ако имате много HTML файлове, които са форматирани по подобен начин.

Четене на файл в масив

Функцията file () зарежда цялото съдържание на файл в индексируем масив. Всеки елемент от масива съответства на един ред от файла. Синтаксисът на функцията file () е:

файл с масив (файл с низ [, int path_include])

Ако незадължителният трети параметър include_path е 1, тогава пътят на файла е относителен към директорията за включване, посочена във файла php.ini (вижте глава 1). Списък 7.5 използва функцията file () за зареждане на файла pastry.txt (вижте листинг 7.1).

$ file_array = файл ("pastry.txt");

while (списък ($ line_num. $ line) = everyt ($ file_array)):

отпечатай " Ред $ line_num:", htmlspecialchars ($ ред),"
\ н "

Всеки ред от масива се показва заедно с число:

Ред 0: Рецепта: Тесто за сладкиши

Ред 1: 1 1/4 чаши универсално брашно

Ред 2: 3/4 пръчка (6 супени лъжици) несолено масло, нарязано

Ред 3: 2 супени лъжици зеленчуково скъсяване

Ред 4: 1/4 чаена лъжичка сол

Ред 5: 3 супени лъжици вода

Пренасочване на файл към стандартен изход

Функцията readfile () чете съдържанието на файл и го насочва към стандартен изход (в повечето случаи към браузъра). Синтаксисът за функцията readfile () е:

int readfile (файл с низ [, int path_include])

Функцията връща броя на прочетените байтове. Файлът може да се намира в локалната файлова система, да съществува като стандартен I/O поток или да представлява файл на отдалечена система, получен от HTTP или FTP. Параметърът на файла се задава по същите правила като във функцията fopen ().

Да предположим, че имате файл latorre.txt, който искате да покажете в браузъра:

Ресторант "La Torre". разположен в Нетуно, Италия, предлага еклектична смесица от стил. история и изискана кухня с морски дарове. В стените на средновековното борго, заобикалящо града, човек може да се храни, докато гледа как минувачите пазаруват в селските бутици. Комфорт, съчетан само с най-пресните морски продукти, правят La Torre един от най-добрите ресторанти в Италия.

Когато се изпълни следният фрагмент, цялото съдържание на latorre.txt се прехвърля към стандартния изходен поток:

$ restaurant_file = "latorre.txt";

// Изпращане на целия файл на стандартен изход

readfile ($ restaurant_file);

Отваряне на манипулатор на файл на процеса

Заедно с обикновените файлове, можете да отваряте файлови манипулатори, за да взаимодействате с процесите на сървъра. Проблемът се решава чрез функцията poren (), която има следния синтаксис:

int popen (команда низ, низов режим)

Параметърът на командата дефинира системната команда, която трябва да бъде изпълнена, а параметърът mode описва режима на достъп:

// Отворете файл "spices.txt" за писане

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

// Добавяне на няколко реда текст

fputs ($ fh, "Маданоз, градински чай, розмарин \ n");

fputs ($ fh, "Червен пипер, сол, черен пипер \ n");

fputs ($ fh, "босилек, градински чай, джинджифил \ n");

// Затворете манипулатора

// Отворете UNIX grep процес, за да намерите Basil в spices.txt

$ fh - popen ("grep Basil< spices.txt", "r");

// Печат на изхода на grep

Резултатът изглежда така:

Босилек, градински чай, джинджифил

Функцията fpassthru () е аналогична на функцията passthru (), обсъдена в раздела "Изпълнение на външни програми" на тази глава.

След приключване на всички операции файлът или процесът трябва да бъдат затворени. Функцията pclose () затваря връзката с процеса, определен от манипулатора, подобно на това как функцията fclose () затваря файла, отворен от функцията fopen (). Синтаксисът за функцията pclose () е:

int pclose (int манипулатор)

В параметъра манипулаторманипулаторът, получен по-рано от успешно извикване към poren (), се предава.

Отваряне на връзка с гнездо

PHP не се ограничава до взаимодействие с файлове и процеси - можете също да установявате връзки през сокети. гнездо(сокет) е софтуерна абстракция, която позволява комуникация с различни услуги на друг компютър.

Функцията fsockopen () установява връзка на сокет със сървър в Интернет

чрез TCP или UDP. Синтаксисът за функцията fsockopen () е:

int fsockopen (низ възел, int порт [, int код_грешка [, низ на грешка_текст [, int изчакване]]])

Незадължителните параметри error_code и error_text съдържат информация, която ще бъде показана, ако връзката със сървъра не успее. И двата параметъра трябва да се предават чрез препратка. Третият незадължителен параметър, timeout, определя колко дълго да се чака отговор от сървъра (в секунди). Списък 7.6 показва как да използвате fsockopen (), за да получите информация за сървър. Въпреки това, преди да разгледате листинг 7.6, трябва да се запознаете с друга функция, socket_set_blocking ().

UDP (User Datagram Protocol) е комуникационен протокол без връзка.

socket_set_blocking ()

Функцията Socket_set_b1ocki ng () ви позволява да зададете контрол на изчакване за сървърни операции:

socket_set_blocking (int манипулатор, булев режим)

Параметърът манипулатор указва предварително отворен сокет, а параметърът mode определя режима, към който се превключва гнездото (TRUE за блокиращ режим, FALSE за неблокиращ режим). Пример за използване на функциите fsockopen () и socket_set_blocking () е показан в листинг 7.6.

Списък 7.6. Използване на fsockopen () за получаване на информация за сървъра

функция getthehost ($ хост. $ път) (

// Отваряне на връзка към възел

$ fp - fsockopen ($ host, 80, & $ errno, & $ errstr, 30);

// Превключване в режим на блокиране

socket_set_blocking ($ fp, 1),

// Изпращане на заглавки

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

fputs ($ fp, "Хост: $ хост \ r \ n \ r \ n"); $ x = 1;

// Получаване на заглавки

докато ($ x< 10) :

$ заглавки = fgets ($ fp, 4096);

// Затворете манипулатора

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

Списък 7.6 произвежда следния изход:

НТТР / 1.1 200 OK Сървър: Microsoft-IIS / 4.0 Местоположение на съдържанието:

2000 г. 20:25:06 GMT ETTag: "f0a61666dbff1bf1: 34a5" Дължина на съдържанието: 1311

Функцията pfsockopen () е постоянна версия на fsockopen (). Това означава, че връзката няма да бъде прекратена автоматично, когато приключи скриптът, в който е извикана функцията. Синтаксисът за функцията pfsockopen () е:

int pfsockopen (низ възел, int порт [, int код_грешка [, низ text_error [, int изчакване]]])

В зависимост от конкретната цел на вашето приложение, може да е по-удобно да използвате pfsockopen () вместо fsockopen ().

Стартиране на външни програми

PHP скриптовете могат също да изпълняват програми, намиращи се на сървъра. Тази функция се използва особено често при администриране на системата чрез уеб браузър, както и за по-удобно получаване на обобщена информация за системата.

Функцията exec () стартира посочената програма и връща последния ред от нейния изход. Синтаксисът на функцията exec () е:

string exec (стринг команда [, низов масив [, int return]])

Моля, обърнете внимание: функцията exec () изпълнява само командата, без да показва резултатите от нейната работа. Целият изход на командата може да бъде съхранен в опционалния масив от параметри. Освен това, ако връщащата променлива е посочена и за дадения масив от параметри, на последния се присвоява кодът за връщане на изпълнената команда.

Списък 7.7 показва как да използвате функцията exec () за изпълнение на UNIX системната ping функция.

Списък 7.7. Проверка на връзката със сървъра с помощта на функцията exec ().

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

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

за ($ i = 0; $ i< count($ping);$i++) :

отпечатай "
$ ping [$ i] ";

Резултат:

PING www.php.net (208.247.106.187): 56 байта данни

64 байта от 208.247.106.187: icmp_seq = 0 ttl = 243 време = 66,602 ms

64 байта от 208.247.106.187: icmp_seq = 1 ttl = 243 време = 55,723 ms

64 байта от 208.247.106.187: icmp_seq = 2 ttl = 243 време = 70,779 ms

64 байта от 208.247.106.187: icmp_seq = 3 ttl = 243 време = 55,339 ms

64 байта от 208.247.106.187: icmp_seq = 4 ttl = 243 време = 69,865 ms

Www.php.net пинг статистика -

5 предадени пакета. Получени са 5 пакета. 0% загуба на пакети

двупосочен min / avg / max / stddev - 55,339 / 63,662 / 70,779 / 6,783 ms

Backticks

Има и друг начин за изпълнение на системни команди, който не изисква извикване на функции - изпълняваната команда е затворена в обратни отметки (``), а резултатите от нейната работа се показват в браузъра. пример:

отпечатай "

$ изход
";

Този фрагмент извежда в браузъра съдържанието на директорията, съдържаща скрипта.

Вътрешният параметър ping -c 5 (-n 5 за Windows) определя броя на запитванията на сървъра.

Ако просто искате да върнете неформатираните резултати от дадена команда, използвайте функцията passthru (), описана по-долу.

Функцията passthru () работи почти по същия начин като exec (), с едно изключение - тя автоматично отпечатва изхода на командата. Синтаксисът на функцията passthru () е:

void passthru (команда низ [, int return])

Ако се подаде незадължителен параметър за връщане при извикване на passthru (), кодът за връщане на изпълнената команда се присвоява на тази променлива.

escapeshellcmd ()

Функцията escapeshellcmd () избягва всички потенциално опасни знаци, които потребителят може да въведе (например в HTML формуляр), за да изпълни команди exec (), passthru (), system () или pooren (). Синтаксис:

string escapeshellcmd (команда низ)

Въвеждането на потребителя винаги трябва да се третира с известно внимание, но дори и тогава потребителите могат да въвеждат команди, които ще бъдат изпълнени от функциите за стартиране на системни команди. Помислете за следния фрагмент:

$ user_input = `rm -rf *`; // Премахване на родителската директория и всички нейни поддиректории

exec ($ user_input); // Изпълнява $ user_input !!!

Ако не се вземат предпазни мерки, такава команда ще доведе до бедствие. Въпреки това, можете да използвате функциите escapeshellcmd (), за да избегнете въвеждането на потребителя:

$ user_input = `rm - rf *`; // Премахване на родителската директория и всички нейни поддиректории

exec (escapeshellcmd ($ user_input)); // Избягайте от опасни символи

Функцията escapeshellcmd () избягва символа *, за да предотврати катастрофално изпълнение на командата.

Сигурността е един от най-важните аспекти на уеб програмирането, затова посветих цяла глава на тази тема и връзката й с програмирането на PHP. За повече информация вижте глава 16.

Работа с файловата система

PHP предоставя функции за преглед и извършване на различни операции върху файлове на сървъра. Информацията за атрибутите на сървърните файлове (местоположение, собственик и привилегии) ​​често е полезна.

Функцията basename () извлича името на файла от предоставеното напълно квалифицирано име. Синтаксисът за функцията basename () е:

низ базово име (низ пълно_име)

Извличането на името на основния файл от пълното име е както следва:

$ път = "/usr/local/phppower/htdocs/index.php"; $ файл = базово име ($ път); // $ файл = "index.php"

Всъщност тази функция премахва пътя от пълното име и оставя само името на файла.

Функцията getlastmod () връща датата и часа на последната модификация на страницата, от която е извикана функцията. Синтаксисът за функцията getlastmod () е:

int getlastmod (недействителен)

Връщаната стойност е в UNIX формат за дата/час и може да бъде форматирана с помощта на функцията дата (). Следният фрагмент показва датата на последната промяна на страницата:

echo "Последна промяна:" .date ("H: i: s a". getlastmod ());

Функцията stat () връща индексируем масив с подробна информация за файла с дадено име:

стат на масива (низово име на файл)

Следната информация се връща в елементите на масива:

0 Строителство

2 Режим на защита на Inode

3 Брой връзки

4 Потребителски идентификатор на собственика

5 ID на групата на собственика

6 Тип устройство Inode

7 Размер в байтове

8 Време на последен достъп

9 Време на последната модификация

10 Време на последната промяна

11 Размер на блока за I/O във файловата система

12 Брой разпределени блокове

По този начин, ако искате да знаете времето на последния достъп до файл, вижте елемент 8 от върнатия масив. Нека разгледаме пример:

$ файл - "datafile.txt";

списък ($ dev, $ inode, $ inodep, $ nlink, $ uid, $ gid, $ inodev, $ size, $ atime, $ mtime, $ ctime,

$ bsize) = stat ($ файл);

print "$ файлът е $ размер байта.
";

print "Последно време за достъп: $ atime
";

print "Време на последна модификация: $ mtime
";

Резултат:

popen.php е 289 байта.

Последен час за достъп: 15 август 2000 г. 12:00:00

Последна промяна: 15 август 2000 г. 10:07:18

В този пример използвах конструкцията list (), за да назова всяка връщана стойност. Разбира се, можете също да върнете масив, да преглеждате елементите в цикъл и да покажете цялата необходима информация. Както можете да видите, функцията stat () предоставя различна полезна информация за даден файл.

Показване и промяна на характеристиките на файла

Всеки файл в UNIX системи има три важни характеристики:

  • принадлежност към група;
  • собственик;
  • разрешения.

Всички тези характеристики могат да бъдат променени с помощта на съответните PHP функции. Функциите, описани в този раздел, не работят на системи от семейството на Windows.

Ако сте нов в UNIX операционните системи, информация за спецификациите на файловата система на UNIX може да бъде намерена на http://sunsite.auc.dk/linux-newbie/FAQ2.htm. Темите за членство в групата, собственост и разрешения са разгледани в раздел 3.2.6.

Функцията chgrp () се опитва да промени групата, към която принадлежи посоченият файл. Синтаксисът на функцията chgrp () е:

int chgrp (низово име на файл, смесена група)

Функцията filegroup () връща идентификатора на групата на собственика на файла с даденото име или FALSE при грешка. Синтаксисът на функцията filegroup () е:

int файлова група (низово име на файл)

Функцията chmod () променя разрешенията на файла с даденото име. Синтаксисът за функцията chmod () е:

int chmod (низово име на файл, int разрешения)

Разрешенията са в осмична форма. Спецификата на задаване на параметър към функцията chmod () е демонстрирана в следния пример:

chmod ("data_file.txt", g + r); // Не работи

chmod ("data_file.txt", 766); // Не работи

chmod ("data_file.txt", 0766); // Върши работа

Функцията fileperms () връща разрешенията на файла с посоченото име или FALSE при грешка. Синтаксисът на функцията fileperms () е:

int fileperms (низово име на файл)

Функцията chown () се опитва да промени собственика на файл. Само привилегированият потребител има право да промени собственика на файл. Синтаксисът за функцията chown () е:

int chown (низово име на файл, смесен потребител)

Функцията fileowner () връща потребителския идентификатор на собственика на файла с даденото име. Синтаксисът на функцията fileowner () е:

int собственик на файл (низ име на файл)

Копиране и преименуване на файлове

Други полезни системни функции, които PHP скриптовете могат да изпълняват, включват копиране и преименуване на файлове на сървъра. Тези операции се изпълняват от две функции: постеля () и преименуване ().

Копирането на файл в PHP скрипт не е по-трудно от използването на UNIX командата cf. Задачата се решава от PHP функцията sopu (). Синтаксисът за функцията copu () е:

int копие (източник на низ, дестинация на низ)

Функцията copu () се опитва да копира изходния файл в целевия файл; връща TRUE при успех и FALSE при неуспех. Ако целевият файл не съществува, функцията litter () го създава. Следният пример показва как да архивирате файл с помощта на функцията copu ():

$ data_file = "datal.txt";

копирайте ($ data_file. $ data_file ".bak") или умрете ("Не можах да копирам $ data_file");

Функцията rename () преименува файл. Връща TRUE при успех и FALSE при неуспех. Синтаксисът на функцията за преименуване () е:

bool преименуване (низ старо_име, низ ново_име)

Пример за преименуване на файл с функцията rename ():

$ data_file = "datal.txt";

преименувайте ($ datafile, $ datafile ".old") или умрете ("Не може да се преименува $ datafile");

Изтриване на файлове

Функцията unlink () премахва файла с даденото име. Синтаксис:

int прекратяване на връзката (низ файл)

Ако използвате PHP на Windows система, понякога възникват проблеми при използването на тази функция. В този случай можете да използвате описаната по-горе функция system () и да изтриете файла с командата DOS del:

система ("del filename.txt");

Работа с директории

PHP функциите ви позволяват да преглеждате и навигирате в съдържанието на директориите. Списък 7.8 показва типична UNIX структура на директории.

Списък 7.8. Типична структура на директории

Функцията dirname () допълва basename (), за да извлече пътя от пълното име на файл. Синтаксисът за функцията dirname () е:

низ dirname (път на низ)

Пример за използване на dirname () за извличане на път от напълно квалифицирано име:

$ път = "/usr/locla/phppower/htdocs/index.php";

$ файл = dirname ($ път); // $ файл = "usr / local / phppower / htdocs"

Функцията dirname () понякога се използва във връзка с променливата $ SCRIPT_FILENAME, за да получите пълния път до скрипта, от който се изпълнява командата:

$ dir - име на директория ($ SCRIPT_FILENAME);

Функцията is_dir () проверява дали файлът с даденото име е директория:

bool is_dir (низово име на файл)

Следният пример използва структурата на директорията от листинг 7.8:

$ isdir = is_dir ("index.html"); // Връща FALSE

$ isdir = is_dir ("книга"); // Връща TRUE

Функцията mkdir () прави същото като UNIX командата със същото име - създава нова директория. Синтаксисът на функцията mkdir () е:

int mkdir (път на низ, режим int)

Параметърът path дефинира пътя за създаване на нова директория. Не забравяйте да завършите параметъра с името на новата директория! Параметърът mode определя разрешенията, които да бъдат присвоени на създадената директория.

Точно както функцията fopen () отваря манипулатор за манипулиране на посочения файл, функцията opendir () отваря манипулатор за манипулиране на директория. Синтаксисът за функцията opendir () е:

int opendir (път на низ)

Функцията closeir () затваря манипулатора на директорията, предаден като параметър. Синтаксисът на функцията closeir () е:

void closedir (int dir_manipulator)

Функцията readdir () връща следващия запис в посочената директория. Синтаксис:

низ readdir (int dir_manipulator)

С тази функция можете лесно да изброите всички файлове и поддиректории в текущата директория:

$ dh = opendir (".);

докато ($ файл = readdir ($ dh)):

отпечатайте "$ файл
"; край;

Функцията chdir () работи по същия начин като командата UNIX cd — тя навигира до директорията, посочена от параметъра. Синтаксисът на функцията chdir () е:

int chdir (директория с низове)

В следващия пример отиваме в книгата / поддиректорията и показваме нейното съдържание:

$ newdir = "книга";

chdir ($ newdir) или die ("Не можа да се промени към директория ($ newdir)"); $ dh = opendir (".");

докато ($ файл = readdir ($ dh));

отпечатайте "$ файл
";

Функцията rewlnddir () премества показалеца на текущата позиция в началото на директорията, отворена от функцията opendir (). Синтаксисът за функцията rewinddir () е:

void rewinddir (int dir_nip)

Проект 1: прост брояч на удари

Скриптът, представен в този раздел, отчита броя на посещенията на страницата, на която се намира. Преди да преминете към кода в листинг 7.9, прегледайте алгоритъма за псевдокод:

  1. Задайте променливата за достъп $ на името на файла, където ще се съхранява стойността на брояча.
  2. Използвайте функцията file (), за да прочетете съдържанието на $ access в масива $ visits. Префиксът @ пред името на функцията потиска възможните грешки (например липсата на файл с даденото име).
  3. Задайте променливата $ current_visitors на първия (и единствен) елемент в масива $ visits.
  4. Увеличете стойността на $ current_visitors с 1.
  5. Отворете файла $ access за запис и задайте показалеца на текущата позиция в началото на файла.
  6. Запишете стойността на $ current_visitors във файла $ access.
  7. Затворете манипулатора, препращащ $ достъп.

Списък 7.9. Прост брояч на удари

// Сценарий: прост брояч на удари

// Цел: запазване на броя на посещенията във файла

$ access = "hits.txt"; // Името на файла се избира произволно

$ current_visitors = $ посещения; // Извличане на първия (и единствен) елемент

++ $ current_visitors; // Увеличаване на брояча на ударите

$ fh = fopen ($ достъп. "w"); // Отворете файла hits.txt и инсталирайте

// указател на текущата позиция към началото на файла

@fwrite ($ fh, $ current_visitors); // Записване на нова стойност на брояча

// към файла "hits.txt"

fclose ($ fh); // Затваряне на манипулатора на файла "hits.txt"

Проект 2: изграждане на карта на сайта

Скриптът в листинг 7-10 изгражда карта на сайта — йерархичен изглед на всички папки и файлове на сървъра, започвайки от дадена директория. При изчисляване на отстъпа на елементите, които съставляват картата на сайта, се използват функциите, дефинирани в тази и предишните глави. Преди да преминете към програмата, прегледайте алгоритъма, написан в псевдокод:

  1. Декларирайте променливи на услугата, за да съхранявате родителската директория, името на графичния файл с изображението на папката, името на страницата и флага на ОС на сървъра (Windows или друга система).
  2. Декларирайте функцията display_directory (), която чете съдържанието на директорията и я форматира за показване в браузъра.
  3. Създайте пътя към директорията, като конкатенирате името, предадено в променливата $ dir1 с $ dir.
  4. Отворете директорията и прочетете нейното съдържание. Форматирайте имената на директория и файлове и ги покажете в браузъра.
  5. Ако текущият файл е директория, извикайте рекурсивно функцията rectory () на display_di и й предайте името на новата директория за показване. Изчислете отстъпа, използван при форматиране на изхода.

Ако файлът не е директория, той се форматира, за да бъде показан като хипервръзка (и отстъпът, използван за форматиране, също се изчислява).

Списък 7.10. Програма Sitemap.php

// Файл: sitemap.php

// Цел: изграждане на карта на сайта

// Директория, от която да започне изграждането на картата

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

// Файл с графично изображение на папката.

// Пътят трябва да бъде зададен спрямо * основната директория на Apache сървъра

$ folder_location = "C: \ Моите документи \ PHP за програмисти \ FINAL CHPS \ graphics \ folder.gif";

// Текст в заглавието на прозореца $ page_name = "PHPRecipes SiteMap";

// Ще се използва ли скриптът на Linux или Windows?

// (0 - Windows; 1 - Linux)

$ usingjinux = 0;

// Функция: display_directory

// Цел: четене на съдържанието на директорията, посочена от параметъра

// $ dir1, последвано от форматиране на директорията и йерархията на файловете.

// Функцията може да бъде извикана рекурсивно.

функция display_directory ($ dir1, $ folder_location, $ using_linux, $ init_depth) (

// Път за актуализиране

Sdh = opendir ($ dir);

докато ($ файл = readdir ($ dh)):

// Елементи от директория "." и ".." не се показват.

if (($ файл! = ".") && ($ файл! = "..")):

ако ($ using_linux == 0):

$ дълбочина = експлодиране ("\\", $ dir): иначе:

$ дълбочина = експлодиране ("/", $ dir); endif; $ curtent_depth = sizeof ($ дълбочина);

// Изграждане на пътя според правилата на използваната операционна система. ако ($ using_linux == 0):

$ tab_depth = $ current_deptn - $ init_depth;

$ файл = $ dir. "\\", $ файл; друго:

$ файл = $ dir. "/", $ файл; endif;

// Файловата променлива $ съдържа ли директория? if (е dir ($ файл)):

// Изчисляване на отстъп

докато ($ x< ($tab_depth * 2)) :

$ x ++; крайно време;

отпечатай "

„.basename ($ файл).“
";

// Увеличаване на брояча

// Рекурсивно извикване на функция display_directory ().

display_directory ($ файл, $ folder_location, $ using_linux, $ init_depth);

// Директория He

// Изграждане на пътя според използваните правила

// операционна система.

ако ($ using_linux == 0):

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

// Изчисляване на отстъп

докато ($ x< (($tab_depth * 2) + 5)) :

отпечатай " „.basename ($ файл).“
";

отпечатай " „.basename ($ файл).“
";

endif; // Is_dir (файл) endif: // Ако! "." или ".."

// Затваряне на директорията closedir ($ dh);

<? print "$page_name"; ?>

// Изчислете началното запълване

ако ($ using_linux == 0):

$ дълбочина = експлодиране ("\\", $ beg_path);

$ дълбочина = експлодиране ("/", $ beg_path);

$ init_depth = sizeof ($ дълбочина);

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

На фиг. 7.1 показва изхода на скрипт за директория с няколко глави в тази книга.

Ориз. 7.1. Показване на структурата на директорията на сървъра с помощта на скрипта sitemap.php

Резултати

Тази глава представи много от PHP инструментите за работа с файлове. По-конкретно, разгледахме следните проблеми:

  • проверка за съществуване на файлове;
  • отваряне и затваряне на файлове и I/O потоци;
  • запис и четене от файл;
  • пренасочване на файл към изходен поток;
  • стартиране на външни програми;
  • операции на файловата система.

Тази глава постави основата за следващата глава, "Стрингове и регулярни изрази", тъй като обработката на низове и I/O са много тясно свързани в уеб разработката.

Използване на функциите fopen, fclose, feof, fgets, fgetss и fscanf

Нека изброим всички възможности

Едно от предимствата на работата със съвременни езици за програмиране като PHP е огромното количество налични възможности. PHP лесно би могъл да възприеме мотото на Perl, "Има множество начини да се направи нещо", особено когато става въпрос за обработка на файлове. Но с изобилието от налични средства възниква въпросът кой е най-добрият за свършване на работата. Разбира се, в действителност отговорът на този въпрос зависи от това какви цели сте си поставили при обработката на файла, така че изучаването на всички функции на езика си заслужава времето.

Традиционни fopen методи

Методите fopen са може би по-познати на програмистите на C и C ++ от старите дни, тъй като те са в по-голяма или по-малка степен точно инструментите, които са били на една ръка разстояние от много години, ако сте работили с това програмиране езици. За всеки от тези методи следвате стандартна процедура, като използвате fopen за отваряне на файла, функция за четене на данните и след това fclose, за да затворите файла, както е показано в листинг 1.

Листинг 1. Отваряне и четене на файл с fgets
$ file_handle = fopen ("myfile", "r"); while (! feof ($ file_handle)) ($ line = fgets ($ file_handle); echo $ line;) fclose ($ file_handle);

Въпреки че тези функции са познати на повечето опитни програмисти, нека анализирам как работят. В действителност, вие следвате тези стъпки:

  1. Отворете файла. $ file_handle съхранява връзка към самия файл.
  2. Проверете дали сте стигнали до края на файла.
  3. Продължете да четете файла, докато стигнете до края, като отпечатвате всеки ред, който прочетете.
  4. Затворете файла.

Имайки това предвид, ще разгледам всяка файлова функция, използвана тук.

Функция Fopen

Функцията fopen установява връзка към файл. Казвам "свързва", защото освен отваряне на файл, fopen може да отвори и URL:

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

Този ред код създава връзка към горната страница и ви позволява да започнете да я четете като локален файл.

Забележка:Параметърът "r", използван във fopen, показва, че файлът е отворен само за четене. Тъй като записването във файл е извън обхвата на тази статия, няма да изброявам всички възможни стойности на параметъра. Въпреки това, трябва да промените "r" на "rb", ако четете от двоични файлове за междуплатформена съвместимост. Пример за този тип ще бъде даден по-долу.

Feof функция

Командата feof определя дали е направено четене до края на файла и връща True или False. Цикълът, даден в него, продължава до края на файла "myfile". Имайте предвид, че feof също връща False, ако четете URL и времето за изчакване на връзката е изтекло, защото няма повече данни за четене.

Функция Fclose

Пропуснете средата на листинг 1 и отидете до края; fclose прави обратното на fopen: затваря връзката с файл или URL. След като изпълните тази функция, вече няма да можете да четете от файл или сокет.

Функция Fgets

Връщайки се няколко реда назад в листинг 1, вие сте точно в сърцето на процеса на обработка на файлове: директно четене на файла. Функцията fgets е вашето "оръжие" по избор за първия пример. Той грабва ред данни от файл и го връща като низ. Оттам можете да извеждате данни или да ги обработвате по друг начин. Примерът в листинг 1 отпечатва целия файл.

Ако решите да ограничите размера на частта данни, върху която работите, можете да добавите аргумент към fgets, за да ограничите максималната дължина на заснетата линия с данни. Например, използвайте следния код, за да ограничите дължината на низа до 80 знака:

$ string = fgets ($ file_handle, 81);

Помислете за "\ 0", края на реда в C и задайте дължината на един знак повече, отколкото всъщност ви трябва. Както можете да видите, примерът по-горе използва 81, докато имате нужда от 80 знака. Създайте си навик да добавяте допълнителен знак, когато трябва да зададете ограничение за дължина на низа за дадена функция.

Функция Fread

Функцията fgets е само една от многото функции, налични за четене на файл. Това е една от най-често използваните функции, тъй като обработката на файл ред по ред в повечето случаи е най-разумна. Всъщност няколко други функции предлагат подобни възможности. Анализът ред по ред обаче не винаги е това, което искате.

И тук се обръщаме към страха. Функцията fread се използва за малко по-различна цел от fgets: тя е предназначена за четене от двоични файлове (тоест файлове, които първоначално не са четим от човека текст). Тъй като концепцията за "низове" не е от значение за двоичните файлове (логическите структури от данни обикновено не са разбити на редове), трябва да посочите броя на байтовете за четене.

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

Горният пример чете 4096 байта (4 KB) данни. Имайте предвид, че независимо от стойността, която посочите, fread ще прочете не повече от 8192 байта (8 KB).

Ако приемем, че файлът е не повече от 8 KB, кодовият фрагмент по-долу трябва да прочете целия файл на един ред.

$ fh = fopen ("myfile", "rb"); $ data = fread ($ fh, размер на файла ("myfile")); fclose ($ fh);

Ако файлът е по-голям, ще трябва да използвате цикъл, за да прочетете останалата част от файла.

Функция Fscanf

Връщайки се към обработката на редове, обърнете внимание, че fscanf също е наследник на традиционната файлова библиотека C. Ако не сте запознати с нея, fscanf чете полета с данни в променливи от файл.

списък ($ поле1, $ поле2, $ поле3) = fscanf ($ fh, "% s% s% s");

Низовете за форматиране, използвани в тази функция, са документирани в много източници като PHP.net, така че няма да повтарям тази информация тук. Достатъчно е да се каже, че форматирането на низове е много гъвкаво. Трябва също да се спомене, че всички полета се поставят в променлива, върната от функцията. (В C те ще бъдат предадени като аргументи.)

Fgetss функция

Функцията fgetss е различна от традиционните файлови функции и ви дава по-добра представа какво може да прави PHP. Работи като fgets, но премахва всички HTML или PHP тагове, които среща, оставяйки само "гол" текст. Нека вземем долния HTML файл.

Листинг 2. Примерен HTML файл
Моето заглавие

Ако разбирате какво означава "Cause there ain" no one for to you no pain ", тогава слушате твърде много от групата America



Нека го стартираме през функцията fgetss.

Листинг 3. Използване на fgetss
$ file_handle = fopen ("myfile", "r"); while (! feof ($ file_handle)) (echo = fgetss ($ file_handle);) fclose ($ file_handle);

Ето какво получавате като изход:

Моето заглавие Ако разбирате какво означава "Cause there ain" no one for to you no pain ", тогава слушате твърде много от групата America

Функция Fpassthru

Независимо как четете данните от файла, можете да отпечатате останалите данни, като използвате стандартната изходна тръба, като използвате функцията fpassthru.

fpassthru ($ fh);

Тази функция отпечатва данните, така че не е необходимо да ги поставяте в променлива.

Нелинейна обработка на файла: придвижване през файла

Разбира се, горните функции ви позволяват само да четете от файл последователно. По-сложните файлове може да изискват да се преместите в различни части на файла в началото или в края. За да направите това, имате нужда от функцията fseek.

fseek ($ fh, 0);

Горният пример прескача обратно към началото на файла. Ако не искате да преминете към самото начало на файла - да речем, един килобайт е достатъчен - просто пишете:

fseek ($ fh, 1024);

От PHP V4.0 са налични и няколко други опции. Например, ако трябва да прескочите напред 100 байта от текущата си позиция, можете да използвате следния код:

fseek ($ fh, 100, SEEK_CUR);

По същия начин скачането на 100 байта назад се извършва от:

fseek ($ fh, -100, SEEK_CUR);

Ако искате да се върнете на 100 байта преди края на файла, използвайте вместо това SEEK_END.

fseek ($ fh, -100, SEEK_END);

След като достигнете новата си позиция, можете да използвате fgets, fscanf или друга функция, за да прочетете данните.

Забележка:не можете да използвате fseek за файлови дескриптори, препращащи URL адреси.

Заснемане на цял файл

Сега ще разгледаме някои от уникалните възможности на PHP за обработка на файлове: обработка на големи блокове данни в един или два реда. Например, как можете да вземете файл и да покажете цялото му съдържание на вашата уеб страница? Е, виждали сте пример за използване на цикъл с fgets. Но как можете да го улесните? Процесът е почти нелепо прост с fgetcontents, който поставя целия файл на низ.

$ my_file = file_get_contents ("myfilename"); ехо $ my_file;

Въпреки че не е най-добрият вариант, можете да напишете тази команда дори по-кратко:

echo file_get_contents ("myfilename");

Тази статия е основно за работа с локални файлове, но си струва да се отбележи, че можете също да улавяте, показвате и анализирате други уеб страници, като използвате описаните функции.

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

Тази команда всъщност е същата като:

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

Сигурно гледате тези примери и си мислите: „Това все още отнема твърде много време“. PHP разработчиците са съгласни с вас. Следователно можете да съкратите горната команда до:

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

Функцията readfile записва цялото съдържание на файл или уеб страница в изходния буфер по подразбиране. По подразбиране тази команда показва съобщение за грешка при неизправност. За да избегнете това поведение (ако го искате), опитайте командата:

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

Разбира се, ако трябва да обработите съдържанието на файловете, тогава единият ред, върнат от file_get_contents, вероятно е твърде много. Може да искате първо да го разделите на части с помощта на функцията split ().

$ масив = разделяне ("\ n", file_get_contents ("myfile"));

Но защо са ви нужни всички тези усложнения, ако има напълно подходяща функция, която ще свърши работата вместо вас? Функцията PHP file () прави това в една стъпка: връща масив от низове, чиито елементи са низовете на файла.

$ масив = файл ("myfile");

Трябва да се отбележи, че има малка разлика между двата примера по-горе. Командата split премахва нови редове, докато командата file завършва с нови редове (точно както при fgets).

Възможностите на PHP обаче далеч надхвърлят описаните по-горе. Можете да анализирате цели .ini файлове в PHP стил само с една команда parse_ini_file. Командата parse_ini_file се прилага за файлове, подобни на тези в листинг 4.

Листинг 4. Примерен .ini файл
; Име на коментар = мисия "Крал Артур" = За търсене на любимия цвят на светия Граал = Син Самюел Клеменс = Марк Твен Карин Джонсън = Упи Голдбърг

Следните команди представят файл като масив и след това отпечатват този масив:

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

Това ще произведе следния изход:

Листинг 5. Изход
Масив (=> Крал Артур => За търсене на Светия Граал => Син => Марк Твен => Упи Голдбърг)

Разбира се, можете да видите, че тази команда има обединени секции. Това е по подразбиране, но можете лесно да направите необходимите корекции, като използвате втория аргумент за parse_ini_file: process_sections, който е булева променлива. Задайте process_sections на True.

$ file_array = parse_ini_file ("holy_grail.ini", вярно); print_r $ file_array;

И вашият изход ще изглежда така:

Листинг 6. Изход
Масив (=> Масив (=> Крал Артур => За търсене на Светия Граал => Син) => Масив (=> Марк Твен => Упи Голдбърг))

PHP поставя данни в многоизмерен масив, който може лесно да бъде анализиран.

Но това е само върхът на айсберга, когато става въпрос за обработка на файлове в PHP. По-сложните функции като tidy_parse_file и xml_parse могат да ви помогнат да анализирате съответно HTML и XML документи. Вижте раздела за повече информация как работят тези функции. И двете си струва да се обмислят, ако работите с тези типове файлове, но вместо да разглеждате всички възможни файлови типове, можете внимателно да прочетете съдържанието на тази статия, където има някои добри общи правила за работа с функциите, които описах до тук.

Добър стил на програмиране

Никога не предполагайте, че всичко във вашата програма ще работи по предназначение. Например: какво ще стане, ако файлът, който търсите, е преместен? Ами ако в резултат на промяна в разрешенията не можете да прочетете съдържанието на файла? Можете да проверите предварително за съществуването на файл и разрешенията за четенето му, като използвате методите file_exists и is_readable.

Листинг 7. Използване на file_exists и is_readable
$ filename = "myfile"; if (file_exists ($ filename) && is_readable ($ filename)) ($ fh = fopen ($ filename, "r"); # Обработка fclose ($ fh);)

На практика обаче тази част от кода може би ще бъде прекомерна за вашата задача. Обработката на стойностите, върнати от fopen, е по-проста и по-точна.

if ($ fh = fopen ($ име на файл, "r")) (# Обработка fclose ($ fh);)

Тъй като fopen връща False при неуспех, това гарантира, че файлът се обработва само ако файлът може да бъде отворен. Разбира се, ако файлът не съществува или е нечетлив, очаквате връщаната стойност да бъде отрицателна. Следователно подобна проверка е капан, в който попадат всички потенциални проблеми. Като алтернатива можете да използвате прекратяване на програмата или да покажете съобщение за грешка, ако файлът не може да бъде отворен.

Подобно на fopen, функциите file_get_contents, file и readfile връщат False, ако файлът не може да бъде отворен или обработен. Функциите fgets, fgetss, fread, fscanf и fclose също връщат False при грешка. Разбира се, с изключение на fclose, вероятно вече сте обработили резултатите, които връщат. Що се отнася до fclose, има малко, което може да се направи, ако файловият дескриптор не се затвори правилно, така че проверката на върнатата стойност на fclose обикновено е излишна.

Изборът е твой

PHP няма недостиг на ефективни начини за четене и синтактичен анализ на файлове. Класическите функции като fread могат да ви служат надеждно през повечето време или може да бъдете по-привлечени от простотата на readfile, ако е необходимо, за да завършите задачата. Изборът наистина зависи от това, което се опитвате да постигнете.

Ако обработвате големи количества данни, fscanf вероятно ще бъде по-полезен и ефективен, отколкото, да речем, използването на файл във връзка с последващите команди split и sprintf. Като алтернатива, ако просто показвате голям текст с незначителни промени, функциите file, file_get_contents или readfile може да са по-подходящи. Това решение вероятно ще бъде правилно, когато използвате PHP за кеширане или дори създаване на временен прокси.

PHP предоставя много инструменти за работа с файлове. Запознайте се с всеки от тях по-добре и разберете кои инструменти са най-добри за проекта, по който работите. Предлагат ви голямо разнообразие от софтуерни инструменти, използвайте ги най-ефективно и се забавлявайте, обработвайки вашите файлове с PHP.

Последна актуализация: 1.11.2015

Подобно на повечето езици за програмиране, PHP поддържа работа с файлове, което е един от начините за съхранение на информация.

Четене и писане на файлове

Отваряне и затваряне на файлове

PHP дефинира функцията fopen () за отваряне на файлове. Има следната дефиниция: ресурс fopen (низ $ име на файл, низ $ режим). Първият параметър, $ filename, представлява пътя към файла, а вторият, отворения режим. В зависимост от целта на отваряне и типа на файла, този параметър може да приема следните стойности:

    "r": Файлът се отваря само за четене. Връща false, ако файлът не съществува

    "r +": Файлът се отваря само за четене с възможност за запис. Връща false, ако файлът не съществува

    "w": файлът се отваря за запис. Ако такъв файл вече съществува, той се презаписва, ако не, тогава се създава.

    "w +": Файлът се отваря за запис и може да се чете. Ако такъв файл вече съществува, той се презаписва, ако не, тогава се създава.

    "a": файлът се отваря за запис. Ако такъв файл вече съществува, данните се записват в края на файла, а старите данни остават. Ако файлът не съществува, тогава той се създава

    "a +": Файлът се отваря за четене и запис. Ако файлът вече съществува, данните се добавят в края на файла. Ако файлът не съществува, тогава той се създава.

Функцията fopen връща файлов дескриптор. Този манипулатор се използва за операции с файлове и за затварянето му.

След приключване на работата файлът трябва да бъде затворен с помощта на функцията fclose (), която приема файлов дескриптор като параметър. Например, нека отворим и затворим файл:

$ fd = fopen ("form.php", "r") или die ("не може да се отвори файл"); fclose ($ fd);

Конструкцията or die ("текст на грешка") ви позволява да прекратите скрипта и да покажете някакво съобщение за грешка, ако функцията fopen не може да отвори файла.

Четене на файл

Няколко функции могат да се използват за четене на файла. За четене ред по ред се използва функцията fgets (), която получава файлов дескриптор и връща един прочетен ред. Нека да преминем през целия файл ред по ред:

Всеки път, когато се извика fgets (), PHP ще постави показалеца в края на реда, който прочете. За проследяване на края на файл се използва функцията feof (), която връща true, когато файлът приключи. Докато се стигне до края на файла, можем да използваме функцията fgets ().

Четене на целия файл

В този случай не е необходимо да отваряме файла изрично, да получаваме дескриптора и след това да затваряме файла.

Блокиране на четене

Можете също да извършите четене блок по блок, тоест да прочетете определен брой байтове от файл с помощта на функцията fread ():

Функцията fread () приема два параметъра: файловия дескриптор за четене и броя на байтовете за четене. Когато се чете блок, показалецът на файла се премества до края на този блок. Освен това с помощта на функцията feof () можете да проследите завършването на файла.

Запис на файл

За да напишете файл, се използва функцията fwrite (), която записва ред във файла:

Друга функция fputs () работи по подобен начин:

Работа с указател на файл

Когато файл се отваря за четене или запис в режим "w", показалецът на файла се поставя в началото. Когато чете данни, PHP премества указателя на файла до края на блока с прочетени данни. Въпреки това можем ръчно да манипулираме показалеца на файла и да го настроим на произволно място. За да направите това, използвайте функцията fseek, който има следното формално определение:

Int fseek (ресурс $ манипулатор, int $ изместване [, int $ откъдето = SEEK_SET])

Параметърът $ handle представлява манипулатор на файла. Параметърът $ offset е отместването в байтове спрямо началото на файла, от който ще започне четенето/записването. Третият незадължителен параметър указва как се задава отместването. Може да приеме три стойности:

    SEEK_SET: стойност по подразбиране, задава отместването в отместени байтове от началото на файла

    SEEK_CUR: задава отместване в отместени байтове от началото на текущата позиция във файла

    SEEK_END: ​​задава отместване на байтове от края на файла

Ако показалецът е настроен успешно, функцията fseek () връща 0, а ако е неуспешна, връща -1.

Пример за използване на функцията:

$ fd = fopen ("hello.txt", "w +") или умре ("не може да се отвори файл"); $ str = "Здравей свят!"; // низ за запис fwrite ($ fd, $ str); // записване на низа в началото fseek ($ fd, 0); // поставяме указателя на файла в началото fwrite ($ fd, "Oink"); // записва в началото реда fseek ($ fd, 0, SEEK_END); // поставяме показалеца в края fwrite ($ fd, $ str); // добавяне на още един ред в края fclose ($ fd);

Всеки програмист трябва да може да работи правилно с файлове. Тази статия е насочена към начинаещи PHP програмисти, но "колекцията от рецепти" ще бъде полезна за напреднали потребители.

Работата с файлове е разделена на 3 етапа:

  1. Отваряне на файл.
  2. Манипулиране на данни.
  3. Затваряне на файла.

аз. Отваряне на файл

За да отворите файл в PHP средата, използвайте функцията fopen ()... Необходимите параметри за тази функция са името на файла и файловия режим.

$ fp = fopen ("counter.txt", "r");

Според документацията на PHP се разграничават следните типове файлови режими:

  1. r - отворен файл само за четене.
  2. r + - отваря файл едновременно за четене и запис.
  3. w - създаване на нов празен файл. Ако в момента на повикването такъв файл вече съществува, той се унищожава.
  4. w + - е подобен на r +, само ако такъв файл съществува в момента на повикването, съдържанието му се изтрива.
  5. a - отваря съществуващ файл в режим на запис, докато показалецът се премества към последния байт на файла (към края на файла).
  6. a + - отваря файл в режим на четене и запис, докато показалецът се измества към последния байт на файла (към края на файла). Съдържанието на файла не се изтрива.

Забележка: може да има още един незадължителен параметър в края на всеки от редовете: b или t. Ако b е посочено, тогава файлът се отваря в двоичен режим на четене/запис. Ако t, тогава режимът на превод на ред е зададен за файла, т.е. възприема се като текстово.

За демонстрация помислете за следния сценарий:

// Отваря файла в различни режими
$ fp = fopen ("counter.txt", "r"); // Двоичен режим
$ fp = fopen ("counter.txt", "rt"); // Текстов режим
$ fp = fopen ("http://www.yandex.ru", "r"); // Отваря HTTP връзка за четене
$ fp = fopen ("ftp: // потребител: [защитен с имейл]"," w "); // Отворете FTP връзка с потребителско име и парола
?>

II... Манипулиране на файлови данни

Можете да записвате данни във файл, като използвате PHP, като използвате функцията fwrite ()... Тази функция приема 2 задължителни параметъра и 1 незадължителен. Необходимите параметри са файлов дескриптор и файлов режим:

$ fp = fopen ("counter.txt", "a"); // Отворете файла в режим на запис
$ mytext = "Трябва да напишем този ред \ r \ n"; // Изходен низ
$ test = fwrite ($ fp, $ mytext); // Записване във файл
if ($ test) echo "Данните са въведени успешно във файла.";
else echo "Грешка при записване във файл.";
fclose ($ fp); // Затваряне на файла
?>

За да прочетете файла ред по ред, използвайте функцията fgets ()... Функцията приема 2 задължителни параметъра:


ако ($ fp)
{
докато (! feof ($ fp))
{
$ mytext = fgets ($ fp, 999);
echo $ mytext."
";
}
}

fclose ($ fp);
?>

Забележка: В този пример стойността 999 определя броя на знаците, които ще бъдат прочетени, докато показалецът достигне края на файла (EOF).

За да прочетете файла като цяло, трябва да използвате функцията readfile ()който отнема 1 задължителен параметър. Функцията отваря файл, показва съдържанието му в прозореца на браузъра и след това затваря файла:

echoreadfile ("counter.txt");
?>

Можете също да използвате функцията fpassthru (), която приема 1 задължителен параметър. Преди да използвате тази функция, трябва да отворите файла в режим на четене. Когато файлът приключи с четенето, функцията автоматично затваря файла (и дескрипторът на файла става невалиден).

$ fp = fopen ("counter.txt", "r"); // Отворете файла в режим на четене
if ($ fp) echo fpassthru ($ fp);
elseecho "Грешка при отваряне на файл";
?>

Много често има ситуации, когато е необходимо да се прочете съдържанието на сайта в масив. Тази функция се осигурява чрез използване на функцията файл ()... Когато тази функция бъде извикана, всеки ред от файла ще бъде запазен в отделен елемент от посочения масив.

Забележка: Не използвайте функцията файл ()към двоични файлове (бинарно-безопасни), т.к не е безопасно по отношение на четенето на двоични файлове, ако в същото време някъде има знак за край на файла (EOF), тогава това не гарантира, че четете целия двоичен файл.

$ file_array = файл ("counter.txt"); // Прочетете файла в $ file_array
// Работи с данни от масив
?>

Забележка: Работата с масиви е описана подробно, автори: Mukhametshin D.F., Simdyanov I.V.

В края на статията ще намерите добра „книга с рецепти“ за масиви, която предоставя решение на много от проблемите, с които уеб програмист се сблъсква ежедневно.

Нека си представим ситуация, в която файл трябва да се чете символ по знак. За това можем да използваме функцията fgetc ()... Функцията приема един параметър. Функцията е полезна, ако трябва да намерим някакъв знак или броя на еднакви знаци.

$ fp = fopen ("counter.txt", "r"); // Отворете файла в режим на четене
ако ($ fp)
{
докато (! feof ($ fp))
{
$ char = fgetc ($ fp);
if ($ char == "c") $ i = $ i + 1; // Намерете знака "c"
}
echo "Брой букви" c "във файл:". $ i;
}
else echo "Грешка при отваряне на файл";
?>

III... Затваряне на файла

Затваряне на файла с помощта на функцията fclose ()който приема 1 задължителен параметър.

$ fp = fopen ("counter.txt", "r");
ако ($ fp)
{
echo "Отворен файл";
fclose ($ fp); // Затваряне на файла
}
?>

Колекция от рецепти

1) Трябва да проверим дали този или онзи файл съществува. За да направим това, ще използваме функцията файлът съществува ().

myfile ("counter.txt"); // Използвайте функцията myfile, предавайки името на файла като аргумент

function myfile ($ име) // Създайте функция, за да проверите дали файл съществува
{
if (file_exists ($ име)) echo "Файлът съществува";

}
?>

Забележка: Функция файлът съществуване проверява файлове на отдалечения уеб сървър. За да работи функцията правилно, скриптовият файл трябва да се намира на сървъра, където се намира проверяваният файл.

2) Определете размера на файла с помощта на функцията размер на файла()

myfile ("counter.txt");

function myfile ($ име) // Създаване на функция за проверка за съществуването на файл и определяне на размера на файла
{
if (file_exists ($ име)) echo "Размер на файла:" .filesize ($ име). "байт";
else echo "Файлът не съществува";
}
?>

3) Създайте временен файл с помощта на функция tmpfile()

$ myfile = tmpfile ();
fwrite ($ myfile, "Този ред е записан във временен файл."); // Записване във временен файл
fseek ($ myfile, 0); // Задаване на показалеца на файла
echo fread ($ myfile, 1024); // показва съдържанието на файла
?>

4) Трябва да дефинирате броя на редовете във файла. За това използваме функцията броя()

$ fp = файл ("counter.txt");
echo "Брой редове във файла:" .count ($ fp);
?>

5) Трябва да използваме механизма за заключване на файлове

$ fp = fopen ("counter.txt", "a");
стадо ($ fp, LOCK_EX); // Заключване на файла за запис
fwrite ($ fp, "Стринг за запис");
стадо ($ fp, LOCK_UN); // Отключи
fclose ($ fp);
?>

6) Трябва да премахнем конкретен ред от файла

$ брой_строка = 5; // Премахване на ред 5 от файла
$ файл = файл ("counter.txt"); // Прочетете целия файл в масив

за ($ i = 0; $ i< sizeof($file); $i++)
if ($ i == $ num_stroka) unset ($ файл [$ i]);

$ fp = fopen ("counter.txt", "w");
fputs ($ fp, implode ("", $ файл));
fclose ($ fp);
?>

7) Определяне на типа на файла. Използваме функцията