Mise en cache du bytecode PHP avec XCache. Installation de XCache, paramètre xCache, nuances Xcache ttl 0 défini plus de zéro bitrix

Comme vous le savez, PHP est un langage interprété, c'est-à-dire chaque fois qu'un script est accédé, ce script est compilé. Si vous avez 1 script, il n'y a rien à craindre, car le temps de compilation n'est pas long. Mais dans les CMS et les frameworks modernes, lors de l'affichage d'une page, 10 à 300 fichiers php séparés sont utilisés (en d'autres termes, inclus). Plus ils sont inclusifs et lourds, plus le processus de compilation prend du temps.

Pour résoudre ce problème, ils ont eu l'idée de stocker la forme compilée du script en mémoire. Il existe des modules spéciaux pour stocker le code compilé en mémoire. Ils sont appelés accélérateurs.

Les plus connus: eAccelerator, APC, XCache. Chacun a ses avantages et ses inconvénients. J'utilise XCache comme le plus rapide et le plus fiable. Bien que chacun ait sa propre opinion sur la fiabilité.

Certains accélérateurs permettent de stocker non seulement les scripts en mémoire, mais également les résultats des calculs. Par exemple, des échantillons d'une base de données. En pratique, cela ressemble beaucoup à stocker un cache dans Memcache. Mais j'utilise Memcache - c'est comme ça que c'était historiquement.

Panneau d'administration XCache

XCache a une petite zone d'administration pour afficher les statistiques et réinitialiser le cache. Il se trouve généralement ici / usr / local / share / examples / xcache / admin /. Par conséquent, vous devez emporter ce dossier quelque part à la racine du site ou dans votre panneau d'administration afin de pouvoir le regarder à partir du navigateur. Vous pouvez télécharger le panneau d'administration.

C'est comme ça que ça me regarde

Le premier tableau présente des statistiques générales. Il contient 2 lignes, car mon processeur est à 2 cœurs et XCache distribue le cache aux deux cœurs. Au total, j'ai 512M alloués.

Le panneau d'administration peut afficher Erreur fatale: xcache_count (): xcache.admin.user et xcache.admin.pass
Vous avez donc activé l'autorisation dans la configuration xCache.
Le moyen le plus simple est de l'assommer. Je suis seul sur mon serveur et je n'ai pas besoin de définir de mots de passe à l'intérieur du serveur.
Désactiver l'autorisation dans xcache.admin.enable_auth \u003d Off config

La configuration xCache se trouve généralement dans /etc/php5/conf.d/xcache.ini
Après avoir modifié la configuration, vous devez redémarrer Apache.

Statistiques XCache

retour au panneau d'administration (voir l'image ci-dessus).

Machines à sous - nombre d'emplacements de caisse. C'est ainsi que je comprends combien de parties bat la mémoire allouée. Dans mon cas, il est de 8000. Plus cette valeur est élevée, plus la recherche est rapide, mais il faut plus de mémoire.

Taille - taille de la mémoire pour XCache

Profiter - combien de mémoire il reste. Comme vous pouvez le voir, je ne l'ai plus. Tous les 512 Mo sont chargés

Clair - bouton de réinitialisation du cache

Les coups - combien d'appels aux fichiers ont été effectués

Misses - combien d'appels aux fichiers ont été effectués, mais ces fichiers n'étaient pas en mémoire. C'est un processus normal. Les fichiers changent - ils volent hors du cache. Mais dans mon cas, tous les fichiers ne rentrent tout simplement pas dans la mémoire, ils ne sont donc pas là et, par conséquent, il y a des ratés.

Sabots - c'est ainsi que je comprends combien de fois nous avons cherché certains fichiers dans le cache, mais à ce moment-là, ces fichiers étaient toujours compilés, c'est-à-dire il y avait un blocage.

MOO - combien de fois les fichiers n'ont pas été mis en cache en raison d'une mémoire insuffisante.

En cache - nombre de fichiers dans le cache. J'ai 6400 fichiers au total.

Paramètres XCache

