Php и twig: создание шаблонов веб страниц

Closure::call — вызов анонимной функции с указанием контекста

Это не столько неожиданность, сколько интересная особенность, о которой мало кто знает.


PHP замыкания (анонимные функции) можно вызывать передавая в них контекст (объект). В результате замыкание можно использовать как метод переданного объекта.

Для этого в объекте замыкания есть метод:

call( $that, ...$params )
$that(object)
Объект для привязки к замыканию на время его вызова.
…$params
Сколько угодно параметров, которые передаются в замыкание.

Пример того как это использовать

class Value {

	protected $value;

	function __construct( $value ){
		$this->value = $value;
	}

	function get_value(){
		return $this->value;
	}
}

$three = new Value( 3 );
$four  = new Value( 4 );

$closure = function( $delta ){
	echo $this->get_value() + $delta;
};

$closure->call( $three, 4 ); // 7
$closure->call( $four,  4 ); // 8

Что мы видим? При вызове одного и того же замыкания мы получаем разный результат, который зависит от контекста вызова (от того какой объект передается и используется в замыкании).

Книги по PHP:

1.PHP. Объекты, шаблоны и методики программирования

За последние десять лет PHP буквально охватила объектно-ориентированная революция, причем это относится как к самим средствам языка, так и к разработчикам, использующим эти средства, и к приложениям, которые они создают. Теперь основной акцент делается на объектах и объектно-ориентированном подходе к проектированию.

2.Разработка веб-приложений с помощью PHP и MySQL

Авторы: Люк Веллинг, Лаура Томсон

Исчерпывающее учебное пособие по разработке веб-приложений, управляемых базами данных, с использованием PHP программирования и MySQL! Эта книга предназначена для тех, кто знаком с основами HTML и ранее разрабатывал программы на современных языках программирования, но, возможно, не занимался программированием для Веб или не использовал реляционные базы данных.

3.Создаем динамические веб-сайты с помощью PHP, MySQL, JavaScript и CSS

Научитесь создавать современные динамические веб-сайты, даже если у вас нет опыта в программировании. Если вы умеете писать статические сайты на HTML, то с помощью этого руководства вы освоите динамическое веб-программирование и изучите современные технологии с открытым кодом: PHP, MySQL, JavaScript и CSS.

4.PHP и MySQL. От новичка к профессионалу

Это практическое руководство станет незаменимым помощником для тех, кто желает создавать сайты на основе базы данных. В пятом издании этого бестселлера вы узнаете, как с помощью PHP программирования, используемого в 20 миллионах сайтов по всему миру, создать собственную систему управления содержимым (CMS) на основе исключительно бесплатного программного обеспечения.

Список книг, разумеется, не полный, но среди них обязательно найдете полезную для себя. Также на ютюбе много роликов, где рассказывают об основах PHP программирование. Они помогут освоить язык на практике.

PHP тесно связано с работой HTML — документов. В книгах, зачастую, все примеры показаны на взаимодействии этих двух языков. Поэтому рекомендую для начала получить базовые знания HTML.

Как будем вести журнал?

При работе с файловой системой ext3 можно выбрать один из режимов журнала:

  1. Журнал (Journal)
  2. Последовательный (Ordered)
  3. Обратная запись (Writeback)

Режим «Журнал» позволяет минимизировать потери при отключении питания, но является наиболее медленным из всех трех режимов. Данный режим и подразумевает запись всех изменений метаданных файловой системы, а также информации о других изменения файловой, системы в журнале.

В более быстром режиме «Последовательный» производится запись в журнал только сведений об изменении метаданных, причем запись в журнал производится перед изменением самих метаданных. Данный режим установлен по умолчанию. Самый быстрый режим – это «Обратная запись». В этом режиме записываются в журнал только сведения об имениях в файлах данных.

Какой режим выбрать? Если твой сервер является файловым (FTP, WWW-сервер), то есть таким, который используется пользователями для хранения файлов, выбери режим «Журнал» — пользователи будут благодарны. Пусть в этом режиме сервер будет работать чуть медленнее, зато в случае ЧП можно минимизировать потери информации. Во всех остальных случаях нужно установить режим «Последовательный», точнее вообще не нужно ничего устанавливать – он используется по умолчанию. Последний режим не нужно использовать – зачем тогда использовать ext3??? Для установки нужного режима используется параметр data файла /etc/fstab:

Листинг 1. /etc/fstab



# Режим Ordered

