Utiliser PHP
Naviguer sur le wiki : Accueil du wiki - Administrateur - Développeur - Intégrateur - Marketing - Multimédia - Objectifs - We make Hack
Naviguer sur le site : Accueil du site - Les annuaires - Les éditoriaux - Le forum - Les outils - Les projets
Consulter le sommaire de cette page en étant déconnecté du réseau : Télécharger le sommaire en PDF
Sommaire
- 1 Utiliser PHP
- 2 Trouver le service PHP
- 3 Directives PHP
- 4 Variables Environnement Serveur
- 5 Whois en PHP
- 6 A reprendre - Installer PHP
- 7 Coder en PHP
- 8 Code procédurale
- 8.1 Identifier l'URL de provenance
- 8.2 Convertir une URL en UNICODE avec PHP
- 8.3 Remplacer le titre d'une page
- 8.4 Interdire les caractères spéciaux dans une chaîne de caractères
- 8.5 Remplacer des caractères
- 8.6 Vérifier si un fichier existe
- 8.7 Passage de variable avec GET
- 8.8 Lister les fichiers pdf d'un dossier
- 8.9 Convertir le poids d'un fichier en Octet vers une unité adaptée au poids total du fichier
- 8.10 Récupérer une adresse mail dans une chaîne de caractères
- 9 DOMDocument
- 10 cURL
- 11 Regex
- 12 Exporter une page en PDF
- 13 Maintenir son code PHP
- 14 Créer une API avec PHP
- 15 Sécurité
- 16 Bibliographie
- 17 NAVIGATION
Utiliser PHP
Installer PHP sur GNU/Linux
Connaître la version courante de PHP
php -v
La version de PHP est affichée.
Si aucun paquet n'est installé, alors, le message suivant s'affiche. La commande « php » n'a pas été trouvée, mais peut être installée avec : sudo apt install php7.2-cli sudo apt install hhvm
PHP 7.0
Installer les paquets php7.0 pour Apache2 sur GnU/Linux Mint. sudo apt install php7.0 php7.0-curl libapache2-mod-php7.0 php7.0-cli php7.0-common php7.0-mbstring php7.0-gd php7.0-intl php7.0-xml php7.0-mysql php7.0-mcrypt php-zip
Installer les paquets php7.0 pour Nginx sur GnU/Linux Mint. sudo apt-get install php7.0 php7.0-fpm php7.0-cli php7.0-common php7.0-mbstring php7.0-gd php7.0-intl php7.0-xml php7.0-mysql php7.0-mcrypt php7.0-zip
Les modules d'extension empaquetés sont maintenant chargés depuis les fichiers .ini chargés par défaut et placés dans le répertoire /etc/php.d.
Lister le nom des paquets disponibles pour php7.0 sudo apt-cache pkgnames | grep php7.0 Utiliser cette liste pour installer tous les paquets de PHP 7.0 sur GnU/Linux Mint.
PHP 7.1
Mettre à jour les paquets de PHP 7.0 pour les paquets de PHP 7.1 avec Apache2. Désinstaller les paquets de php7.0 avec la commande suivante : apt-get purge 'php7*' Refuser la suppression de PHPMyAdmin avec dbconfig-common, je suppose que sa réinstallation se fera par la suite avec les mêmes données.
Installer le dépôt de PHP 7.1 pour GNU/Linux Mint - Ubuntu. sudo apt-get install python-software-properties sudo add-apt-repository ppa:ondrej/php sudo apt-get update # Sur le même modèle que les paquets utilisés pour installer PHP 7.0, on peut installer les paquets suivants pour PHP 7.1 : sudo apt install php7.1 php7.1-curl libapache2-mod-php7.1 php7.1-mysql php7.1-cli php7.1-common php7.1-mbstring php7.1-gd php7.1-intl php7.1-xml php7.1-mcrypt php-zip
# Un tutoriel propose des paquets supplémentaires pour PHP 7.1 ce qui semble être plus adapté : sudo apt install --no-install-recommends php7.1 php7.1-curl libapache2-mod-php7.1 php7.1-mysql php7.1-mbstring php7.1-gd php7.1-intl php7.1-xml php7.1-mcrypt php7.1-zip php7.1-json php7.1-msgpack php7.1-memcached php7.1-sqlite3 php7.1-gmp php7.1-geoip php7.1-redis
# Les deux paquets suivants sont présents pour php7.0 et n'ont pas été proposés pour php7.1 mais ils sont installés automatiquement avec les paquets de php7.1. # sudo apt install --no-install-recommends php7.1-cli php7.1-common # php7.1-cli est déjà la version la plus récente (7.1.20-1+ubuntu16.04.1+deb.sury.org+1). # php7.1-cli passé en « installé manuellement ». # php7.1-common est déjà la version la plus récente (7.1.20-1+ubuntu16.04.1+deb.sury.org+1). # php7.1-common passé en « installé manuellement ». # Les paquets suivants ont été installés automatiquement et ne sont plus nécessaires : # libjs-sphinxdoc libjs-underscore php-phpseclib # Veuillez utiliser « sudo apt autoremove » pour les supprimer.
A la fin de cette manipulation, PHPMyAdmin n'est plus fonctionnel et doit être réinstallé. Réinstaller PHPMyAdmin avec sudo apt install phpmyadmin et ne pas reconfigurer la base de données. Reconfigurer Apache2. PHPMyAdmin fonctionne à nouveau correctement.
PHP 7.2
Choix du dépôt pour Debian
apt-get install apt-transport-https lsb-release ca-certificates wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" >> /etc/apt/sources.list.d/php.list apt-get update
apt-get install php7.2 php7.2-opcache libapache2-mod-php7.2 php7.2-mysql php7.2-curl php7.2-json php7.2-gd php7.2-intl php7.2-mbstring php7.2-xml php7.2-zip php7.2-fpm php7.2-readline
service apache2 restart
Choix du dépôt pour Ubuntu
How to Install PHP 7.2, 7.1, 7.0 on Ubuntu 18.04 & 16.04 using PPA : https://tecadmin.net/install-php-7-on-ubuntu/
Activer PHP-FPM
Le module PHP surcharge le serveur car chaque process Apache est rattaché à un moteur PHP complet. Utiliser PHP-FPM quant à lui permet d’améliorer la sécurité, et les performances.
Attention l’ajout de PHP-FPM ne semble fonctionner correctement qu’à partir de la version d’Apache 2.4.9. Avant cette version, Apache ne pouvait pas utiliser les sockets Unix pour communiquer correctement avec le serveur PHP-FPM.
Pour activer PHP-FPM il faut activer le module proxy_fcgi, setenvif, désactiver le module PHP, et activer la conf php7.2-fpm. sudo a2enmod proxy_fcgi setenvif sudo a2enconf php7.2-fpm sudo a2dismod php7.2
sudo service apache2 restart sudo service php7.2-fpm restart
Le paquet php7.2-fpm devrait maintenant être affiché comme étant correctement activé depuis phpinfo. Voir la capture suivante : https://static.tutoandco.colas-delmas.fr/uploads/2018/03/phpinfo-php7.2-fpm.png
Source : https://tutoandco.colas-delmas.fr/developpement/installer-php7-2-php7-2-fpm-debian/#comment-441
PHP 7.3
.
Trouver le service PHP
whereis php php: /usr/bin/php /etc/php.d /etc/php.ini /usr/lib64/php /usr/share/php /usr/share/man/man1/php.1.gz
Trouver le fichier php.ini
Utiliser php.info pour connaître le php.ini utilisé par le site Web.
Utiliser la console linux pour trouver le php.ini sur le serveur. locate php.ini
Deux fichiers php.ini peuvent exister. Dans ce cas, un fichier configure le site Web et un autre fichier configure les paramètres du serveur.
Avec php 7.2
# Éditer la configuration : sudo nano /etc/php/7.2/apache2/php.ini
# Redémarrer le service : sudo service apache2 restart
Avec php 7.2 fpm
# Éditer la configuration : sudo nano /etc/php/7.2/fpm/php.ini
# Redémarrer le service : sudo service php7.2-fpm restart
Configurer php.ini depuis le dossier racine de son site
Il est possible de créer un fichier php.ini dans le dossier qui contient l'ensemble des fichiers et dossiers de votre CMS pour appliquer une configuration particulière. Désactiver par exemple le paramètre Output Buffering en ajoutant la ligne suivante : output_buffering = Off
Vérifiez les fichiers logs régulièrement dans /var/log/ afin de détecter les erreurs
Les logs de PHP sont configurés depuis le php.ini de Apache. Chemin : /var/log/phpini/error_log.log
0- Créer le dossier phpini : mkdir phpini 1- Créer le fichier de log sur le serveur : touch /var/log/error_log.log et touch /var/log/mail.log.log 2- Mettre les droits en écriture sur le fichier si nécessaire. 3- Ouvrir le fichier php.ini en lecture/écriture, avec Nano : nano /etc/php.ini 4- Appliquer les changements listés dans l'étude du php.ini 5- Redémarrer apache : /etc/init.d/httpd restart 7- Tester les logs suite à l'envoi d'un mail : cat /var/log/phpini-log-mail.log 8- Passer le paramètre -f pour l'envoie des mails ?
Exemple de fichier php.ini commenté en français sur une base Centos en 2014 : Exemple Apache pour le fichier de configuration php ini
La directive mail.log
Cette directive existe depuis PHP5.3 et permet d'obtenir les logs des mails envoyés avec la fonction mail() depuis le serveur ou le site Web.
Les logs des Mails sont configurés depuis le php.ini de Apache. Chemin : /var/log/phpini/mail.log.log
Activer la directive mail.log Les lignes suivantes permettent d'activer la directive mail.log dans le fichier php.ini du serveur Apache.
;# Ajoute une ligne avec des informations dans les logs des mails : En-tête X-PHP-Originating-Script qui inclue un UID unique pour le script et le nom du fichier. ;# Je veux obtenir les informations précises sur les mails. La directive est activée avec On. ;# Valeur en production : Off mail.add_x_header = On
;# Gestion des logs des mails. ;# Valeurs de production : avec un chemin vers un fichier log configuré. ;# Ce fichier doit être créé. Ajouter les droits de apache/httpd. mail.log = /var/log/phpini/mail.log
Source : https://www.visionduweb.eu/editoriaux/76-editoriaux-serveur-web/189-la-directive-mail-log-logs-les-mails-envoyes
Directives PHP
allow_url_fopen
Interdire l'ouverture et l'inclusion de fichiers distants : allow_url_fopen = Off allow_url_include = Off
Manuel de la fonction fopen : https://secure.php.net/manual/en/function.fopen.php
error_reporting
Pour vérifier les variables non-initialisées, utiliser la fonction error_reporting qui peut afficher les erreurs de niveau E_NOTICE.
Configurer php.ini pour afficher les erreurs PHP
error_reporting = E_ALL
display_errors = On
ou
Ajouter sous l'ouverture de la balise<?php
ini_set('error_reporting', E_ALL);
Afficher les erreurs PHP directement sur la page
error_reporting(E_ALL);
@ini_set('display_error','1');
upload_tmp_dir
Définition : ( A ajouter. ) Cette directive permet de résoudre le message d'erreur de Joomla depuis Extensions/Gérer/Avertissements : Le répertoire temporaire PHP n'est pas défini.
Les solutions qui n'ont pas fonctionnées sur mon VPS
Avec Debian Stretch et Apache2.4 :
- Créer un fichier php.ini dans le dossier principale contenant les fichiers du site. Ajouter la ou les lignes : upload_tmp_dir=/tmp open_basedir=/tmp/ J'ai testé le chemin relatif et absolu, sans succès. J'ai lu que certains mutualisés acceptent le fichier php.ini et d'autres non. Je ne sais pas si le fichier php.ini est bien accepté avec ma configuration ou si je dois ajouter une ligne de commande pour permettre la prise en compte d'un fichier php.ini ajouté dans le site. Je laisse tomber cette solution.
- Ajouter une ligne dans le virtualhost <Directory /var/www/domaine.ext> php_admin_value upload_tmp_dir /tmp </Directory> Cette configuration m'empêche de redémarrer Apache2.
- Même principe avec le fichier .htaccess mais je n'ai pas testé. Avec la ligne précédente qui ne fonctionnait déjà pas depuis le VirtualHost. Il devrait être également possible de charger le fichier php.ini depuis le fichier .htaccess mais je n'ai pas cherché a le faire.
La solution qui fonctionne sur mon VPS
Avec Debian Stretch et Apache2.4 :
Créer le dossier tmp dans /var/www/ # Vérifier les droits attribués, ou encore, le bon emplacement de ce répertoire sur le système, même si le résultat semble fonctionnel. cd /var/www sudo mkdir tmp sudo chown www-data:www-data -R tmp/ sudo chmod 755 -R tmp/
Commencer par configurer PHP 7.2 et Apache2 avec le fichier php.ini sudo nano /etc/php/7.2/apache2/php.ini
Modifier les valeurs suivantes : upload_tmp_dir = /var/www/tmp Vérifier que les deux lignes suivantes, les paramètres peuvent varier, mais ils doivent tous deux avoir la même valeur. upload_max_filesize = 200M post_max_size = 200M
Redémarrer Apache2. L'erreur est toujours affichée : Le répertoire temporaire PHP n'est pas défini sudo systemctl restart apache2
Dans mon cas, j'ai activé PHP FPM, donc, c'est la version du php.ini de FPM qui doit être configurée. sudo nano /etc/php/7.2/fpm/php.ini
Modifier à nouveau les valeurs suivantes : upload_tmp_dir = /var/www/tmp Vérifier que les deux lignes suivantes, les paramètres peuvent varier, mais ils doivent tous deux avoir la même valeur. upload_max_filesize = 200M post_max_size = 200M
Redémarrer Apache2 et PHP FPM : sudo systemctl restart apache2 sudo service php7.2-fpm restart
Résolu. Le message " Le répertoire temporaire PHP n'est pas défini " n'est plus affichée dans Joomla.
Variables Environnement Serveur
Source : http://www.creation-site.org/variables-environnement.html
Whois en PHP
Source : https://github.com/phpWhois/phpWhois
A reprendre - Installer PHP
PHP multi-versions sur le même Apache
Source : http://www.pulsar-informatique.com/actus-blog/entry/php-multi-versions-sur-le-meme-apache
Installer php7.0
sudo apt install php7.0 libapache2-mod-php7.0 php7.0-cli php7.0-common php7.0-mbstring php7.0-gd php7.0-intl php7.0-xml php7.0-mysql php7.0-mcrypt sudo apt install php-zip
# Le message suivant est affiché lors de l'installation du paquet php-zip # perl: warning: Setting locale failed. # perl: warning: Please check that your locale settings: # LANGUAGE = (unset), # LC_ALL = (unset), # LC_TIME = "fr_FR.UTF-8", # LC_MONETARY = "fr_FR.UTF-8", # LC_ADDRESS = "fr_FR.UTF-8", # LC_TELEPHONE = "fr_FR.UTF-8", # LC_NAME = "fr_FR.UTF-8", # LC_MEASUREMENT = "fr_FR.UTF-8", # LC_IDENTIFICATION = "fr_FR.UTF-8", # LC_NUMERIC = "fr_FR.UTF-8", # LC_PAPER = "fr_FR.UTF-8", # LANG = "en_US.UTF-8" # are supported and installed on your system. # perl: warning: Falling back to a fallback locale ("en_US.UTF-8"). # locale: Cannot set LC_ALL to default locale: No such file or directory
Configurer php7.0
Le fichier php.ini de apache2 : /etc/php7.0/apache2/php.ini. Le fichier php.ini de Nginx : /etc/php/7.0/fpm/php.ini
Ne pas fournir la version de PHP : expose_php = Off
Restreindre les emplacements du site : open_basedir = /var/www De ce fait, si je me place à la racine du site, il me sera impossible d'inclure le fichier ../../../../../../../etc/passwd par exemple.
Désactiver certaines commandes : disable_functions = php_uname, getmyuid, getmypid, passthru, leak, listen, diskfreespace, tmpfile, link, ignore_user_abord, shell_exec, dl, set_time_limit, exec, system, highlight_file, source, show_source, fpaththru, virtual, posix_ctermid, posix_getcwd, posix_getegid, posix_geteuid, posix_getgid, posix_getgrgid, posix_getgrnam, posix_getgroups, posix_getlogin, posix_getpgid, posix_getpgrp, posix_getpid, posix, _getppid, posix_getpwnam, posix_getpwuid, posix_getrlimit, posix_getsid, posix_getuid, posix_isatty, posix_kill, posix_mkfifo, posix_setegid, posix_seteuid, posix_setgid, posix_setpgid, posix_setsid, posix_setuid, posix_times, posix_ttyname, posix_uname, proc_open, proc_close, proc_get_status, proc_nice, proc_terminate, phpinfo
Si vous n'utilisez pas de formulaires pour l'envoi de fichiers, il est bon de désactivé le système d'envoi de fichiers. Pour être totalement certain qu’aucun upload ne pourra être fait par quiconque (y compris vous). On peut créer un fichier php.ini à la racine de son site et y inclure cette ligne. file_uploads = Off
Par contre si vous avez ce genre de formulaire, il faut limiter un répertoire d'envoi et une taille maximale : upload_tmp_dir = /var/php_tmp upload_max_filezize = 2M
Enfin, une dernière chose des plus convoitée, les sessions. Enregistrement des sessions : session.save_path = /var/lib/php
Il est déconseillé demanipuler vos sessions à l'aide de JavaScript. À l'aide de cette directive, JavaScript ne pourra lire les sessions (afin d'éviter le XSS) : session.cookie_httponly = 1
De ce fait, JavaScript ne pourra accéder qu'aux cookies. Ne pas loguer une erreur récurrente : ignore_repeated_errors = On
Fichier log : error_log = /var/log/php_errors.log Ou bien configurer-le tel qu'il redirige les messages vers syslog-NG (voir section Syslog-NG).
Configurer l'envoi de mails Paramètres pour envoyer les mails dans php.ini avec le paramètre -f dans sendmail_path. (?)
module MySQL pour PHP
php7.0-mysql : https://packages.debian.org/sid/php7.0-mysql
Support ZIP natif
; Installer le paquet php-zip sur Debian va également installer le paquet php7.0-zip. ; Ajouter la ligne suivante dans le fichier php.ini ; extension=zip.so
Avec php7.0 il semble qu'il ne soit plus nécessaire de charger le module dans le php.ini
Coder en PHP
La partie suivante montre des exemples de codes en PHP.
Code procédurale
Identifier l'URL de provenance
// Récupérer l'URL de provenance à sauvegardée en PDF.
$URL=$_SERVER["HTTP_REFERER"];
Convertir une URL en UNICODE avec PHP
$URL = urlencode(utf8_encode($URL));
Remplacer le titre d'une page
$content = preg_replace("~<titre>(.*)</titre>~","",$content) ;
Interdire les caractères spéciaux dans une chaîne de caractères
$interdit=array(">", "<", " ", ":", "*","\\", "/", "|", "?", "\"", ",", "—", "!", "_", ".", "(", ")", "[", "]", "=", "+", "°", "~", "'", "#", "`" );
$variable = str_replace($interdit,"-",$titre);
Remplacer des caractères
// Modèle des caractères accentués.
$cible = array('À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ă', 'Ą','Ç', 'Ć', 'Č', 'Œ','Ď', 'Đ','à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ă', 'ą','ç', 'ć', 'č', 'œ','ď', 'đ','È', 'É', 'Ê', 'Ë', 'Ę', 'Ě','Ğ','Ì', 'Í', 'Î', 'Ï', 'İ','Ĺ', 'Ľ', 'Ł','è', 'é', 'ê', 'ë', 'ę', 'ě','ğ','ì', 'í', 'î', 'ï', 'ı','ĺ', 'ľ', 'ł','Ñ', 'Ń', 'Ň','Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ő','Ŕ', 'Ř','Ś', 'Ş', 'Š','ñ', 'ń', 'ň','ò', 'ó', 'ô', 'ö', 'ø', 'ő','ŕ', 'ř','ś', 'ş', 'š','Ţ', 'Ť','Ù', 'Ú', 'Û', 'Ų', 'Ü', 'Ů', 'Ű','Ý', 'ß', 'Ź', 'Ż', 'Ž','ţ', 'ť','ù', 'ú', 'û', 'ų', 'ü', 'ů', 'ű','ý', 'ÿ','ź', 'ż', 'ž','А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р','а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'р','С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я','с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я');
$rempl = array('A', 'A', 'A', 'A', 'A', 'A', 'AE', 'A', 'A','C', 'C', 'C', 'CE','D', 'D','a', 'a', 'a', 'a', 'a', 'a', 'ae', 'a', 'a','c', 'c', 'c', 'ce','d', 'd','E', 'E', 'E', 'E', 'E', 'E','G','I', 'I', 'I', 'I', 'I','L', 'L', 'L','e', 'e', 'e', 'e', 'e', 'e','g','i', 'i', 'i', 'i', 'i','l', 'l', 'l','N', 'N', 'N','O', 'O', 'O', 'O', 'O', 'O', 'O','R', 'R','S', 'S', 'S','n', 'n', 'n','o', 'o', 'o', 'o', 'o', 'o','r', 'r','s', 's', 's','T', 'T','U', 'U', 'U', 'U', 'U', 'U', 'U','Y', 'Y','Z', 'Z', 'Z','t', 't','u', 'u', 'u', 'u', 'u', 'u', 'u','y', 'y','z', 'z', 'z','A', 'B', 'B', 'r', 'A', 'E', 'E', 'X', '3', 'N', 'N', 'K', 'N', 'M', 'H', 'O', 'N', 'P','a', 'b', 'b', 'r', 'a', 'e', 'e', 'x', '3', 'n', 'n', 'k', 'n', 'm', 'h', 'o', 'p','C', 'T', 'Y', 'O', 'X', 'U', 'u', 'W', 'W', 'b', 'b', 'b', 'E', 'O', 'R','c', 't', 'y', 'o', 'x', 'u', 'u', 'w', 'w', 'b', 'b', 'b', 'e', 'o', 'r');
// Remplacer les caractères accentués.
$variable = str_replace($cible, $rempl,$variable);
// Supprime les occurences successives du tiret.
$variable = preg_replace('#-{2,}#','-',$variable);
// Supprimer le dernier tiret de la chaîne.
$variable = substr($variable,0,strlen($variable)-1);
// Uniquement alphanumérique et tiret.
$variable = preg_replace('#[^a-z0-9-]+#i', '-',$variable);
Vérifier si un fichier existe
if (file_exists("$nom_fichier.pdf")) {
echo "Le fichier existe.";
} else {
echo "Le fichier n'existe pas.";
}
Passage de variable avec GET
echo "<center><a href=\"?delete=OUI\" target=\"_self\">Supprimer l'archive pour créer une nouvelle version avec le contenu actuellement en ligne sur la page</a>.</center>";
Ajouter un code de vérification qui exploite le retourne de la valeur GET.
Lister les fichiers pdf d'un dossier
$liste = glob('*.pdf');
foreach ($liste as $document) {
echo "<br/><a href=\"$document\" target=\"_$document\">$document</a>.";
$taille = filesize($document);
}
Convertir le poids d'un fichier en Octet vers une unité adaptée au poids total du fichier
// Convertir la taille du fichier en Octet vers la bonne unitée adaptée au poids total du fichier.
if ($taille < 1000) // octet
{
echo "$taille Octets";
}
else
{
if ($taille < 1000000) // ko
{
$ko = round($taille/1024,2);
echo "$ko Kilos";
}
else // Mo ou Go
{
if ($taille < 1000000000) // Mo
{
$mo = round($taille/(1024*1024),2);
echo "$mo Mégas";
}
else // Go
{
$go = round($taille/(1024*1024*1024),2);
echo "$go Gigas";
}
}
}
Récupérer une adresse mail dans une chaîne de caractères
A tester.
$pattern = '#[a-z0-9]+([._-]?[a-z0-9])*@[a-z0-9]+([.-]?[a-z0-9])*\.[a-z]{2,4}#i';
$result = preg_match_all( $pattern, $source, $matches );
echo '<pre>';
print_r($matches);
echo '</pre>';
DOMDocument
Récupérer le titre d'une page
libxml_use_internal_errors(true);
$doc = new DOMDocument();
$doc->loadHTMLFile($URL);
libxml_clear_errors();
$title = $doc->getElementsByTagName('title')->item(0);
$titre = $title->nodeValue;
Récupérer le contenu de balises avec Xpath
Quelques notes : https://buzut.fr/extraire-des-informations-du-dom-en-php Xpath cheatsheet : https://devhints.io/xpath
Exemple 1
$new = new DOMDocument();
@$new->loadHtml("$resultat");
$xpath = new DOMXPath($new);
//$domExemple = $xpath->query("//ul/li");
//$domExemple = $xpath->query("//ul/li[@class='toclevel-1 tocsection-1']");
//$domExemple = $xpath->query("//span[@class='tocnumber'] | //span[@class='toctext']");
$toctext = $xpath->query("//span[@class='toctext']");
$tocnumber = $xpath->query("//span[@class='tocnumber']");
$i = 0;
foreach ($toctext as $text) {
$result[$i++] = $text->nodeValue;
echo "$text->nodeValue";
}
Exemple 2
Exemple 2, à tester. Au lieu d'afficher les résultats de deux requêtes dans deux colonnes d'un tableau, on peut faire trois boucles pour afficher le résultat sur une seule ligne.
$queryXPath1 = '//div[@class="title"]'; //NOM
$queryXPath2 = '//div[@class="price"]'; //PRIX
$Liste_url = array('MAPAGE.html');
foreach ($Liste_url as $url)
{
$dom = new DOMDocument();
@$dom->loadHTMLFile($url);
$x = new DOMXPath($dom);
//NOM
$nodeList = $x->query($queryXPath1);
$NOM=array();
foreach ($nodeList as $node)
{
array_push($NOM, utf8_decode(urldecode($node->nodeValue.'</br></br>')));
}
//PRIX
$nodeList = $x->query($queryXPath2);
$PRIX =array();
foreach ($nodeList as $node)
{
array_push( $PRIX , utf8_decode(urldecode($node->nodeValue.'</br></br>')));
}
}
/* traitements effectués, on passe a la présentation des données:*/
for ($i=0; $i < (count($NOM)); $i++ )
{
echo $NOM[$i]." ".$PRIX[$i]."<br />";
}
cURL
Récupérer le HTML d'une page
$wikipediaURL = "$URL";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $wikipediaURL);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, 'Vision du web (www.visionduweb.eu)');
$resultat = curl_exec ($ch);
curl_close($ch);
Regex
Exemples : http://www.expreg.com/lire-Chaines-source
Exporter une page en PDF
Librairie
Librairie Dompdf
La librairie sur Github : https://github.com/dompdf/dompdf
On ne peut pas l'utiliser sur un hébergement mutualisé puisqu'il faut être en mesure d'installer ce programme sur le serveur.
Exemple pour exporter une page du wiki avec la librairie Dompdf
<?php
require_once 'extensions/dompdf/autoload.inc.php';
require_once 'extensions/dompdf/lib/html5lib/Parser.php';
require_once 'extensions/dompdf/lib/php-font-lib/src/FontLib/Autoloader.php';
require_once 'extensions/dompdf/lib/php-svg-lib/src/autoload.php';
require_once 'extensions/dompdf/src/Autoloader.php';
Dompdf\Autoloader::register();
// Récupérer la page courante du wiki
echo ($_SERVER["HTTP_REFERER"]);
$page = file_get_contents($_SERVER["HTTP_REFERER"]);
// Reference the Dompdf namespace
use Dompdf\Dompdf;
// Instantiate and use the dompdf class
$dompdf = new Dompdf();
// Modifier le code de la page HTML pour passer les URL des images en absolu.
$pasok=str_replace("/wiki/images", "https://www.visionduweb.eu/wiki/images","$page");
// Les images ne sont tout de même pas affichées et semblent rester en relatif.
$dompdf->loadHtml($pasok);
// (Optional) Setup the paper size and orientation
$dompdf->setPaper('A4', 'landscape');
// Render the HTML as PDF
$dompdf->render();
// Output the generated PDF to Browser
$dompdf->stream();
?>
Les images ne sont pas affichées avec un lien relatif
Deux alternatives à tester :
Utiliser un chemin absolu avec GNU/Linux. <img src="/home/vagrant/projects/www/my-app/assets/images/logo.png">
Utiliser un chemin relatif à l'application avec un framework. <img src="<?php echo APPPATH.'path-to-your-image.png'; ?>">
Librairie Pdflib
Source : http://www.pdflib.com/products/pdflib-family/
Il faut pouvoir l'installer sur le serveur PHP, ce qui n'est pas possible en mutualisé.
Librairie fpdf
Source : http://www.fpdf.org
FPDF est une bibliothèque de fonctions permettant de manipuler des PDF. Elle permet de générer des PDF en le composant en utilisant les méthodes de la classe.
Peut être utilisée sur un hébergement mutualisé.
Librairie TCPDF
Source : https://tcpdf.org
Cette librairie est très complète et génère un rendu vraiment propre. Elle peut être utilisée sur un hébergement mutualisé.
Ce script me permet de proposer le téléchargement du sommaire de chaque page Mediawiki. Voir à récupérer uniquement la page de mediawiki. Voir à forcer le téléchargement. Voir à intégrer les CSS.
Exporter le PDF vers un fichier
$pdf_string = $pdf->Output('wiki-tutoriel.pdf', 'S'); file_put_contents('./pdf/wiki-tutoriel.pdf', $pdf_string);
Source complémentaire : https://stackoverflow.com/questions/12304553/tcpdf-save-file-to-folder
Exemple de création de PDF
Exemple pour exporter le sommaire d'une page Mediawiki : Exporter le sommaire de Mediawiki sur une page PHP. Cliquer ici pour créer le sommaire de cette page en PDF.
Librairie Html2pdf
Source : https://html2pdf.fr
Fonctionne bien pour les pages simples, mais pas pour les pages élaborées contenant des tableaux. Exemples de réalisations : http://creersonsiteweb.net/page-php-convertir-page-web-html-en-pdf
Librairie Wkhtmltopdf
Source : https://wkhtmltopdf.org
Outil en ligne de commande open source (LGPLv3) pour convertir du HTML en PDF et divers formats d'image en utilisant le moteur de rendu Qt WebKit.
Exemple pour partager un classeur excel via le réseau : http://excel.engalere.com/question/147-partager-classeur-excel-reseau
Librairie Zend Pdf
Source : https://devzone.zend.com/1064/zend_pdf-tutorial/ Source : https://framework.zend.com/manual/1.12/en/zend.pdf.html
Ce composant fait partie du Zend Framework. Il faut être à l'aise en programmation orientée objet.
API
API HTML 2 PDF Rocket
Source : https://www.html2pdfrocket.com
Always Free $0 / Month 200 credits 5mb per PDF file Create API Key.
// Créer la clé API depuis le site https://www.html2pdfrocket.com $apikey = 'KEY'; $value = "https://www.google.com"; // a url starting with http or an HTML string. see example #5 if you have a long HTML string $result = file_get_contents("https://api.html2pdfrocket.com/pdf?apikey=" . urlencode($apikey) . "&value=" . urlencode($value)); file_put_contents('mypdf.pdf',$result);
Le taux de réussite pour la création de PDF est d'environ 70%, lors de la création de PDF provenant des pages de Mediawiki. Certaines pages ne sont pas générées.
API Mediawiki
API Mediawiki.
API Pdflayer
https://pdflayer.com
Un rendu propre des pages. Les images de Mediawiki sont intégrées. Un index est créé et permet de naviguer dans le PDF.
Les vidéos ne sont pas affichées en capture dans le PDF. Les liens internes de Mediawiki ne sont pas réécrits avec le domaine. (Demander au support.) Les contenus des liens de provenance ayant un accent ne sont pas générés. Enlever les accents des pages pour éviter ce problème. Un mail est envoyé au support dans ce sens.
API Pdfcrowd
L'API est payante mais les PDF peuvent également être créés en ligne depuis leur site web. Source : https://pdfcrowd.com/doc/api/html-to-pdf/php/
API Phptopdf
Site officiel : http://phptopdf.com Télécharger : http://phptopdf.com/api/download S'enregistrer pour obtenir une clé API : http://phptopdf.com/signup/ 30 Tokens sont offerts pour générer 30 fichiers PDF.
Le fichier n'est pas généré avec l'URL d'une page Mediawiki. Sinon, cette API semble bien fonctionner.
Maintenir son code PHP
XDebug
.
PHPCI
Lancer un scann sur son code pour vérifier si il est bien à jour avec les dernières recommandations de version. Source : https://www.phptesting.org Source : https://github.com/Block8/PHPCI
Créer une API avec PHP
Définition d'une API
Une API (Application programming interface) est une interface de programmation. C'est une manière indirecte d'accéder à des données ou à une application externe.
Choisir un style d'architecture
Deux architectures pour les API du web : SOAP est basé sur XML et comporte des structures standardisées de requêtes et réponses. REST (Representational State Transfer.) avec une approche plus ouverte qui fournit de nombreuses conventions mais permet une grande liberté de décision au concepteur.
Documentations sur des API existantes
Facebook : https://developers.facebook.com/docs/graph-api/overview Facebook : https://developers.facebook.com/docs/graph-api/using-graph-api?utm_source=zapier.com&utm_medium=referral&utm_campaign=zapier
Instagram : https://www.instagram.com/developer/endpoints/?utm_source=zapier.com&utm_medium=referral&utm_campaign=zapier
Marvel : https://developer.marvel.com
Musicgraph : https://developer.musicgraph.com/api-docs/overview
Twitter : https://developer.twitter.com/en/docs?utm_source=zapier.com&utm_medium=referral&utm_campaign=zapier Twitter : https://developer.twitter.com/en/docs/tweets/post-and-engage/api-reference/post-favorites-create?utm_source=zapier.com&utm_medium=referral&utm_campaign=zapier
Sécurité
Faille include
Source : https://www.funinformatique.com/faille-include-comment-lexploiter-et-sen-proteger/
Bibliographie
Cours PHP Accéléré - Version 0.9.1 - Gérard Rozsavolgyi - Septembre 18, 2017 : https://www.univ-orleans.fr/iut-orleans/informatique/intra/tuto/php/FastPHP.pdf
Déployer du PHP avec Ansible
Tutoriel : https://www.grafikart.fr/formations/deploiement-ansible-ansistrano/installation
NAVIGATION
PARTICIPER ET PARTAGERVous êtes sur le wiki de Vision du Web. Les pages présentées sur le wiki évoluent tous les jours. Certaines recherches sont peu abouties et incluent des erreurs. Pour participer sur le wiki, créer un compte utilisateur en haut à droite. La recherche interne du wiki permet de trouver le contenu qui vous intéresse. Identifiez-vous pour poser vos questions sur la page de discussion de VisionDuWeb. Améliorer le contenu des pages en faisant des propositions depuis l'onglet discussion. Pour écrire en Markdown : Éditeur - Générateur de tableau 1 - Générateur de tableau 2. Les informations du wiki ne doivent pas servir à nuire à autrui ou à un système informatique. De nombreux outils gratuits sont listés et disponibles dans la boîte à outils de Vision du web. D'autres pages du wiki peuvent correspondre à vos attentes. La liste de toutes les pages du wiki. |
VALORISER LE WIKIValoriser le contenu partagé sur le wiki avec un don en monnaie numérique : AEON - Bitcoins (BTC) - Bitcoins Cash - Bitcoins Gold - Bitcore (BTX) - Blackcoins - Bytecoins - Clams - Dash - Monero - Dogecoins - Ethereum - Ethereum Classique - Litecoins - Potcoins - Solarcoins - Zcash OBTENIR DE LA MONNAIE NUMERIQUEObtenir gratuitement de la monnaie numérique : Gagner des Altcoins - Miner des Altcoins. |
Miroir PlanetHoster du 1er Novembre 2018.