Quelques mots sur la quantité de mémoire à allouer. Au départ, j'ai alloué 128 Mo, mais cette mémoire s'est bouchée en 10 minutes. Par conséquent, j'ai alloué 512 Mo et ce volume était déjà bouché en 1 heure. Il semblerait que vous puissiez allouer 1 Go et que tout conviendrait à coup sûr. Mais la mémoire n'est que de 4 Go et il vaut mieux l'allouer pour MySQL (à ce sujet). De plus, les fichiers qui ne sont pas entrés dans le cache en moins d'une heure sont des scripts rarement utilisés. Il existe simplement des sites qui sont visités par 10 à 100 personnes par jour et vous pouvez vous passer de la mise en cache. C'est ce qu'on appelle la "longue queue", qui est rarement utilisée, mais qui prend beaucoup de place. Dans mon cas, c'est 3% (Misses / Hits).

Quoi d'autre ne doit pas être oublié. Disons que vous avez changé du code sur un grand projet. L'espace mémoire a été libéré et les fichiers de projet peu visités peuvent être écrits dans cet espace vide. Par conséquent, les fichiers d'un grand projet n'entreront pas dans le cache. En termes simples, XCache ne sait PAS comment garder une trace des fichiers qui peuvent être jetés hors du cache et remplacés par des fichiers plus fréquemment demandés (c'est ce que l'on appelle le cache "chaud"). Par conséquent, vous devez réinitialiser manuellement le cache via le panneau d'administration.

Le tableau du bas montre quels fichiers sont mis en cache et leur efficacité.

Les coups - le nombre d'appels à ce script en mémoire. Le plus gros le meilleur. Si pour certains fichiers, cette valeur est inférieure à 10 pendant une longue période, ce fichier est rarement utilisé et ne prend que de l'espace en mémoire.

Taille est la taille de ce fichier en mémoire. Voici la partie amusante. Il s'avère que le fichier compilé occupe 10 fois plus d'espace en mémoire que sur le disque. OMG!

SrcSize - taille du fichier sur le disque

Accès - depuis combien de temps ce fichier a-t-il été consulté

Créer - combien de temps ce fichier est dans le cache

Ma config
xcache.size \u003d 512 Mo
xcache.count \u003d 2
xcache.slots \u003d 8 Ko
xcache.ttl \u003d 0
xcache.gc_interval \u003d 0
xcache.var_size \u003d 0 M
xcache.var_count \u003d 2
xcache.var_slots \u003d 8 Ko
xcache.var_ttl \u003d 0
xcache.var_maxttl \u003d 0
xcache.test \u003d Désactivé
xcache.cacher \u003d Activé
xcache.stat \u003d Activé

Comme vous pouvez le voir, j'ai désactivé l'utilisation de XCache pour la mise en cache des résultats du calcul (xcache.var_size \u003d 0M). Pour cela, j'ai Memcache.

Eh bien, les résultats réels: une accélération de 2-3 fois. Si auparavant la page était générée en 0,3 seconde (en tenant compte de Memcache), maintenant elle est de 0,1 seconde. Ceci est un exemple d'un projet sur CMS LiveStreet.

xCache est une série de programmes qui mettent en cache le bytecode php pour optimiser et accélérer l'exécution des scripts. Comme eAccelerator ou PHP-APC, par exemple.

Cet article couvrira la configuration de base. Et puis vous pouvez modifier les paramètres selon vos propres souhaits.

Cela n'a aucun sens de s'attarder longtemps sur l'installation: tout est fait en standard.

Aptitude installer php5-xcache

Paramètres de base du cache

La tâche principale sera d'indiquer les paramètres de base du travail. Ouvrez le fichier dans votre éditeur préféré ... Tous les paramètres sont rassemblés en groupes. Pour le moment nous avons besoin d'un groupe

xcache.size \u003d 32 millions

Cette directive spécifie la quantité totale de mémoire pour le cache. La valeur par défaut est de 16 mégaoctets.

xcache.count \u003d 1

Indiqué par le nombre de processeurs (cœurs). Deux noyaux - mis 2. Et ainsi de suite. Ou deux processeurs monocœur.

xcache.ttl \u003d 0

Durée de vie du cache. Parfois, il peut être nécessaire de vider le cache après un certain laps de temps. La valeur est spécifiée en secondes.

Considérons les paramètres requis pour la mise en cache des variables. Dans certaines conditions, cela peut également être utile.

xcache.var_size \u003d 8M

Quantité totale de mémoire allouée au cache de variables. Par défaut 0 - désactivé.

xcache.var_count \u003d 1