Можно явно не указывать, поскольку используется по умолчанию /dev/hda1 / ext3 data=ordered 1 0 # Режим Journal для домашнего каталога пользователей /dev/hda2 /home ext3 data=journal 1 0 # На этом разделе нет ничего важного – режим writeback /dev/hda3 /opt ext3 data=writeback 1 0. После изменения файла fstab нужно заново смонтировать файловые системы или, по примеру Microsoft, перезагрузить весь компьютер

После изменения файла fstab нужно заново смонтировать файловые системы или, по примеру Microsoft, перезагрузить весь компьютер.

Увеличитель числа ++

Имеет большое значение в каком положении использовать ++ (инкремент, увеличитель).

++$i — увеличивает на 1, сразу — при текущем вызове .$i++ — увеличит на 1, при следующем вызове .

$i = 0;

echo $i++; //> 0 - число увеличится при следующем вызове
echo $i;   //> 1 - увеличилось
echo ++$i; //> 2 - число увеличивается сразу

// сейчас $i = 2

// увеличивать можно внутри условий, индексов массивов - где угодно
if( $i++ == 2 ) echo $i; //> 3
$array; //> просим элемент массива с индексом 4

// однако нужно учитывать положение множителя - до или после переменной
// в обоих случаях проверяемое число будет разное...

// сейчас $i = 4

$array = array( 5 => 'foo' );
$array; //> ошибка - индекса нет, потому что мы просим 4

— уменьшитель (декремент) работает точно также…

Повторим еще раз:

Пример Название Действие
инкремент до Увеличивает $a на 1, затем возвращает значение $a.
инкремент после Возвращает значение $a, затем увеличивает $a на 1.
декремент до Уменьшает $a на 1, затем возвращает значение $a.
декремент после Возвращает значение $a, затем уменьшает $a на 1.

Как установить сайт бесплатно

Хостинг позволяет бесплатно разместить до 5 проектов. Сначала надо зарегистрироваться, получив бесплатную учетную запись.

Учет работы Dyno

Учетная запись предоставляет 550 часов в месяц бесплатного использования Dyno. В дополнение к этим базовым часам счета, можно получить дополнительно 450 часов ежемесячной бесплатной работы приложений. Для этого потребуется зарегистрировать платёжную карту. Деньги взиматься не будут, просто надо ее зарегистрировать. Карту, которую я зарегистрировал на этом ресурсе, я уже выкинул, так как у нее закончился срок использования. А сервис никак на это не реагирует, не ругается. Кстати, регистрация карты предоставляет и другие опции.


Халявные dynos обладают уникальным свойством – они умеют ложиться спать после 30-минутного бездействия сайта. Таким образом, расход часов прекращается. Условия бездействия:

  • отсутствие трафика, т.е. веб dynos не действуют;
  • рабочие dynos не работают.

Необходимо выполнение обоих условий.

При появлении трафика dynos просыпаются с небольшой малозаметной задержкой.

После израсходования всех часов в течение месяца, приложения засыпают и спят оставшуюся часть месяца.

Как определить остаток бесплатной работы Dyno

Посмотреть оставшиеся свободные часы можно используя Heroku CLI — надо набрать команду в командной строке

heroku ps -a .

Или узнать это в своем аккаунте этого хоста на странице управления счетами на вкладке Billing. На рисунке показан пример расхода бесплатных часов в биллинге.

Расход бесплатных часов моими проектами на Хероки на 22 число месяца.

Alice-yandex — это приобретенный Алисой, навык «Заработок в интернете — финансово-выгодный». Предлагает ресурсы для зарабатывания в интернете.

Ninja-adaptive — моя учебная работа по изготовлению адаптивной страницы

После расхода 80% запаса свободных часов придет уведомление на электронную почту. Второе уведомление придет после 100% расхода квоты времени, и приложения будут спать до конца текущего месяца.

Установка сайта

Для развертывания приложений следует установить на локальную машину популярную систему контроля версиями Git, интерфейс командной строки Heroku (CLI). CLI — важная часть использования Хероку. Он упрощает создание и управление приложениями Героку непосредственно с терминала. Скачать для установки его на свою машину можно с официальной страницы https://devcenter.heroku.com/articles/heroku-cli.

Чтобы установить сайт с кодом PHP дополнительно потребуется установка Composer (перевод с английского – Композитор).

