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 avec un fichier, il est souvent nécessaire de s'assurer que le fichier spécifié existe. C'est ce que fait la fonction file_exists. Si vous comprenez bien, cette fonction ne peut renvoyer que deux valeurs: 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 n’agit que sur les fichiers locaux, c’est-à-dire que si vous souhaitez vérifier si Yandex a acquis le fichier robot.txt, vos efforts seront vains. Mais il est possible de vérifier n’importe quel fichier situé 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, un fichier vide contient 0 octet), et il est également possible de vérifier que la taille du fichier dépasse une certaine limite.


dossier

Cette fonction fonctionne déjà directement avec le fichier. Il renvoie le contenu du fichier spécifié, sous la forme d'un tableau, où chacun de ses éléments est une chaîne du fichier. Cette fonction est utile lorsque, dans le même fichier, vous devez enregistrer plusieurs valeurs différentes qui ne doivent pas se chevaucher. Ensuite, chaque valeur est stockée sur une ligne distincte et lue par la fonction file, qui renvoie un tableau. La référence à la variable spécifiée est obtenue 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é dans une seule variable. Ceci est fait en utilisant la fonction implode array. $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 du fichier (ou le nombre d’octets, comme vous le souhaitez, puisqu'un caractère est un octet). Notez toutefois que, contrairement à file, cette fonction ne permet pas d’affecter le contenu lu d’un fichier à une variable. Si vous essayez de faire cela, la variable se verra attribuer uniquement le nombre de caractères lus. $bytes = readfile ("somefile");
echo "Итого - ".$bytes." символов";



fopen

Si la fonction précédente est autonome et n'est généralement pas liée à d'autres fonctions, les fonctions de traitement de fichier suivantes fonctionnent conjointement avec fopen. Cette fonction ouvre le fichier spécifié et renvoie l'ID de la connexion avec le fichier utilisé à des fins commerciales. Cette fonction n'est pas associée au contenu du fichier.

La fonction fopen a plusieurs modes de fonctionnement avec un fichier. Ils apparaissent après le nom du fichier et ont la notation suivante:
    "r" Le fichier est ouvert pour la lecture de son contenu uniquement.
    "r +" Ouverture d'un fichier en lecture et en écriture.
    "w" Le fichier est ouvert à des fins d'enregistrement.
    "w +" Ouvre un fichier pour la lecture et l'écriture.
    "a" Le fichier est ouvert pour être écrit à la fin du fichier (enregistrement).
    "a +" Ouvre l'enregistrement et la lecture.


fgets

La fonction de lecture du fichier ouvert par la fonction fopen. Mais contrairement à file, cette fonction à chaque instant de son exécution ne renvoie qu'une ligne du fichier, alors qu'elle déplace le pointeur de fichier interne sur la ligne suivante, qu'elle lit lors du prochain accès à la fonction. Par conséquent, si vous devez lire l'intégralité du fichier, vous devez utiliser cette fonction dans une boucle.

Notez que la fonction fgets utilise le paramètre optionnel longueur, qui indique la longueur maximale de la chaîne de fichier à lire. Si le volume de la chaîne dépasse ce nombre, la fonction le renverra sous une forme "tronquée" de longueur sur un octet. Par défaut, ce paramètre est défini sur 1024 octets, ou un kilo-octet. De plus, faites attention à ce paramètre si vous utilisez des fichiers volumineux, car la lecture de ces fichiers peut déborder du tampon d’exécution PHP (sa taille est indiquée dans le fichier de configuration), ce qui entraînera un blocage.



PHP et HTTP: en-têtes



PHP, langage de programmation Web, prend en charge la mise en œuvre du mécanisme d’envoi d’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 sous la forme d'en-têtes spéciaux.

Ainsi, les en-têtes HTTP constituent un moyen de communication entre un serveur et 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 en aucun cas 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 en PHP est représenté par la fonction header (). La particularité du protocole HTTP est que l'en-tête doit être envoyé avant l'envoi d'autres données. La fonction doit donc être appelée au tout début du document et doit 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 de ce type doit être remplacé ou ajoute cet en-tête à l'en-tête existant.