Cette variable est la même que xcache.count.

xcache.var_ttl \u003d 0

Ici, vous pouvez également faire une analogie avec la variable xcache.ttl: elle définit la durée de vie du cache de variables.

xcache.var_maxttl \u003d 0

Cette variable indique la durée de vie maximale du cache.

Optimiseur XCache

Parfois, vous devrez peut-être activer l'optimiseur intégré xCache. Pour ce faire, la directive suivante doit être transférée de l'état de en état sur.

Xcache.optimizer \u003d activé

Panneau d'administration pour xCache

xCache est livré avec un panneau de contrôle qui vous permet d'afficher des statistiques. J'ai un tas de nginx + php-fpm, un exemple sera écrit dans cet esprit.

Tout d'abord, nous configurons nginx. Cela nécessitera l'utilisation d'alias pour l'emplacement.

Location / x / (alias / usr / share / xcache / admin /; location ~ .php $ (fastcgi_index index.php; fastcgi_pass unix: /run/php-fpm.sock; include fastcgi_params; fastcgi_param PHP_ADMIN_VALUE "(! LANG: open_basedir \u003d / usr / share / xcache / admin /: / var / php-temp-dir /"; fastcgi_param SCRIPT_FILENAME $request_filename; } } !}

Nous enregistrons la configuration pour n'importe quel hôte virtuel, redémarrez nginx: rechargement du service nginx... Ensuite, ouvrez la page dans le navigateur http: // example.com/x/mkpassword.php... Remplacez Example.com par l'URL de votre site pour lequel vous avez créé l'alias.

À l'aide de ce script, vous devez créer un hachage md5 du mot de passe qui sera utilisé pour l'authentification dans le panneau d'administration xCache. Il suffit de préciser le mot de passe, de cliquer sur le bouton «Envoyer la demande» et de copier le résultat.

Après toutes ces étapes, ouvrez le fichier /etc/php5/mods-available/xcache.ini, en groupe éditez les paramètres requis.

xcache.admin.user \u003d "nom d'utilisateur"

Nous indiquons le nom de l'utilisateur qui aura accès au panneau d'administration.

xcache.admin.pass \u003d "..."

Ici, entre guillemets, vous devez spécifier le hachage md5 du mot de passe de l'utilisateur.

Enregistrez le fichier modifié et redémarrez apache, php-cgi ou php-fpm.

La zone d'administration de xcache devrait maintenant être disponible à l'adresse http://example.com/x/. Essayez de vous connecter et de consulter les statistiques.

X Cache est un PHP gratuit et open source. En utilisant XCache, vous aurez de meilleures performances dans l'exécution de votre script PHP sur un VPS Linux. Il peut y parvenir en éliminant le temps de compilation du code PHP, en mettant en cache la version compilée du code PHP en mémoire, puis en utilisant la version compilée du code. Il peut considérablement accélérer les temps de génération des pages jusqu'à 5 fois plus rapidement, et il optimise et améliore également de nombreux autres aspects des scripts PHP et réduit la charge du serveur.

Dans ce tutoriel, nous allons vous montrer comment installer XCache sur CentOS 7 VPS.

Tout d'abord, connectez-vous à votre serveur CentOS 7 VPS et assurez-vous que tous les packages de votre serveur sont à jour

Miam -y mise à jour

Ensuite, installez les packages suivants

Yum install -y php-devel gcc make

Une fois les packages requis installés, procédez au téléchargement de XCache. Accédez à leur site officiel et sélectionnez la dernière version stable de XCache. Au moment d'écrire ces lignes, il s'agit de la version 3.2.0

Cd / opt wget http://xcache.lighttpd.net/pub/Releases/3.2.0/xcache-3.2.0.tar.gz

Décompressez l'archive .tar téléchargée

Tar -zxvf xcache-3.2.0.tar.gz

Cela créera un nouveau répertoire 'XCache-3.2.0'. Accédez à ce répertoire

CD xcache-3.2.0

Exécutez la commande phpize pour préparer XCache en tant qu'extension PHP

Configuration de Phpize pour: PHP Api Version: 20100412 Module Zend Api No: 20100525 Zend Extension Api No: 220100525

./configure --enable-xcache make make install

L'emplacement de xcache.so est affiché à la dernière étape