Последовательность действий для установки сайта

  1. Зайти в системную консоль (cmd.exe) от имени администратора, набрать команду

    heroku login

    нажать ввод Enter

  2. Затем ввести адрес электронной почты, пароль.

    После правильных вводов появится сообщение: Logged in as

  3. Если проект не загружен на сервис GitHub, а находится на жестком диске компьютера, зайти в папку для него, или создать ее.

  4. Создать локальный репозиторий, набрав

    git init

  5. Загрузить в эту папку репозитория файлы сайта.

    1. Создать и загрузить файл , другие необходимые для Хероку файлы, например при загрузке сайта PHP.


    2. Если файл composer.json не пустой, создать файл composer.lock, выполнив команду

      composer update.

  6. Чтобы добавить и закрепить файлы в репозитории, выполнить последовательно действия:

    git add .

    git commit -am «».

  7. Создать приложение на Героку, которое готовит хостинг для получения исходного кода:

    heroku create

  8. Развернуть свой код

    git push heroku master

  9. Заключительное действие — открыть сайт в окне браузера

    heroku open

Всё, сайт успешно установлен на облачный хостинг!

Что может сделать злоумышленник?

Это зависит от конкретного запроса, а также способа его запуска.

Если запрос выполняется не через функцию mysqli_multi_query(), которая поддерживает мультизапросы (несколько запросов через точку с запятой), тогда у злоумышленника нет возможности выполнить совсем произвольный запрос вроде такого:

Так сделать не получится, поскольку выполнение нескольких запросов по-умолчанию не поддерживается.

Но кое-что плохое злоумышленник сделать может. Например, с помощью UNION можно получить любые данные из любых таблиц.

Представим, что у нас есть таблица articles с 4 полями: id | title | content | created_at, а также таблица users с 3 полями: id | login | password.

Поскольку UNION позволяет объединять данные из таблиц только с одинаковым количеством столбцов, злоумышленник может указать 2 необходимых ему столбца, а остальные 2 заполнить любыми значениями, например единицами:

В итоге вместо title и content на страницу будут выведены login и password одного из пользователей. И это только один из десятков возможных вариантов взлома.

Преимущества Symfony¶

В следующих главах вы узнаете больше о том, как работает каждая составляющая Symfony, и как вы можете организовать свой проект. Сейчас же, ещё раз порадуемся улучшению вашей жизни с переносом блога с чистого РНР на Symfony:

  • Ваше приложение теперь имеет простой, понятный и единообразный код (хотя Symfony не требует этого от вас). Это поощряет повторное использование и позволяет новым разработчикам быстрее становиться продуктивными в рамках вашего проекта;
  • 100% написанного вами кода относится к вашему приложению. Вам не нужно разрабатывать и поддерживать низкоуровневые инструменты вроде автозагрузки, маршрутизации или рендеринга контроллеров;
  • Symfony предоставляет вам доступ к инструментам с открытым кодом, таким как Doctrine и компонентам вроде Templating, Security, Form, Validator и Translation;
  • у приложения появились полностью настраиваемые URL благодаря компоненту Routing;
  • архитектура Symfony, основанная на НТТР, предоставляет вам доступ к мощным инструментам вроде НТТР-кеширования, основанного на внутреннем НТТР-кеше Symfony, или еще более мощным инструментам, таким как Varnish (кеширующий прокси). Об этом рассказывается далее, в главе о кешировании.

И, возможно, лучшее из всего – используя Symfony, вы теперь имеете доступ к целому ряду высококачественных инструментов с открытым исходным кодом, разработанных участниками Symfony сообщества! Хороший выбор общественных инструментов Symfony можно найти на GitHub.

PHP include and require Statements

It is possible to insert the content of one PHP file into another PHP file (before the server executes it), with the include or require statement.

The include and require statements are identical, except upon failure:

  • will produce a fatal error (E_COMPILE_ERROR) and stop the script
  • will only produce a warning (E_WARNING) and the script will continue

So, if you want the execution to go on and show users the output, even if the include file is missing, use the include statement. Otherwise, in case of FrameWork, CMS, or a complex PHP application coding, always use the require statement to include a key file to the flow of execution. This will help avoid compromising your application’s security and integrity, just in-case one key file is accidentally missing.

Including files saves a lot of work. This means that you can create a standard header, footer, or menu file for all your web pages. Then, when the header needs to be updated, you can only update the header include file.

Example Explained

In the example above, when a user selects a person in the dropdown list above, a function called «showUser()» is executed.

The function is triggered by the onchange event.

Here is the HTML code:

Example