En ce qui concerne la fonction header (), la fonction headers_sent () est souvent utilisée. Elle renvoie true si l’en-tête a été envoyé avec succès et false sinon.

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

Cache-control.

Valeur "Cache-control:"

En-tête du contrôle de mise en cache de la page. En général, cette fonctionnalité est l’un des en-têtes les plus courants.

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

* no-cashe - Désactive la mise en cache. Utilisé dans les pages fréquemment mises à jour et les pages à contenu dynamique. Son action est similaire à la balise META "Pragma: no-cache".
* public - Autorise la mise en cache des pages par le client local et le serveur proxy.
* private - Autorise la mise en cache uniquement par le client local.
* max-age - Permet à un document mis en cache d'être utilisé pendant une durée spécifiée 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 au format suivant (en anglais):

Jour de la semaine (abrégé) Nombre (2 chiffres) Mois (abrégé) Année heures: minutes: secondes GMT

Par exemple, vendredi 9 janvier 2002 à 12h00 (GMT)

L’heure actuelle dans ce format est renvoyée par la fonction gmdate () comme suit:
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 au même format que 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) définissent 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");

Emplacement

"Emplacement:" URL absolue

Un en-tête utile qui redirige le navigateur vers l'adresse spécifiée. Son effet 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 exploré la relation entre le protocole HTTP et le langage PHP au niveau des en-têtes HTTP. Dans cette leçon, nous allons introduire un autre en-tête HTTP spécifique - cookie.

Que sont les cookies?
Le fait est qu’au cours du développement de www-technologies et de l’introduction de langages de programmation sur Internet, les développeurs de logiciels ont été confrontés à un problème très grave: comment sauvegarder les résultats de l’algorithme pour chaque utilisateur pendant longtemps? Le protocole HTTP lui-même n'a pas la capacité de capturer les résultats des processus logiciels. L'utilisation de sessions n'est pas non plus une solution au problème, car leur action cesse 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, en 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 quasi illimitée.

À la base, les cookies sont des fichiers de texte brut stockés dans un répertoire spécial utilisé par le navigateur (ce dossier s’appelle généralement Fichiers Internet temporaires). Vous pouvez les visualiser en accédant à ce répertoire (IE permet d’y accéder rapidement via le menu Outils). -> Options Internet -> Fichiers Internet temporaires -> Paramètres -> Afficher les fichiers).

La mise en place de cookies en PHP.
L'implémentation du mécanisme des cookies est représentée par une seule fonction setcookie (). Comme dans le cas des 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" ne sont pas autorisés, c'est-à-dire les espaces, les caractères de nouvelle ligne, etc.

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. Par conséquent, ce paramètre en lui-même ne porte aucune charge d'informations. Un cookie complet est créé à l'aide des deux paramètres suivants: la valeur définie dans le cookie et l'heure à laquelle ce cookie peut être utilisé.

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


Notez que les données envoyées doivent être formatées en tant que chaîne. Essayer de lire le tableau de valeurs envoyé précédemment ne mènera à rien.

Le cookie défini dans l'exemple ci-dessus sera détruit immédiatement après la fermeture du navigateur par l'utilisateur, car la durée de vie du cookie par défaut est définie sur zéro. Pour changer cet ordre, vous devez spécifier que le troisième paramètre expire. Ce paramètre peut être déterminé de deux manières:

* Définissez la date d'expiration à l'aide de 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, vous devez é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 la suppression des cookies. Si vous devez définir la durée de vie d’un cookie jusqu’au 1 er septembre 2003 à minuit, vous devez définir un cookie comme celui-ci: setcooikie("test 2", "куки с абсолютной датой удаления", mktime(0, 0, 0, 9, 1, 2003);

Un paramètre de chemin facultatif limite la portée des cookies dans certains répertoires. De plus, cette zone inclut 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 ignorant les paramètres de valeur et d’heure et en définissant la portée de toutes les manières en commençant par la chaîne "/ mus", c’est-à-dire qu’elle inclut le répertoire "/ music /" et "/ museums /". Pour identifier le chemin de manière unique, vous devez le compléter avec une barre oblique. Autrement dit, pour limiter le cookie au répertoire "/ mus", il était nécessaire d'écrire dans le paramètre "/ mus /".

Le paramètre facultatif suivant est l'option permettant de définir une action de cookie dans le domaine spécifié. De plus, la valeur de ce paramètre "someserver.com" correspond uniquement au site avec l'adresse http://someserver.com , et la valeur de ".someserver.com" correspond déjà à la fois à http://someserver.com et à http: //mail.someserver. com et http://my-someserver.com , c'est-à-dire tous les domaines se terminant par une chaîne donnée.

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

Lire un cookie.
L'appel à l'ensemble de cookies passe par son nom. Par exemple, en reprenant 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 un 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.

Supprimer le cookie.
Un cookie est supprimé en envoyant un nouveau cookie avec le nom à 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 s'inscrit pas dans la chaîne logique de nos classes, 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 travail avec elles. Mes calculs selon lesquels l'article d'Alexander Grimalovsky "Expressions régulières" serait probablement suffisant pour comprendre ce sujet se sont révélés incorrects.

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 nouvelles en PHP. Sous une forme ou une autre, ils sont utilisés assez longtemps et constituent 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 définir le motif.

Fonctions permettant de travailler avec des expressions régulières.
Il est nécessaire de dire que PHP a son propre moteur d’expression régulière (POSIX) et qu’il est emprunté à un autre langage de programmation serveur Perl. Extérieurement, ils sont faciles à distinguer par nom de fonction: les fonctions du premier type commencent par les caractères "ereg" et le second - "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 nécessitent 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 constater, nous utilisons la fonction de remplacement d’une partie de chaîne en utilisant des expressions régulières. Notez le modèle de fonction preg_replace: les barres obliques apparaissent ici en tant que séparateur, le modificateur i suivant le séparateur de fermeture, indiquant que le modèle ne respecte pas la casse. Le même effet est obtenu lorsque la fonction POSIX est utilisée avec le suffixe i (eregi_replace).

La fonction preg_replace dans notre exemple montre la soi-disant "cupidité" et couvre toute la ligne commençant par la lettre "p" et se terminant par "e". Rendre la fonction non "gourmande" aide à modifier 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 indiquait également "cupidité", mais cet ordre ne peut plus être modifié, car les fonctions POSIX ne permettent pas l'utilisation de modificateurs.

Exemples d'expressions régulières.

Conversion de l'heure en heure Unix standard.

Supposons que nous ayons une date dans la base de données ou dans une autre source au format suivant:
heures: minutes: secondes - jour.mois.an
Mais pour une raison quelconque (par exemple, le site a été redessiné), nous devions afficher la date comme suit:
jour.mois.année heures: minutes

Comme vous le comprenez, il est fou de le faire manuellement. Nous allons donc écrire un script qui, dans un premier temps, introduira la date en heures: minutes: secondes mois / jour / année, puis nous utiliserons la fonction strtotime () pour convertir cette entrée en heure UNIX standard. que nous pouvons afficher comme nous aimons.

Le plus intéressant est la première étape. Il s'intéresse à l'utilisation des 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 d'une expression régulière, nous modifions le format du jour, du mois et de l'année, chaque élément étant séparé par des crochets. Dans le second paramètre de la fonction, nous référons aux correspondances entre parenthèses. Voici comment cela se passe:

    \\ 0 - contient une chaîne qui correspond à l'ensemble du modèle (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 qui correspondent uniquement au second élément entre crochets ("03").
    et ainsi de suite.


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


Vous pouvez maintenant utiliser la variable $ time comme bon vous semble.