Installation d'extensions partagées: / usr / lib64 / php / modules /

Donc, l'emplacement de l'extension XCache est le chemin:

/ usr / lib64 / php / modules /

Nous devons maintenant éditer le fichier de configuration PHP. Pour le trouver, vous devez. à toi de faire

Php -i | grep Fichier de configuration php.ini (php.ini) Chemin \u003d\u003e / etc Fichier de configuration chargé \u003d\u003e /etc/php.ini

Créez un fichier de configuration pour XCache et ajoutez les lignes suivantes

Nano /etc/php.d/xcache.ini extension \u003d /usr/lib64/php/modules/xcache.so xcache.shm_scheme \u003d "mmap" xcache.size \u003d 32M xcache.count \u003d 1 xcache.slots \u003d 8K xcache.ttl \u003d 3600 xcache.gc_interval \u003d 300; Identique à ci-dessus mais pour le cache de variables; Si vous ne savez pas avec certitude que vous en avez besoin, vous n'avez probablement pas xcache.var_size \u003d 0M xcache.var_count \u003d 1 xcache.var_slots \u003d 8K xcache.var_ttl \u003d 0 xcache.var_maxttl \u003d 0 xcache.var_gc_interval \u003d 300; N / A pour / dev / zero xcache.readonly_protection \u003d Off xcache.mmap_path \u003d "/ dev / zero" xcache.cacher \u003d On xcache.stat \u003d On

Vous pouvez modifier les paramètres du fichier xcache.ini en fonction de vos besoins.

Redémarrez le serveur Web Apache pour que les modifications prennent effet

Systemctl redémarre httpd.service

À ce stade, XCache devrait être installé avec succès sur votre serveur. Vous pouvez vérifier cela en exécutant la commande suivante

# php -v PHP 5.4.16 (cli) (build: 23 juin 2015 21:17:27) Copyright (c) 1997-2013 The PHP Group Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies with XCache v3.2.0, Copyright (c) 2005-2014, par mOo avec XCache Optimizer v3.2.0, Copyright (c) 2005-2014, par mOo avec XCache Cacher v3.2.0, Copyright (c) 2005-2014, par mOo avec XCache Coverager v3.2.0, Copyright (c) 2005-2014, par mOo

PS. Si vous avez aimé cet article, partagez-le avec vos amis sur les réseaux sociaux en utilisant les boutons sur le côté gauche de l'article, ou laissez simplement un commentaire ci-dessous. Merci d'avance.

.
Le processus d'installation est très simple:

# wget http://xcache.lighttpd.net/pub/Releases/1.3.1/xcache-1.3.1.tar.gz
# tar zxf xcache-1.2.2.tar.gz
# cd xcache-1.2.2
# phpize
# ./configure --enable-xcache
# make && make install

Mais il y avait des difficultés imprévues. Premièrement, phpize n'a pas été trouvé au début. Il s'est avéré nécessaire d'installer le paquet php-devel (#yum install php-devel). Deuxièmement, il y a eu une erreur à l'étape de la construction - le compilateur maudissait le fichier d'en-tête manquant timelib_config.h. Après une brève recherche Google, la solution a été trouvée: dans le fichier /usr/include/php/ext/date/lib/timelib_structs.h devait être remplacé

#comprendre

#include "timelib_config.h"

L'assemblage et l'installation ultérieurs se sont déroulés sans problème. Il ne restait plus qu'à ajouter les paramètres de XCache à /etc/php.ini (sans trop réfléchir, je les ai pris de l'article vers lequel le lien était donné ci-dessus, seulement dans la ligne zend_extension j'ai remplacé le chemin par le mien: /usr/lib/php/modules/xcache.so).

Après cela, j'ai vérifié la fonctionnalité PHP avec la commande php -m et tout a fonctionné!