<html><head><script>function showUser(str) {  if (str == «») {     document.getElementById(«txtHint»).innerHTML = «»;    return;   } else {     var xmlhttp = new XMLHttpRequest();    xmlhttp.onreadystatechange = function() {      if (this.readyState == 4 && this.status == 200) {        document.getElementById(«txtHint»).innerHTML = this.responseText;       }    };    xmlhttp.open(«GET»,»getuser.php?q=»+str,true);     xmlhttp.send();  }}</script></head><body><form> <select name=»users» onchange=»showUser(this.value)»>  <option value=»»>Select a person:</option>  <option value=»1″>Peter Griffin</option>  <option value=»2″>Lois Griffin</option>  <option value=»3″>Joseph Swanson</option>  <option value=»4″>Glenn Quagmire</option>  </select></form><br><div id=»txtHint»><b>Person info will be listed here…</b></div></body></html>

Code explanation:

First, check if person is selected. If no person is selected (str == «»), clear the content of txtHint and exit the function. If a person is selected, do the following:

  • Create an XMLHttpRequest object
  • Create the function to be executed when the server response is ready
  • Send the request off to a file on the server
  • Notice that a parameter (q) is added to the URL (with the content of the dropdown list)

Добавление страницы блога «один пост»¶

Страница блога «список постов» была оптимизирована для того, чтобы код был более организованным и был пригоден для повторного использования. Для того, чтобы доказать это, добавьте страницу блога «один пост», которая будет отображать отдельные посты блога по параметру в запросе.

Для начала, создайте новую функцию в файле , которая будет отображать отдельную запись в блоге по данному id:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
// model.php
function get_post_by_id($id)
{
    $link = open_database_connection();

    $query = 'SELECT created_at, title, body FROM post WHERE  id=:id';
    $statement = $link->prepare($query);
    $statement->bindValue(':id', $id, PDO::PARAM_INT);
    $statement->execute();

    $row = $statement->fetch(PDO::FETCH_ASSOC);

    close_database_connection($link);

    return $row;
}

Далее, создайте новый файл под названием – контроллер для новой страницы:

1
2
3
4
5
6
// show.php
require_once 'model.php';

$post = get_post_by_id($_GET'id']);

require 'templates/show.php';

Наконец, создайте новый файл-шаблон для отображения отдельного поста из блога:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<!-- templates/show.php -->
<?php $title = $post'title' ?>

<?php ob_start() ?>
    <h1><?= $post'title' ?></h1>

    <div class="date"><?= $post'created_at' ?></div>
    <div class="body">
        <?= $post'body' ?>
    </div>
<?php $content = ob_get_clean() ?>

<?php include 'layout.php' ?>

Создать вторую страницу теперь очень просто, и при этом код не дублируется. Тем не менее, эта страница добавляет еще больше проблем, которые вам поможет решить фреймворк. Например, отсутствующий или неверный параметр запроса приведет к ошибке приложения. Было бы лучше, если бы это вызывало отображение страницы 404, но это пока не так просто сделать.

Dynos — сердце Heroku хостинга

Хероку платформа использует модель контейнера для запуска и масштабирования приложений.

Контейнеры, используемые в работе, называются «dynos». Это изолированные виртуальные контейнеры Linux, предназначенные для выполнения кода на основе заданной пользователем команды. Приложение может масштабироваться до любого количества контейнеров на основе требований к ресурсам. Возможность управления контейнерами предоставляют Heroku простой способ масштабировать, управлять количеством, размером и типом dynos, которые могут понадобиться проекту в любой момент времени.

Принцип работы строительных блоков – dynos

Variables From External Sources

HTML Forms (GET and POST)

When a form is submitted to a PHP script, the information from that form is automatically made available to the script. There are few ways to access this information, for example:

Example #1 A simple HTML form

<form action="foo.php" method="post">
    Name:  <input type="text" name="username" /><br />
    Email: <input type="text" name="email" /><br />
    <input type="submit" name="submit" value="Submit me!" />
</form>

As of PHP 5.4.0, there are only two ways to access data from your HTML forms. Currently available methods are listed below:

Example #2 Accessing data from a simple POST HTML form

There were some other ways of accessing user input in old PHP versions. These are listed below. See changelog at the bottom of the page for more details.

Example #3 Old methods of accessing user input

Using a GET form is similar except you’ll use the appropriate GET predefined variable instead. GET also applies to the QUERY_STRING (the information after the ‘?’ in a URL). So, for example, http://www.example.com/test.php?id=3 contains GET data which is accessible with $_GET. See also $_REQUEST.

