This page has been robot translated, sorry for typos if any. Original content here.

Session PHP (Fichiers, répertoires et PHP, Travailler avec des fichiers)



file_exists
Avant d'effectuer des opérations sur un fichier, vous devez souvent vérifier que le fichier spécifié existe bien. C'est la fonction de file_exists. Cette fonction peut renvoyer seulement deux valeurs, comme vous le comprenez, TRUE (si le fichier spécifié existe) et FALSE. Habituellement, l'utilisation de cette fonction ressemble à ceci:
if ( !file_exists("somefile.txt") ) exit("Указанный файл не существует");
Notez que la fonction ne fonctionne que sur les fichiers locaux, c'est-à-dire si vous voulez vérifier si Yandex a un fichier robot.txt, vos efforts seront inutiles. Mais il est possible de vérifier n'importe quel fichier sur le serveur local, quel que soit le répertoire de son emplacement.

taille de fichier

Comme son nom l'indique, la fonction détermine la taille du fichier et le renvoie en octets. C'est utile si vous voulez vérifier la présence d'informations dans le fichier (comme vous le comprenez, le fichier vide contient 0 octet), et il est également possible de vérifier la taille du fichier pour dépasser une certaine limite.


fichier

Cette fonction fonctionne déjà directement avec le fichier. Il renvoie le contenu du fichier spécifié, et il le fait en tant que tableau, où chacun de ses éléments est la chaîne du fichier. Cette fonction est utile lorsque vous devez stocker plusieurs valeurs différentes dans un seul fichier, ce qui ne doit pas se chevaucher. Ensuite, chaque valeur est stockée sur une ligne distincte et lue par le fichier de fonction, qui renvoie un tableau, de sorte que la référence à la variable spécifiée est accessible en lisant la valeur de l'élément de tableau avec l'index correspondant à la ligne du fichier.

De plus, il est possible de réunir tous les éléments du tableau retourné en une seule variable. Ceci est fait en utilisant la fonction de travailler avec des tableaux implode. $text_file = implode("", file("somefile"));
echo $text_file;



readfile