Il ne restait plus qu'à redémarrer Apache et à profiter de l'effet. Les efforts en valaient la peine: les sites et le travail sont devenus plus rapides (même si je ne peux évaluer cela que subjectivement, je n'ai pas fait de mesures précises) et consomment moins de mémoire. En particulier, mon TextCMS au lieu de 320 Ko par page a commencé à n'en consommer que 120!

Exemple de réglage des paramètres:

;; installer en tant qu'extension zend (recommandé), normalement "$ extension_dir / xcache.so"
zend_extension \u003d /usr/local/lib/php/extensions/no-debug-non-zts-20060613/xcache.so


xcache.admin.enable_auth \u003d Activé
xcache.admin.user \u003d "mOo"
; xcache.admin.pass \u003d md5 ($ votre_mot_de_passe)
xcache.admin.pass \u003d ""


; paramètres ini uniquement, toutes les valeurs ici sont par défaut sauf indication contraire
; sélectionner l'implémentation du schéma shm / allocator de bas niveau
xcache.shm_scheme \u003d "mmap"
; pour désactiver: xcache.size \u003d 0
; pour activer: xcache.size \u003d 64M etc (toute taille\u003e 0) et votre système mmap permet
xcache.size \u003d 32 millions
; défini sur le nombre de processeurs (cat / proc / cpuinfo | grep -c processor)
xcache.count \u003d 1
; juste un indice de hachage, vous pouvez toujours stocker count (items)\u003e slots
xcache.slots \u003d 8 Ko
; ttl de l'élément de cache, 0 \u003d pour toujours
xcache.ttl \u003d 0
; intervalle de scan gc éléments expirés, 0 \u003d pas d'analyse, les autres valeurs sont en secondes
xcache.gc_interval \u003d 0
; comme ci-dessus mais pour le cache de variables
xcache.var_size \u003d 0 M
xcache.var_count \u003d 1
xcache.var_slots \u003d 8 Ko
; ttl par défaut
xcache.var_ttl \u003d 0
xcache.var_maxttl \u003d 0
xcache.var_gc_interval \u003d 300
xcache.test \u003d Désactivé
; N / A pour / dev / zero
xcache.readonly_protection \u003d Désactivé
; pour * nix, xcache.mmap_path est un chemin de fichier, pas un répertoire.
; Utilisez quelque chose comme "/ tmp / xcache" si vous souhaitez activer ReadonlyProtection
; 2 groupes de php ne partagent pas le même / tmp / xcache
; pour win32, xcache.mmap_path \u003d nom de carte anonyme, pas chemin de fichier
xcache.mmap_path \u003d "/ dev / zéro"
; laissez-le vide (désactivé) ou "/ tmp / phpcore /"
; assurez-vous qu'il est accessible en écriture par php (sans vérifier open_basedir)
xcache.coredump_directory \u003d ""
; par paramètres de demande
xcache.cacher \u003d Activé
xcache.stat \u003d Activé
xcache.optimizer \u003d Désactivé


; par paramètres de demande
; activer la collecte des données de couverture pour les fonctions xcache.coveragedump_directory et xcache_coverager_start / stop / get / clean () (cela nuira aux performances d'exécution)
xcache.coverager \u003d Désactivé
; paramètres ini uniquement
; assurez-vous qu'il est lisible (attention open_basedir) par le script du visualiseur de couverture
; requiert xcache.coverager \u003d Activé
xcache.coveragedump_directory \u003d ""

L'utilisation de l'accélérateur réduit le temps de génération de page de plusieurs fois et réduit également la charge sur le processeur du serveur. Ainsi, après avoir configuré Xcache sur le serveur, le temps processeur utilisé a presque diminué de moitié. Et comme j'utilise un serveur virtuel pour héberger mes sites, où je ne paie que pour l'utilisation des ressources, l'utilisation d'un accélérateur PHP réduit le coût total de location d'un serveur.

Commençons donc par installer le code php de l'accélérateur sur le serveur - Xcache.

J'utilise Ubuntu 10.04 sur le serveur, mais les plus récents comme Ubuntu LTS 12.04 14.04 récemment publié avec un support à long terme auront le même aspect. Cela fonctionne également sur Debian 7.

Installer:

Sudo apt-get installer php5-xcache

La dernière version stable sera installée, vous n'avez donc rien à compiler.

Après l'installation, ouvrez le fichier de configuration dans /etc/php5/conf.d/xcache.ini

Cela me ressemble:

xcache.size \u003d 128 Mo

xcache.count \u003d 14

xcache.slots \u003d 8 Ko

xcache.ttl \u003d 36000

xcache.gc_interval \u003d 36000

xcache.var_size \u003d 8M

xcache.var_count \u003d 14

xcache.var_slots \u003d 8 Ko

xcache.var_ttl \u003d 36000

xcache.var_maxttl \u003d 604800

xcache.cacher \u003d Activé

xcache.stat \u003d Activé

Paramètres principaux:

xcache.size - est responsable de la quantité de mémoire pour stocker le cache. Si la valeur est trop petite, alors l'effet de la mise en cache ne sera vraiment pas.

xcache.count - le nombre de blocs dans lesquels le cache sera divisé. Il est recommandé de définir par le nombre de cœurs de processeur.

xcache.slots - Le nombre d'emplacements pour le cache, plus il y a d'emplacements, plus la vitesse de recherche dans le cache est rapide. Mais la consommation de mémoire augmente également. Il est recommandé de conserver la valeur par défaut: 8K

xcache.ttl -La durée de vie de l'objet mis en cache en secondes. Si personne n'a accédé à l'objet pendant le temps spécifié, l'objet est marqué comme inutilisé et par la suite supprimé du cache par le garbage collector.

xcache.gc_interval - l'intervalle auquel le ramasse-miettes démarre, en secondes. Détermine la durée après laquelle le garbage collector s'exécutera. Une fois démarré, il recherche les entrées expirées (xcache.ttl) et les supprime du cache.

Les deux derniers paramètres (xcache.ttl et xcache.gc_interval) sont très importants dans la configuration de Xcache, mais sur de nombreux sites, les valeurs de ces paramètres sont définies sur 0, donc rien n'est supprimé du cache, et une fois complètement rempli, les nouveaux scripts n'y pénètrent pas. Autrement dit, si vous placez un nouveau site sur le serveur, ses scripts n'entreront plus dans le cache, car il est complètement rempli avec les scripts du site précédent.

Les paramètres commençant par xcache.var_ sont responsables de la mise en cache des résultats des calculs. Et leurs paramètres sont similaires.

Après avoir enregistré les paramètres, redémarrez le serveur Web.

Sudo /etc/init.d/apache2 redémarrage

Affichage des statistiques Xcache

Xcache a sa propre zone d'administration qui vous permet d'afficher l'état actuel et de vider le cache.

Pour que cela fonctionne, vous devez copier le dossier admin de / usr / local / share / examples / xcache / admin / vers votre répertoire de site (Ubuntu)

Dans Debian 7, ce répertoire est / usr / share / xcache

Mais avant cela, vous devez définir un mot de passe dans le fichier de configuration. Les paramètres en sont responsables.

xcache.admin.enable_auth

xcache.admin.user \u003d "utilisateur"

xcache.admin.pass \u003d "mot de passe"

le mot de passe doit être spécifié comme hachage md5 pour plus de sécurité.

Vous pouvez obtenir le hachage md5 en exécutant

Php echo md5 ("mot de passe"); ?\u003e

ou vous pouvez obtenir un hachage par exemple sur le site

Emplacements - Le nombre d'emplacements pour le cache, plus il y a d'emplacements, plus la vitesse de recherche dans le cache est élevée. Mais la consommation de mémoire augmente également. Il est recommandé de conserver la valeur par défaut: 8K

Taille - taille de la mémoire pour Xcache.

Profiter - combien de mémoire il reste.

Clair - réinitialisez le cache.

Les coups - combien d'appels aux fichiers ont été effectués

Misses - combien d'appels aux fichiers ont été effectués, mais ces fichiers n'étaient pas en mémoire.

Sabots - fichiers temporairement verrouillés dans le cache.

MOO - Le nombre de fichiers qui n'ont pas pu entrer dans le cache en raison d'un manque de mémoire.

En cache - Le nombre total de fichiers dans le cache.

Le tableau du bas montre quels fichiers sont mis en cache et leur efficacité.

Les coups - le nombre d'appels à ce script en mémoire. Le plus gros le meilleur. Si pour certains fichiers, cette valeur est inférieure à 10 pendant une longue période, ce fichier est rarement utilisé et ne prend que de l'espace en mémoire.

Taille est la taille de ce fichier en mémoire. Voici la partie amusante. Il s'avère que le fichier compilé occupe 10 fois plus d'espace en mémoire que sur le disque. OMG!

SrcSize - taille du fichier sur le disque

Accès - depuis combien de temps ce fichier a-t-il été consulté

Créer - combien de temps ce fichier est dans le cache

Je loue un serveur virtuel de