PHP also understands arrays in the context of form variables (see the related faq). You may, for example, group related variables together, or use this feature to retrieve values from a multiple select input. For example, let’s post a form to itself and upon submission display the data:

Example #4 More complex form variables

IMAGE SUBMIT variable names

When submitting a form, it is possible to use an image instead of the standard submit button with a tag like:

When the user clicks somewhere on the image, the accompanying form will be transmitted to the server with two additional variables, sub_x and sub_y. These contain the coordinates of the user click within the image. The experienced may note that the actual variable names sent by the browser contains a period rather than an underscore, but PHP converts the period to an underscore automatically.

HTTP Cookies

PHP transparently supports HTTP cookies as defined by » RFC 6265. Cookies are a mechanism for storing data in the remote browser and thus tracking or identifying return users. You can set cookies using the setcookie() function. Cookies are part of the HTTP header, so the SetCookie function must be called before any output is sent to the browser. This is the same restriction as for the header() function. Cookie data is then available in the appropriate cookie data arrays, such as $_COOKIE as well as in $_REQUEST. See the setcookie() manual page for more details and examples.

If you wish to assign multiple values to a single cookie variable, you may assign it as an array. For example:

That will create two separate cookies although MyCookie will now be a single array in your script. If you want to set just one cookie with multiple values, consider using serialize() or explode() on the value first.

Note that a cookie will replace a previous cookie by the same name in your browser unless the path or domain is different. So, for a shopping cart application you may want to keep a counter and pass this along. i.e.

Example #5 A setcookie() example

Dots in incoming variable names

Typically, PHP does not alter the names of variables when they are passed into a script. However, it should be noted that the dot (period, full stop) is not a valid character in a PHP variable name. For the reason, look at it:

Now, what the parser sees is a variable named $varname, followed by the string concatenation operator, followed by the barestring (i.e. unquoted string which doesn’t match any known key or reserved words) ‘ext’. Obviously, this doesn’t have the intended result.

For this reason, it is important to note that PHP will automatically replace any dots in incoming variable names with underscores.

Determining variable types

Because PHP determines the types of variables and converts them (generally) as needed, it is not always obvious what type a given variable is at any one time. PHP includes several functions which find out what type a variable is, such as: gettype(), is_array(), is_float(), is_int(), is_object(), and is_string(). See also the chapter on Types.

HTTP being a text protocol, most, if not all, content that comes in Superglobal arrays, like $_POST and $_GET will remain as strings. PHP will not try to convert values to a specific type. In the example below, $_GET will contain the string «null» and $_GET, the string «123».

/index.php?var1=null&var2=123

В чем отличие между функциями isset(), empty() и is_null() в PHP?

Из приведенных выше определений видно, что эти три функции выполняют сходные, но не одинаковые функции. С помощью этих функций вы можете проверять, является ли переменная нулевой (NULL), истинной (TRUE) или ложной (FALSE), а также была ли переменная объявлена.

Когда использовать функцию empty()?

При использовании , вы можете проверять, является ли переменная ложной (false), но также и то, существует ли переменная. Эту функцию лучше всего использовать, когда вы хотите убедиться, что переменная существует и имеет значение, которое не равно

Обратите внимание, что PHP будет обрабатывать пустые строки, целые числа 0, числа с плавающей запятой 0.0, пустые массивы и логическое значение как false. Таким образом, в основном, используйте только тогда, когда вы хотите убедиться, что в переменной есть какое-то фактическое значение

Поскольку вам не нужно объявлять переменные перед их использованием в PHP, вы можете оказаться в ситуации, когда вы пытаетесь выполнить действия или запустить другую проверку для переменной, которая еще не была объявлена. Хотя по этой и другим причинам рекомендуется объявлять переменные перед использованием, эта ошибка – одна из причин того, что используется не так, как .

Когда использовать функцию isset()?

Если вы используете , вы можете специально проверять, была ли переменная уже объявлена ​​и что ее значение не равно . Таким образом, пока у вас есть объявленная переменная, у которой установлено значение, но не значение , при тесте вы получите . Это хорошее условие для проверки, перед выполнением других проверок для выполнения действий с переменной. Пример:

<?php
$variable = 'Какая-то строка'; // Объявление переменной
// Проверка существования переменной, затем проверка значения
if ( isset($variable) && $variable !== 'Какая-то другая строка' ) {
  echo 'Этот код сработает, поскольку оба условия верны';
}
?>