Comme la fonction précédente, readfile affiche le contenu du fichier spécifié, et renvoie également le nombre de caractères dans le fichier (ou le nombre d'octets que tout le monde aime, car un caractère est égal à un octet). Mais gardez à l'esprit que contrairement au fichier, cette fonction ne permet pas d'affecter le contenu lu d'un fichier de variables. Si vous essayez de le faire, seul le nombre de caractères lus sera affecté à la variable. $bytes = readfile ("somefile");
echo "Итого - ".$bytes." символов";



ouvrir

Si la fonction précédente est autonome et généralement sans rapport avec les autres fonctions, les fonctions suivantes de travail avec les fichiers fonctionnent avec fopen. Cette fonction ouvre le fichier spécifié et renvoie l'ID de connexion du fichier utilisé à des fins professionnelles. Avec le contenu du fichier, cette fonction n'est liée en aucune façon.

La fonction fopen a plusieurs modes de travail avec le fichier. Ils sont spécifiés après le nom du fichier et représentent la notation suivante:
    "r" Le fichier est ouvert uniquement pour lire son contenu.
    "r +" Ouvre le fichier pour la lecture et l'écriture.
    "w" Le fichier est ouvert pour l'écriture.
    "w +" Ouvrez le fichier pour lire et écrire.
    "a" Le fichier est ouvert pour l'écriture à la fin du fichier (enregistrement supplémentaire).
    "a +" Ouvre pour doubler et lire.


fgets

Fonction de lecture d'un fichier ouvert par la fonction fopen. Mais contrairement au fichier, cette fonction renvoie uniquement une ligne du fichier à chaque fois qu'elle s'exécute et déplace le pointeur de fichier interne sur la ligne suivante, qu'il lira la prochaine fois qu'il accèdera à la fonction. Par conséquent, si vous avez besoin de lire le fichier entier, vous devez utiliser cette fonction dans la boucle.

Notez que la fonction fgets utilise le paramètre optionnel length, qui spécifie la longueur maximale de la ligne du fichier à lire. Si le volume de la chaîne dépasse ce nombre, la fonction le renvoie dans le formulaire "tronqué" par le volume dans le nombre d'octets de longueur. Par défaut, ce paramètre est défini sur 1024 octets, soit un kilo-octet. En outre, faites attention à ce paramètre si vous utilisez des fichiers volumineux, car lors de la lecture de tels fichiers, le tampon d'exécution PHP peut déborder (son volume est spécifié dans le fichier de configuration), ce qui entraînera un blocage.



PHP et HTTP: en-têtes



PHP, étant le langage de la programmation web, supporte l'implémentation du mécanisme d'envoi des en-têtes HTTP.

Tout d'abord, disons quelques mots sur les en-têtes HTTP eux-mêmes.

Conformément à la spécification HTTP, ce protocole prend en charge le transfert d'informations de service du serveur vers le navigateur, conçues comme des en-têtes spéciaux.

Ainsi, les en-têtes HTTP sont un moyen de communiquer un serveur avec un client distant. Chaque en-tête consiste généralement en une seule ligne de texte ASCII avec un nom et une valeur. Les en-têtes eux-mêmes ne sont pas affichés dans la fenêtre du navigateur, mais ils peuvent souvent modifier considérablement l'affichage du document d'accompagnement.

Le mécanisme d'envoi d'en-têtes HTTP en PHP.

Le mécanisme d'envoi des en-têtes PHP est représenté par la fonction header (). La particularité du protocole HTTP est que l'en-tête doit être envoyé avant d'envoyer d'autres données, donc la fonction devrait être appelée au tout début du document et devrait ressembler à ceci:
header("HTTP заголовок", необязательный параметр replace);

Le paramètre facultatif replace peut prendre des valeurs de type bool (true ou false) et indique si l'en-tête précédent d'un type similaire doit être remplacé ou ajouter cet en-tête à un en-tête existant.

Dans la fonction header (), headers_sent () est souvent utilisé, ce qui renvoie true si l'en-tête a été envoyé avec succès et false dans le cas contraire.

Considérez les en-têtes HTTP les plus utilisés.

Cache-contrôle.

"Cache-control:" valeur

En-tête des pages de mise en cache En général, cette fonction est l'un des en-têtes d'utilisation les plus courants.

Cet en-tête peut être utilisé avec les valeurs suivantes:

* no-cashe - Interdiction de mise en cache. Utilisé dans les pages et les pages fréquemment mises à jour avec un contenu dynamique. Son fonctionnement est similaire à la balise META "Pragma: no-cache".
* public - Autorise la mise en cache de la page par le client local et le serveur proxy.
* private - Activer la mise en cache uniquement par le client local.
* max-age - Permet l'utilisation d'un document mis en cache dans un délai spécifié en secondes. header("Cache-control: private, max-age = 3600") /* Кеширование локальными клиентами и использование в течение 1 часа */

Expire

"Expires:" HTTP-date

Définit la date et l'heure après lesquelles le document est considéré comme obsolète. La date doit être dans le format suivant (en anglais):

Jour de la semaine (abbr.) Numéro (2 chiffres) Mois (abrégé) année heures: minutes: secondes GMT

Par exemple, Ven, 09 Jan 2002 12:00:00 GMT

L'heure actuelle dans ce format est renvoyée par la fonction gmdate () sous la forme suivante:
echo gmdate("D, d MY H:i:s")."GMT";

Il est possible d'utiliser cet en-tête HTTP pour désactiver la mise en cache. Pour ce faire, vous devez spécifier la date passée.

Dernière modification

"Last-Modified:" HTTP-date

Indique la date à laquelle le document a été modifié pour la dernière fois. La date doit être spécifiée dans le même format que dans le cas de l'en-tête Expires. Cet en-tête ne peut pas être utilisé pour les pages dynamiques, car de nombreux serveurs (par exemple, Apache) pour ces pages exposent eux-mêmes la date de modification.

Il est possible de rendre la page toujours mise à jour:
header("Last-Modified: ".gmdate("D, d MY H:i:s")." GMT");

Lieu.

"Emplacement:" URL absolue

Un titre utile qui redirige le navigateur vers l'adresse spécifiée. Son action est comparable à la balise META Refresh:
<META HTTP-EQUIV="Refresh" CONTENT="0; URL=someURL">

Par exemple, cet en-tête peut être utilisé comme ceci:
if ($login != $admin_login) header("Location: http://www.server.com/login.php");
else header("Location: http://www.server.com/admin.php?login=$login");

if (!headers_sent()) exit("Произошла ошибка! Пройдите <a href='http://www.server.com/login.php'>авторизацию</a> заново");



PHP et HTTP: cookie.



Dans la leçon précédente, nous avons démonté la relation entre le protocole HTTP et le langage PHP au niveau des en-têtes HTTP. Dans cette leçon, nous allons nous familiariser avec un en-tête HTTP plus spécifique - cookie.

Que sont les cookies?
Le fait est que dans le processus de développement de www-technologies et l'introduction de langages de programmation sur Internet, les développeurs de logiciels ont fait face à un problème très sérieux - comment enregistrer les résultats de l'algorithme pour chaque utilisateur particulier pendant une longue période? En soi, le protocole HTTP n'a pas la capacité de capturer les résultats des processus logiciels. L'utilisation des sessions n'est également pas une solution, car leur action est terminée immédiatement après la déconnexion de la connexion au serveur.

Le problème a été résolu avec l'introduction du mécanisme des cookies (c'est-à-dire, dans la traduction de l'anglais, - "cookies"). Les cookies ont une propriété remarquable - ils sont stockés sur le disque dur de l'utilisateur et peuvent y être stockés pendant une durée illimitée.

En substance, les cookies sont des fichiers texte ordinaires stockés dans un répertoire spécial utilisé par le navigateur (généralement ce dossier s'appelle Temporary Internet Files), et vous pouvez les voir en allant dans ce répertoire (accès rapide au navigateur IE via les éléments de menu -> Options Internet -> Fichiers Internet temporaires -> Paramètres -> Afficher les fichiers).

Implémentation du mécanisme de cookies en PHP.
L'implémentation du mécanisme de cookies est représentée par la seule fonction setcookie (). Comme pour les en-têtes HTTP, cette fonction doit être appelée avant d'envoyer des données au client distant, même les caractères "vides", c'est-à-dire, un espace, des retours à la ligne, etc., ne sont pas autorisés.

La fonction a la syntaxe suivante:
setcookie(имя куки, значение, срок годности, информация о пути, домен, защищенность)

Tous les paramètres, à l'exception du nom du cookie, sont facultatifs. Si un cookie est envoyé uniquement avec ce paramètre, il est immédiatement détruit par le client distant, donc ce seul paramètre ne porte pas le chargement d'informations. Un cookie complet rend les deux paramètres suivants: la valeur stockée dans le cookie et l'heure à laquelle ce cookie peut être utilisé.

La valeur que le cookie porte est n'importe quelle chaîne de caractères ASCII. Par exemple, vous pouvez définir un cookie avec le nom et le prénom du visiteur, qu'il a précédemment saisi dans le champ de formulaire.
$data = $name."||".$surname;
setcookie("username", $data);


Notez que les données envoyées doivent être sous la forme d'une chaîne, une tentative de lecture du tableau de valeurs précédemment envoyé ne mènera à rien.

Le jeu de cookies dans l'exemple ci-dessus sera détruit immédiatement après la fermeture du navigateur par l'utilisateur, car par défaut, la durée de vie du cookie est définie sur zéro. Pour modifier cet ordre, vous devez spécifier le troisième paramètre expire. La définition de ce paramètre peut être faite de deux façons:

* Définissez la période de validité en utilisant la fonction time (), à laquelle l'heure est ajoutée en secondes pour stocker le cookie. Par exemple, pour définir un cookie pendant deux heures, il est nécessaire d'écrire: setcookie("test 1", "это тестовая куки", time() + 3600 * 2); // 3600 - количество секунд в часе setcookie("test 1", "это тестовая куки", time() + 3600 * 2); // 3600 - количество секунд в часе

* La deuxième méthode consiste à définir la date d'expiration absolue du cookie. Il est défini à l'aide de la fonction mktime (), qui renvoie une date spécifique pour supprimer le cookie. Si vous souhaitez définir la durée de vie des cookies avant minuit le 1er septembre 2003, définissez le cookie comme suit: setcooikie("test 2", "куки с абсолютной датой удаления", mktime(0, 0, 0, 9, 1, 2003);

Un paramètre de chemin facultatif limite la portée du cookie dans certains répertoires. Et dans cette zone comprend tous les chemins commençant par la valeur de ce paramètre. Par exemple:
setcookie("test 3, "", 0, "/mus");

Nous définissons le cookie en omettant les paramètres de valeur et de temps et en définissant la portée de tous les chemins commençant par la ligne "/ mus", c'est-à-dire le répertoire "/ music /" et "/ museums /". Pour déterminer de manière unique le chemin, vous devez compléter le chemin avec une barre oblique. Autrement dit, pour limiter l'effet du cookie au répertoire "/ mus", vous devez écrire dans le paramètre "/ mus /".

Le paramètre optionnel suivant est le paramètre permettant de déterminer l'action du cookie dans le domaine spécifié. Et la valeur de ce paramètre "someserver.com" correspond uniquement au site avec l'adresse http://someserver.com , et la valeur ".someserver.com" correspond déjà et http://someserver.com , et http: //mail.someserver. com , et http://my-someserver.com , c'est-à-dire tous les domaines se terminant par cette ligne.

Le dernier paramètre de la fonction setcookie () indique que le cookie doit être envoyé via une connexion sécurisée (HTTPS). Ce paramètre est requis lors de l'installation d'un cookie avec des données confidentielles.
setcookie("my_cookie", $value, time() + 3600 * 24 * 5, "/", ".myphp.dem.ru", 1);

Lecture des cookies
L'accès au cookie installé passe par son nom. Par exemple, en continuant l'exemple ci-dessus, vous pouvez lire le cookie comme suit:
echo "У вас сохранены следующие данные:<br>";
echo $my_cookie;


L'accès aux données stockées dans le cookie peut également se faire via le tableau $ HTTP_COOKIE_VARS. Il est similaire à d'autres tableaux similaires, tels que $ HTTP_POST_VARS et autres, et contient toutes les valeurs lues dans le cookie.

Supprimez le cookie.
Le cookie est supprimé en envoyant un nouveau cookie avec le nom du cookie à supprimer sans aucun paramètre supplémentaire.

Par exemple:
$data = $my_cookie;
setcookie("my_cookie");
echo "Следующие данные были удалены:<br>" . $data;

Applications régulières.



Cette leçon ne rentre pas dans la chaîne logique de nos études, mais a été créée «sous la pression du public», c'est-à-dire à la demande des lecteurs, et sera consacrée aux expressions régulières et aux fonctions de travailler avec eux. Probablement, mes calculs que les articles d'Alexander Grimalovsky "Regular Expressions" seront assez pour comprendre ce sujet se sont avérés faux.

Donc, en espérant que vous avez déjà lu l'article ci-dessus, nous commençons la leçon d'aujourd'hui.

Les expressions régulières elles-mêmes ne sont pas une nouveauté, introduite par PHP. Sous une forme ou une autre, ils ont été utilisés pendant assez longtemps et sont un mécanisme très puissant pour travailler avec des données de chaîne.

Une expression régulière est un modèle utilisé pour diverses actions, en fonction de la fonction qui utilise cette expression régulière. Les caractères spéciaux sont utilisés pour spécifier un modèle.

Fonctions de travailler avec des expressions régulières.
Il faut dire que PHP a son propre mécanisme pour travailler avec des expressions régulières (POSIX), et emprunté à un autre langage de programmation serveur Perl. Extérieurement, ils peuvent facilement être distingués par les noms de fonctions: les fonctions du premier type commencent par les caractères "ereg", et la seconde - "preg".

Mais les noms de fonctions ne sont pas leur seule différence. Tout d'abord, ils contiennent des différences dans la syntaxe des expressions régulières. Ainsi, les fonctions de type Perl requièrent des délimiteurs: $str = "регулярное выражение"; // просто строка
$preg = preg_replace("/р.+е/i", "<i>[вырезано]</i>", $str);
$ereg = eregi_replace("р.+е", "<i>[вырезано]</i>", $str);
echo $preg."<br>".$ereg;
$str = "регулярное выражение"; // просто строка
$preg = preg_replace("/р.+е/i", "<i>[вырезано]</i>", $str);
$ereg = eregi_replace("р.+е", "<i>[вырезано]</i>", $str);
echo $preg."<br>".$ereg;

Comme vous pouvez le voir, nous utilisons la fonction de remplacer une partie d'une chaîne par des expressions régulières. Notez le motif de la fonction preg_replace: les barres obliques sont les barres obliques, le modificateur i suivant le délimiteur de fermeture indiquant que le motif est insensible à la casse. Le même effet est obtenu lors de l'utilisation de la fonction POSIX avec le suffixe i (eregi_replace).

Dans notre exemple, la fonction preg_replace présentait ce que l'on appelle la "cupidité" et couvrait toute la ligne, qui commence par la lettre "p" et se termine par "e". Rendre la fonction non "gourmande" aide le modificateur U.

La fonction a trouvé la distance minimale entre les lettres "p" et "e" et l'a remplacée par la chaîne spécifiée.

La fonction eregi_replace a également montré "greed", mais cet ordre ne peut plus être changé, puisque les fonctions POSIX n'utilisent pas de modificateurs.

Exemples d'expressions régulières

Conversion de temps en temps Unix standard.

Supposons que nous ayons une date dans la base de données ou une autre source au format suivant:
heures: minutes: secondes - jour.mois.année
Mais pour une raison quelconque (par exemple, la refonte du site), nous devions afficher la date sous la forme suivante:
jour.mois.année: minutes

Comme vous le savez, c'est fou de le faire manuellement, alors écrivez un script qui amènera la date au format: heures: minutes: secondes un mois / jour / année, puis utilisez strtotime () pour traduire cette entrée à l'heure UNIX standard , que nous pouvons afficher comme vous voulez.

Le plus intéressant est la première étape. C'est quelque chose qui nous intéresse en termes d'utilisation d'expressions régulières. $str = "12:57:43 - 10.03.02"; // $str содержит некоторую дату
$str = preg_replace("!(\d{2})\.(\d{2})\.(\d{2})!", "\\2/\\1/\\3", $str);

À l'aide de l'expression régulière, nous modifions le format des enregistrements de jour, de mois et d'année, et chaque élément est séparé par des parenthèses. Dans le deuxième paramètre de la fonction, nous nous référons aux correspondances trouvées entre parenthèses. Voici comment ça se passe:

    \\ 0 - contient la chaîne correspondant au modèle entier (dans notre exemple "10.03.02").
    \\ 1 - contient des caractères qui correspondent uniquement au premier élément entre parenthèses (c'est-à-dire, "10").
    \\ 2 - contient des caractères correspondant uniquement au second élément entre parenthèses (c'est-à-dire, "03").
    et ainsi de suite.


A ce stade, nous aurons la date "12:57:43 - 03/10/02". Maintenant, nous l'amenons à la fin.
$str = str_replace("-", "", $str); // вырезаем знак "-"
$time = strtotime($str);


Vous pouvez maintenant utiliser la variable $ time comme vous le souhaitez.