В приведенном выше примере мы объявили нашу переменную в виде строки, а затем проверили, установлена ли переменная (установлена), и она не равна другой строке (она не равна). Поскольку оба этих условия верны, мы в этом условии можем проводить дальнейшие действия с переменной и ее значением.

Когда использовать функцию is_null()?

Наконец, функция работает аналогично функции , с одним ключевым отличием: переменная должна быть объявлена, чтобы вернулся , даже при условии, что она объявлена без какого-либо значения или определена как .

В противном случае функция не только не будет правильно работать, но и будет возвращать уведомление из-за невозможности провести проверку. Обычно уведомление выглядит примерно так:

Notice:  Undefined variable: variable in /{PATH}/ on line X

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

Какой ответ возвращают функции isset(), empty() и is_null() в PHP

В приведенной ниже таблице рассмотрены основные результаты использования данных функций в PHP коде:

Значение переменной ($var)
«» (пустая строка) bool(true) bool(true) bool(false)
» » (пробел) bool(true) bool(false) bool(false)
FALSE bool(true) bool(true) bool(false)
TRUE bool(true) bool(false) bool(false)
array() (пустой массив) bool(true) bool(true) bool(false)
NULL bool(false) bool(true) bool(true)
«0» (0 в виде строки) bool(true) bool(true) bool(false)
0 (0 в виде целого числа) bool(true) bool(true) bool(false)
0.0 (0 в виде числа с плавающей точкой) bool(true) bool(true) bool(false)
переменная $var; (переменная объявлена, но без значения) bool(false) bool(true) bool(true)

На сегодня все. Спасибо, что читаете нас!

Какой журнал лучше?

Обычные файловые системы — или работа без журнала?

Совсем недавно стандартной файловой системой Linux была файловая система ext2. С момента своего появления файловая система ext3 уверенно «набирала обороты» и если, скажем, года два назад никто бы не рискнул установить на сервер новую файловую систему ext3, то сейчас она используется в большинстве случаев. Программы установки практически всех дистрибутивов предлагают файловую систему ext3 по умолчанию. Файловая система ext3 появилась в составе Linux с момента выхода ядра версии 2.4.16. Впервые она появилась в дистрибутивах RedHat и SuSE.

Некоторые источники сообщают, что файловая система ext3 – это всего лишь «надстройка» над файловой системой ext2, а не самостоятельная файловая система. В этом утверждении есть доля правды. И в самом деле, файловая система ext3 совместима со всеми программами для обслуживания и настройки файловой системы ext2. Попробуем разобраться, так ли это?

В начале файловой системы находится таблица размещения файлов, в которой прописаны физические координаты частей файла: ведь теперь файлы записываются не последовательно, поэтому обойтись начальным адресом и смещением относительно него уже нельзя: файловая система должна помнить, где находится каждая часть файла. Теперь разберемся, что такое целостность файловой системы. Файловую систему можно считать целостной, если один блок данных принадлежит одному и только одному файлу, то есть изменение одного файла или каталога не приводит к изменению другого файла или каталога. Иногда при проверке файловой системы в Windows иногда обнаруживается, что кластеры «пересекаются», то есть один кластер принадлежит двум или более файлам сразу. Обычно такие файлы нужно удалить, хотя есть возможность обрезать файл до момента коллизии, чтобы сохранить хоть какую-то часть файла. В случае с текстовыми файлами это помогает – хоть что-то да и останется, а вот двоичные файлы можно удалять сразу.

В начале каждой файловой системы есть «чистый бит». При подключении (монтировании) файловой системы этот бит стирается, что означает, что файловая система используется в данный момент. При завершении работы (размонтировании файловой системы) этот бит устанавливается, что говорит о правильном размонтировании файловой системы. Если при загрузке операционная система обнаруживает, что чистый бит не установлен, она запускает средство проверки файловой системы – в Linux это программа fsck, а в Windows – scandisk. Программа проверки файловой системы проверяет не что иное, а целостность файловой системы.

Когда же чистый бит не может быть установлен? Обычно тому есть две причины:

  • Отключение питания компьютера или перезагрузка компьютера кнопкой Reset, что приравнивается к отключению питания
  • Сбой программы (это больше касается Windows) или даже ядра (тоже больше подходит для Windows, но может случиться с любой ОС) операционной системы, что приводит к зависанию компьютера

Целостность файловой системы может быть нарушена, если программа (или сама операционная система) записывала данные на диск, и в этот момент произошло отключение питания

Это хорошо, если отключение питания произошло во время записи программой какого-то файла, пусть и очень важного. Файл можно восстановить хотя бы частично

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


С этим читают