Utiliser PHPDocumentor

Installer PHPDocumentor

La méthode la plus simlpe est de télécharger le phar (archive PHP) et de l’invoquer en ligne de commande.

Installer GraphViz pour visualiser graphiquement vos classe

Autoloading en PHP

Qui n’a jamais fait d’include de fichiers externes en PHP? C’est même récurrent pour les programmeurs.

Avouez que c’est quand même lourd à la longue. Il existe une méthode depuis PHP 5.3 pour résoudre automatique le chemin des fichiers de classe, enfin presque. A condition de bien comprendre quelques notions fondamentales en PHP objet.

Autoloading qu’est ce que c’est?

Quand vous avez à instancier un objet:

myDeuche = new Voiture();

PHP doit trouver le chemin du fichier qui contient la déclaration de classe et le charger (Autoloading). Prenons soins de nommer le fichier de déclaration de classe avec le même nom que la classe. Et dans un fichier il y a une seule classe. Ces deux conditions sont nécessaires pour faire marcher l’autoloading.

Votre fichier peut être dans le même répertoire que celui contenant le script ci-dessus.

Ou il peut être dans un sous répertoire ou sous sous répertoire.

Comment lui faire savoir dans ce cas?

C’est là qu’interviennent les espaces de nom.

soit la déclaration suit:

//Voiture.php

namespace vehicule;

class Voiture{

 //....suite du code

}

Ce fichier est obligatoirement dans le répertoire vehicule.

Ainsi lorsqu’on instancie l’objet Deuche, PHP va aller dans le répertoire vehicule pour chercher le fichier Voiture.php grâce à la correspondance du nom de classe (vous comprenez pourquoi on ne doit déclarer qu’une seule classe par fichier)

Historique et Évolution

L’autoloading a évolué avec PHP, particulièrement avec l’introduction de spl_autoload_register() dans PHP 5.1, qui a simplifié l’enregistrement de fonctions d’autoload personnalisées.

Les différentes méthodes d’autoloading

__autoload() (déprécié depuis PHP 7.2.0)

Cette fonction magique permettait de définir une méthode globale pour charger automatiquement les classes. Exemple :

function __autoload($className) {
    include $className . '.php';
}

spl_autoload_register()

Il s’agit de la méthode recommandée pour enregistrer une ou plusieurs fonctions d’autoloading :

spl_autoload_register(function ($class) {
    include 'classes/' . $class . '.class.php';
});

Autoloading PSR-4

La norme PSR-4 de PHP-FIG spécifie une manière standardisée d’autoloading des classes à partir de leurs namespaces. Elle est largement utilisée et soutenue par Composer.

{
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    }
}

Autoloading avec Composer

Composer, le gestionnaire de dépendances pour PHP, utilise l’autoloading version PSR-4 pour inclure automatiquement les bibliothèques externes. Il crée un fichier vendor/autoload.php qui gère l’autoloading des classes définies dans les packages installés. Composer n’est pas fourni avec PHP il faut l’installer.

require 'vendor/autoload.php';

use Monolog\Logger;
use Monolog\Handler\StreamHandler;

$log = new Logger('name');
$log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING));

$log->warning('Foo');
$log->error('Bar');
logo git

Git branch commandes utiles

Créer une branche dans Github

Vous utilisez sans doute Github seulement pour la gestion de version avec la branche master (celle qui va en production).

Github vous a changé la vie car il vou smémorise absolument toutes les version de votre code. Il vous permet de revenir à un état antérieur si vous avez fait une gaffe.

Branching

Le branching consiste à créer une variante du dépôt de référence (appelé Master), de travailler dessus sans le moindre risque de toucher au master puisque logiquement différent donc mutuellement exclusif). Quand vous aurez fini de travailler sur la branche, vous pourrez fusionner avec le dépôt de référence !

Bien sûr il risque d’avoir des conflits de fichier, dans ce cas le système Git vous demande de valider à la main.

Commander pour créer une branche à partir du dépôt de référence :

$git branch votre_branche
$git checkout votre_branche

ces commandes ci-dessus sont souvent résumées en une seule commande :

$ git checkout -b votre_branche

La commande checkout va pointer votre espace de travail vers la branche. Donc vous quittez la branche de référence (ou master).

où votre_branche est le nom de votre branche.

Quand vous  voulez commiter vos changement au code, vous faites vos commande habituelles:

$ git commit -m 'ajout fonction xyz'
$ git push origin votre_branche

Pour fusionner la branche votre_branche avec le master, revenez vers le master

$ git  checkout master
$ git merge votre_branche

et pour effacer votre_branche, faites la commande ci-dessous:

$ git branch -d votre_branche

Pour des explication plus en détail (en anglais) voir cette page.

Renommer une branch local

#allez à la branch que vous voulez renommer 
$ git checkout vieux_nom
$ git branch -m nouveau_nom

Renommer une branche distante

Si vous avez déjà poussé la branch dans le dépôt distant, il vous fautdra cette commande supplémentaire ensuite:

git push origin -u nouveau_nom
#simplement effacez l'ancienne branche
git push origin --delete vieux_nom
logo git

Git remote changer d’url pour votre repository

Dans l’article précédent je vous ai montré comment générer une clé SSH pour ne plus à avoir à taper de mot de passe.

Si vous avez commencé à utiliser Github en tapant votre identifiant et mot de passe, il y a de grandes chances que vous accédiez à votre repository via une url web de type https.

Accéder à votre repository en https ou en ssh

Sachez qu’il est possible d’accéder à votre repository depuis un autre chemin.

Supposons que votre repository soit actuellement sur:

https://github.com/votre_nom/repository.git

Pour vérifier à quelle url vous allez pusher faites la commande suivante :

git remote -v

En ayant activé vos clé SSH, vous avez sans doute eu un message du type « Github doesn’t offer shell access »

Si vous utilisez SSH il faut switcher sur une url du type:

git@github.com:votre_nom/repository.git

Sachez que cela n’est possible que si vous avez mis votre clé SSH sur le site de Github.com. Utilisez la commande suivante :

git remote set-url origin https://github.com/USERNAME/REPOSITORY2.git

refaites une commande

git remote -v

pour vérifier.

Pour revenir en mode https

git remote set-url origin git@github.com:USERNAME/REPOSITORY2.git

Utilisez Xdebug pour profiler votre code

Xdebug est un outil très utilisé pour profiler votre code PHP

Il vous génère un fichier de log qui exploité avec Wincachegrind (un analyseur de log dédié sous windows) ou Kcachegrin (sous Linux), vous pourrez voir les goulots d’étranglement de vos code PHP.

 

Pour installer sur Debian rien de plus simple, connecté sous root:

apt-get install php5-xdebug

Pour windows je ne vous fais pas la manip qui doit couler de source.

Ensuite ajoutez ces lignes dans le fichier php.ini :

[xdebug]
xdebug.remote_enable = off
xdebug.profiler_enable = off
xdebug.profiler_enable_trigger = 1
xdebug.profiler_output_name = “cachegrind.out.%u.%H_%R”
xdebug.profiler_output_dir = “c:/wamp/tmp”
xdebug.show_local_vars=0
xdebug.max_nesting_level=250

Attention en fonction de votre installation de WAMP, le chemin eput être différent, c’est soit wamp pour les version avant 3, et wamp64 pour les version 3.

Ensuite une fois que tout est installé, allez sur une url que vous voulez profiler, et ajoutez à la fin de l’url :

?XDEBUG_PROFILE

s’il y a déjà un autre paramètre :

?id=5&XDEBUG_PROFILE

 

Le fichier est enregistré dans le répertoire tmp.

Comme vous pouvez le voir les fichiers de xdebug commencent par « cachegrind.out » plus une heure ou date.

Pour paramétrer l’output dir, c’est à vous de choisir le meilleur répertoire, vérifiez qu’il soit autorisé en écriture. Si c’est généré sur votre serveur web, il suffit de le télécharger sur votre ordinateur et de l’analyser avec Wincachegrind.

Pour analyser ces logs générés, il vous faut sous Windows le programme Wincachegrind, une fois installé, ouvrez le fichier log généré et vous pourrez explorer les goulots d’étranglement. En effet tous les fichiers php qui s’exécutent sont profilés et vous avez vraiment un détail exceptionnel sur les temps d’exécution du moindre script php ainsi que leur temps d’exécution, c’est en regardant ce dernier paramètre que vous pourrez identifier les coupables d’un site web lent.

logo git

Installer Git sur votre machine Linux Debian

Si vous êts déjà en Root:

apt-get install git-core

Si vous n’êtes pas en Root :

sudo apt-get install git-core

ou

su root

puis

apt-get install git-core

Créer un repository  à partir d’un projet existant

Aller dans le répertoir racine du projet, et faire

$ git init

$ git add .

$ git commit

Quelques commandes Git

Générer un fichier pour ignorer les fichiers à versionner :

Qu’est-ce qu’on n’a pas envie de versionner? Ce sont les fichier de configuration, les fichiers des vendor tierces.

Il faut générer un fichier gitignore et mettre dedans les fichiers et répertoires.

$ touch .gitignore

il suffit de créer un fichier .gitignore et d’y mettre les fichiers à exclure. Pour exclure un répertoire mettez dans le fichier gitignore:

folder/**

pour exclure un fichier ajouter dans le fichier gitignore

nom_fichier

Si vous avez des fichiers committés que vous voulez exclure, il faut les enlever de la staginf area

$ git rm --cached nom_fichier

$ git rm -r --cached repertoire

Dans le cas ci-dessus on a retiré un répertoire entier avec récursion (dna sle cas où il y aurait des sous-répertoires.

Ajouter le nom du repository pour un push initial

git remote add origin youruser@yourserver.com:/path/to/my_project.git

logo git

Github pusher sans mot de passe

Lorsque que vous êtes sous windows et que vous travaillez avec Github, au début c’est génial car cela vous permet de faire un grand bon en avant, le versionning rien de mieux pour faire des amélioration de votre logiciel de façon incrémental sans avoir à gérer les différentes version en renommand les nom de fichier avec les dates.

Seulement au bout d’un moment vous devez taper sans cesse votre login et mot de passe à chaque fois que vous voulez pusher ou puller vos modification

Les clés SSH à la rescousse !

Il est possible de se passer de taper le login et mot de passe à chaque fois que vous devez pusher ou puller.

Il faut simplement utiliser les clé SSH publiques et privées.

Si vous êtes sous Windows, vous utilisez sans doute Git Bash pour commiter vos modifications, c’est dans ce même git bash que vous allez générer vos clé publique et privée.

Tapez la commande :

ssh-keygen -t rsa -C "your_email@example.com"

(Sous Linux idem)

Quand vous aurez le message : Enter passphrase (empty for no passphrase):

entrez un mot de passe (ne l’oubliez pas vous en aurez besoin).

Vos clés sont générées et sauvée dans le répertoire .ssh, sous Windows allez dans le répertoire utilisateur pour le trouver.

Informer Github de votre clé RSA

Maintenant il faut copier le contenu de votre clé publique dans Github.com

  1. Allez dans Github.com Settings
  2. Barre à gauche cliquez sur SSH Keys
  3. Donnez une titre et collez le texte de votre clé publique et cliquez sur Add KEy

Voilà c’est tout !

Dernière astuce pour les plus paresseux :

Maintenant quand vous allez commiter il ne vous sera plus demandé l’identifiant et le mot de passe mais par contre vous aurez à rentrer la passphrase. Pour ne pas à avoir à entrer cette passphrase à chaque fois que vous commitez, vous allez devoir utiliser le ssh agent pour stocker l’information.

eval `ssh-agent`

ssh-add

vous aurez à entre de nouveau le passphrase. Mais vous n’aurez à entrer qu’une fois seulement  la passphrase à chaque nouvelle session de git bash.

Pour aller encore plus loin :

Pour n’avoir plus à entrer de passphrase du tout il vous faudra écrire un script shell qui se lance automatiquement à chaque démarrage de git bash.

le -s va le mettre en tâche de fond.

Pourquoi cela ne marche toujours pas?

En fait il faut changer de représentation d’url, ce post vous en dit plus sur les url chez Github.

Autre méthode pour ne pas avoir à retaper le mot de passe à chaque fois

Voici la commande pour ne pas avoir à retaper le mot de passe :

git config --global credential.helper store

La prochaine fois que vous allez faire un git pull, vous allez entrer votre identifiant et mot de passe. Mais les fois suivantes, vous n’aurez plus besoin de le faire.

Astuce si vous voulez que cette mémorisation ne dure qu’un certain temps, le timout est en secondes.

git config credential.helper cache <timeout>

Connaitre les variables de configuration du cache de Nginx

Je passe un peu en revue les directives utilisées dans le fichier de configuration du cache.

Nginx utilisé en reverse proxy sans le caching des pages ne rime à rien. On l’utilise pour servir du contenu statique afin d’accélérer grandement le temps de téléchargement, et croyez moi il est plutôt performant !

Un serveur proxy se met entre l’internaute et le serveur Apache par exemple (mais ça peut être n’importe quel serveur).

 

 

Directive Signification
proxy_cache définit une zone mémoire partagée pour stocker le cache
proxy_cache_bypass
proxy_cache_key  une valeur de type string, utilisée pour classer les parties du cache
proxy_cache_lock  si plusieurs requêtes demandent une page non cachée, la première crée le contenu caché avant que les autres puissent lire le cache évitant à toutes les requêtes de demander du contenu dynamique
proxy_cache_lock_timeout
proxy_cache_min_uses  nombre de fois qu’un contenu demandé avant d’être caché
proxy_cache_path  répertoire ou sera placé le contenu caché, on y place les clé (qui identifie les pages cachées) et le métadonnées
proxy_cache_use_stale  définit le cas de figure où l’on sert du contenu caché lorsque l’appel au serveur du backend (Apache) donne une erreur
proxy_cache_valid durée du vie du cache (la page web doit retourner 200,301 ou 301), ici cela veut dire que les page retournant un code cité ci-dessus sera caché, les pages 404 par exemple ne sont pas cachée

Installer virtualmin sur Debian

D’abord connectez vous n root vis SSH (avec Putty par exemple)

Ensuite en ligne de commande tapez la commande suivante :

wget http://software.virtualmin.com/gpl/scripts/install.sh

ensuite exécutez ce script shell :

sh install.sh et le processus se lance automatiquement, avant de démarrer l’installation, il va lister une série d’OS, le votre doit y figurer sinon l’installation se plante.

Google Analytics Measurement protocole ou Google analytics côté serveur

Introduction au Measurement Protocol ou comment faire du Google Analytics côté serveur

Google analytic est un outil pour mesurer le trafic Web sur votre site web. Il nécessite de mettre un bout de code pour traquer les visites des internautes

Mais il est aussi possible d’envoyer les informations vers google analytics sans passer par un navigateur. Vous pouvez donc depuis un script côté serveur envoyer des informations vers Google analytic pour qu’il enregistre des informations
Pour ce faire nous devons utiliser une API qui s’appelle Measurement Protocol. Le principe est simple, il faut faire une requête de type POST vers le serveur de Google Analytics point

Je vais vous expliquer pourquoi connaître cet aspect de Google Analytics avec important, c’est relatif au tracking des achats sur votre site web. Dans le cas où le paiement s’effectue sur le site de la banque, et que le client revient sur votre site web, l’achat et suivi. Mais dans le cas où le paiement se finit et que la personne ne reviens pas sur votre site web, vous ne pouvez pas suivre les conversions.

Measurement protocol nous permet donc d’envoyer l’information comme quoi là ça a été réussi même si l’internat ne reviens pas sur votre site web après avoir payé sur le site de la carte bancaire

Le principe est simple, vous allez envoyer une requête vers le serveur de Google Analytics avec des paramètres bien défini, les paramètres doivent être au complet, sinon la requête échoue. Mais Google vous fournit à d’outils pour simuler et valider vos requêtes. cet outil c’est le Hitbuilder.

Mais d’abord nous allons voir un exemple très simple pour simuler une première requête vers le serveur de Google Analytics.

 

Il y a énormément de paramètres à envoyer car vous pouvez construire les mêmes requêtes que le script de Google Analytics sur le site web
Il vous faut vous référer à la page de documentation sur les paramètres pour voir la liste complète
Mais sans plus attendre faisant de notre première requête vers le serveur de Google Analytics
Il y a 4 paramètres obligatoire le premier paramètre concerne la version vous pouvez mettre ça n’a pas d’importance, le deuxième paramètre et le paramètre qui concerne le type de requêtes que vous allez vous allez faire , le plus simple c’est la pageview.
Le troisième paramètre est l’identifiant de votre compte Google Analytics et le dernier paramètres concerne le type de campagne pour simplifier nous allons mettre direct.

Voyons d’abord dans le HitBuilder comment nous allons construire à cette requête, dans un premier temps on construit les paramètres, en fait c’est la chaîne de paramètres que vous avez envoyer, ensuite vous allez cliquer sur le bouton Valider pour valider l’intégrité de cette requête et si tout se passe bien vous pouvez envoyer grâce à un bouton vers google Analytics la requête.

Pour visualiser le résultat de cette requête, basculer dans la vue temps réel de Google Analytics, vous aurez un retour immédiatement

Construire requêtes dans le Hitbuiler et cliquer sur Validate Hit

 

 

 

Allez ensuite sur votre interface Google Analytics dans le raport temps réel pour voir le résultat.

 

Étant donné que vous avez envoyé vraiment une requête vers votre serveur Google Analytics virgule les données Google Analytics de votre site de production seront affectés. Mais en développement vous pouvez vous permettre d’envoyer quelques données de test sont vraiment pollué les données de votre analytique.

Maintenant que l’on a réussi à envoyer une requête et à la visualiser grâce au graphique trafic temps réel de Google Analytics, on va essayer de faire une requête maintenant avec un script côté serveur. Attention, il y a un paramètre qui ne faut pas omettre et qui est le paramètre dp comme document path, je ne l’ai pas fait la première fois et aucune donnée n’a été envoyée,  ce n’est pas évident car si vous en mettez ce paramètre dans le tuto le HitBuilder, il va dire que la chaîne de requête est valide alors que aucune donnée n’a été envoyée, alors que dans la documentation de référence il est bien dit que dp et dh sont obligatoires dh étant le Host (nom de domaine).

Requêtes dans le Hitbuilder de type transactionnelle

Bien que cet exemple soit très simple, le plus simple possible, il nous faut quand même 6 paramètres pour compléter la requête. Avant d’aller plus loin vers les scripts côté serveur, regardons quand même comment est fait une requête de type e-commerce et transactionnelle puisque c’est le but de cet article c’est-à-dire qu’on voudrait identifier les transactions e-commerce grâce à un script côté serveur.

Je prendrai l’exemple du logiciel de e-commerce PrestaShop. dans le logiciel Prestashop les transactions sont identifiées par le numéro de commande (et non le numéro de panier), par exemple pour une commande dont le numéro de panier est 3012, le numéro de transaction est 3012.

Dans Google Analytics, vous pouvez voir les transaction dans Conversion > Transaction.

Envoi d’une transaction

ti : transaction id

ta : transaction affiliation, ou le nom de la boutique

tr : transaction revenue,

ts : transaction shipping, frais de port

tt : transaction tax

cu : currency

Envoi d’un item

ti : transaction id, bien sûr si vous voulez que l’on sache dans quelle transaction cet item a été acheté !

in : item name

ip: item price

iq : item quantity

ic : item code (la référence de l’article)

iv : item category

cu : currency

Lorsqu’on envoie vers google analytics un item, il faut spécifier bien sûr le numéro de la transaction à laquelle il est associé vous spécifiez un sous-total, mais attention il faut que lorsque vous envoyez les items du panier, le total des items doit être cohérent avec le montant de la transaction, je vous laisse faire ça à côté serveur, tout ceci pour vous dire que vous pouvez avoir une incohérence entre la transaction le montant de la transaction est le total des items du palier, le système vous le permet.

Measurement Protocol Validation Server

 

Url de validation :
https://www.google-analytics.com/debug/collect?tid=fake&v=1
Elle ne diffère de la véritable url que de /debug/
Url d'envoi de requêtes :
https://www.google-analytics.com/collect?tid=fake&v=1

Lorsque vous forger une requête et de vous envoyer vers le serveur de Google analytic même si elle échoue n’aurait pas de message d’erreur en retour.
C’est pour cela que Google Analytics vous propose une adresse pour tester vos requêtes.

Attention j’ai noté que même si une requête est bien formatée et qu’elle ne retourne pas d’erreur en mode débogage, ceci ne veut pas dire que vous avez réussi votre requête. J’ai eu le cas où j’ai essayé pour une première fois d’envoyer une requête transaction où je n’ai pas inclu tous les paramètres « optionnels » , la requête n’a rien donné, j’ai vérifié en mode débogage j’ai eu un retour ok mais je n’avais toujours rien dans le rapport de Google Analytics.

Finalement j’ai relu la documentation j’ai pris l’exemple et j’ai réussi ma requête comme quoi il faut toujours se reporter à la documentation et bien la lire.

 

Beaucoup d’exemples de la documentation officielle pour aide mémoire des différentes type de requêtes.

Measurement protocol n’est pas limité au web, les applications Android peuvent utiliser l’API de Measurement Protocol. Les requêtes en  POST ainsi que GET peuvent être utilisées.

J’espère vous avoir aidé dans votre quêtes du tracking intégrale de toutes les transactions, en particulier les transaction de clients pressé (souvent en BtoB) qui ne reviennent même pas vers le site d’origine, tellement ils ont confiance en leur fournisseur.

Il est absolument important de pouvoir tracker toutes les conversion afin de mesurer le retour sur investissement des campagnes de marketing. Sans mesure on ne peut rien améliorer.

 

Cliquer sur le bouton vert pour envoyer la requêteEnvoi d’une transactionEnvoi d’un item de transaction

Installation de Nginx en front end Apache en backend

Aujourd’hui le moteur de recherche Google veut faire de la vitesse de chargement d’un site web un critère de ranking dans les SERPs.

Ce n’est pas idiot, et de toute façon, sans même parler de moteur de recherche, il est important d’avoir un site web qui va vite.

Dans le domaine du e-commerce par exemple, il ne faut pas que la vitesse de chargement dépasse 4 secondes.(les puriste disent 2), mais on va dire 3 (coupons la poire en deux) c’est ok.

Le problème est quand le site de e-commerce devient grand, quand il y a beaucoup de gens qui visitent le site (forcément vous avez un site qui marche sinon), et de même il n’y a pas que des humains qui vous rendent visite il y a aussi les spiders !

Entre Google bot qui passe toutes les minutes ou toutes les 10 secondes, les bots de majesticSEO ou de Ahrefs, archive.org etc, votre Apache hé bien il est surchargé.

Vous aurez beau optimiser les facteurs suivants : compression GZIP, mise en place d’un cache, utilisation de serveur de médias, de CDN, de minification des scripts, de mise en place de javascript à la fin, ces solution ont une limite à la fin, cela ne suffira pas.

La solution ultime c’est NGINX !

C’est quoi Nginx? c’est un serveur web comme Apache, écrit par un Russe, il est plutôt peu gourmand en ressource, et il est rapide pour servir des fichiers statique. Statique? vous dites Cache? hé bien c’est pas loin !

Le secret ici est de servir tout ce qui est statique par NGINX et ce qui est dynamique par Apache.

Nginx est dans ce cas ce qu’on appelle un reverse proxy, ou serveur frontal. Définition sur cette page.

Donc avec Nginx on peut faire ces 5 choses :

  1. servir du contenu statique
  2. intermédiaire de sécurité
  3. terminal SSL
  4. répartition de charge (load balancing)
  5. compression de site

Nous allons donc dans les lignes qui suivent, installer Nginx sur un serveur dédié qui tourne déjà avec le serveur web Apache, ils seront donc sur la même machine.

 

Installation de Nginx en ligne de commande (Linux Debian)

Là je suppose que vous avez des connaissance en shell, c’est très simple, il faut installer Nginx avec la commande suivante :

$ apt-get install nginx

il faut que vous vous loggiez en root pour faire marcher cette commande.

Une fois que Nginx est installé, il y a déjà un fichier de configuration example. Sauvegardez ce fichier sur votre ordinateur pour le réutiliser si besoin, mais on n’aura pas besoin, cependant renommez ce fichier au nom de votre site web. J’utilise Winscp pour manipuler de manière sécurisée les fichiers depuis mon ordinateur en effet le faire en ligne de commande est assez fastidieux.

Configuration d’un fichier serveur Nginx

Le fichier de configuration de site web de Nginx doit être installé dans le répertoire (pour les Debian) , comme pour Apache 2, dans sites-available et sites-enabled.

« Available » veut disponible et « enable » veut dire activé. En fait si vous avez un fichier dans « enabled », ça veut dire que le site est en ligne.

Le fichier dans sites-enabled est un lien symbolique vers le fichier de configuration du répertoire site-available.

Nginx en ce qui concerne les webmasters a deux fonctions bien distinctes, soit vous l’utilisez pour remplacer Apache (ce dernier est donc à virer) soit vous l’utiliser comme reverse proxy (thème de cet article), donc il fonctionnera parallèlement à Apache !

Notion fondamentale : Si Nginx et Apache fonctionnement en même temps, pour éviter tout conflit, Apache qui écoute habituellement sur le port 80 doit changer de port, on le mettre sur le port 8080, et Nginx sur le port 80, ce qui suppose une modification du fichier de configuration d’Apache comme on le verra plus tard dans cet article.

Imaginons que je veuille proxier phpninja.fr

server {

  listen   80; ## listen for ipv4

  server_name  phpninja.fr www.phpninja.fr;
  access_log  /var/log/nginx/localhost.access.log;

  location / {
    root   /home/phpninja.fr/public_html/;
    index index.php index.html index.htm;
    try_files $uri $uri/ /index.php;
  }


  # proxy the PHP scripts to Apache listening on 127.0.0.1:8080
  #
  location ~ \.php$ {

  proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;

  proxy_set_header Host $host;
  proxy_pass   http://88.191.158.109:8080;
  }



  # deny access to .htaccess files, if Apache's document root
  # concurs with nginx's one
  #
  location ~ /\.ht {
    deny  all;
  }
}

Listen 80 : on dit à nginx d'écouter sur le port 80

Server name : on donne les sites à proxier

Un fichier de log est spécifié, utile quand vous voulez débugger.

Dans Location /, vous lui dites où se trouve la racine du site web, le fichier index, et try files sert à dire à Nginx de proxier toutes les requêtes, si Nginx ne peut pas, alors il va passer le requête à Apache.

Location ~ \.php$  est trè_s important, il dit qu’il faut passer les fichier php à Apache. Comme dit plus haut Nginx ne vient pas avec le support de php, donc il est logique que ce soit Apache qui le fasse.

 

Proxy pass indique l’adresse IP du serveur auquel les requêtes sont passée (adresse IP de votre virtual host Apache).

 

Enfin location ~ /\.ht sert à éviter tout conflit dans l’interprétation du fichier type htaccess, ht_password etc dans le cas ou Nginx et Apache en ont.

Modification de la partie Apache

Il faut maintenant qu’Apache écoute sur le port 8080, c’est la seule modification que vous aurez à faire. Dans le cas de Debian, il faut modifier le fichier ports.conf comme suit:

Listen 88.191.158.109:8080
Listen 443

Il faut aussi modifier NameVirtualHost

NameVirtualHost 88.191.158.109:8080

Faire la manip sur tous les fichiers Vhost même si vous ne voulez pas les proxier. Dans tous les cas il faut le faire car Apache doit écouter sur 8080 au lieu de 80, sinon le démarrage de Nginx sera problématique.

ensuite il faut installer le module rpaf.

Il sert à envoyer à Apache l’IP du navigateur et non celui de Nginx, sinon vous perdrez cette information.

RPAFenable On
RPAFsethostname On
RPAFproxy_ips 213.246.45.34

spécifier l’adresse publique du proxy.

Conclusion

Redémarrer Apache et Nginx avec les commandes :

service apache2 restart
service nginx restart

Si tout se passe bien, vous allez voir une accélération de votre site ! Et encore on n’a pas encore fait les optimisations de Nginx !

Pour vous amuser, vous pouvez mettre un fichier info.php avec l’instruction phpinfo().

Dans la page qui s’affichera, vous verrez la signature de Apache.

Par contre si vous avez Firebug, ou Httpfox, vous verrez la réponse du serveur le nom Nginx.

SSH temps connexion long après mot de passe

Voilà un problème que j’ai eu  récemment que j’ai résolu en cherchant sur le net.

Lorsque je me connecte via SSH à mon dédié, après que le mot de passe soit entré, le temps d’attente peut être très long une minute ou plus pour accéder au shell.

J’ai jusque là contourné le problème en ouvrant une seconde fenêtre et en me connectant au même compte et fermer la première pour aller plus vite.

 

En fait il s’avère que le problème soit dû à un lookup DNs un peu long. Pour remédier à ce problème, il faut ajouter une directive dans le fichier de configuration du SSH.

 

Il faut ajouter cette ligne ou la décommenter :

UseDNS no

là votre connexion devrait être beaucoup plus rapide.

serveur web apache php

Allonger la durée d’exécution d’un script php

Comment allonger la durée d’exécution d’un script PHP?

 

Il est souvent frustrant lorsqu’on débute en PHP d’avoir une erreur 500 suite à un script qui met du temps à s’exécuter.

Dans la littérature PHP, vous avez la fonction set_time_limit(int $secondes), qui permet d’aller au-delà de la valeur par défaut de 30 secondes. Mais il y a une exception, si votre installation PHP est en safe mode, ça ne marche pas. On vous recommande d’aller dans le fichier php.ini pour configurer la variable d’environnement max_execution_time.

Mais pour des raisons de configuration, il se peut que même cela ne marche pas. Il faut aller encore plus bas au niveau d’Apache, et triturer une autre variable d’environnement.

Configurer Apache si vous avez accès au fichier de configuration

Si dans les logs Apache vous avez le message  suivant :

mod_fcgid: read data timeout in 31 seconds

 

lisez ce qui suit si vous êtes sous Webmin mais à transposer pour d’autres panels:

Sous Webmin > Servers > Apache Webserver > Global configuration > Edit Config File

Il faut aller dans le fichier de configuration d’Apache et trouver la ligne qui contient :

IPCCommTimeout

au lieu de laisser la valeur par défaut à 31 passez la à 100 pour éviter des erreurs 500, dû à un dépassement des 31 secondes.

 

Pourquoi je vous dis ça? c’est parce que en googlant ce topic j’ai jamais réussi en runtime à lever cette limite, cette méthode est sûre.

Cette directive se trouve dans le le fichier de configuration Apache global ou sur chaque Vhost.

Mais devez vous toucher à cette varaible?

Il est des CMS ou l’on n’a pas envie de voir comment c’est fait, donc oui on va toucher à al configuration. Mais si vous êtes un peu plus aguerris, je vous propose en recvanche d’exévcuter vos script php en ligne de commande !

Exécuter un script php en ligne de commande

Si vous êtes sous Linux, vous pouvez exécuter n’importe quel script php de cette façon :

$ php monscript.php

En mode ligne de commande, (CLI : command line interface), vous n’avez pas de limite de durée comme en mode web. Pourquoi? parce qu’en mode web, vous avez une contrainte, en effet les internautes ne doivent pas poireauter devant votre site web, et il est donc considéré comme anormal que des scripts mettent des minute à s’exécuter.

Comment integrer un lien email avec le sujet et le corps

Voici comment créer un lien qui va ouvrir un client email avec déjà le texte du email écrit dedans, utili si vous automatiser la création d’email personnalisés.

Relancer Paiement Me

L’astuce consiste à mettre un lien mailto au lieu de http://, et de mettre le email cible.

Ensuite on introduit deux paramètres : Subject et body.

Le caractère esperluette doit être url encodé, en php c’est avec la fonction urlencode qu’on fait ça.

Le caractère %0A%0A est un retour chariot.

Programmer son client FTP avec php

Programmez votre propre client FTP en PHP

Vous aurez peut être envie un jour de pouvoir uploader des fichier dans un serveur web, afin de mettre en place une nouvelle version d’un script. Si vous pouvez automatiser cette tâche, vous aurez un grand gain de productivité. On peut imaginer que vous ayez déployé un CMs sur plusieurs serveurs web, et que vous vouliez mettre en place une mise à jour en trois fois rien de temps.

Ceci est possible en php, votre langage de programmation favori. Fini donc les laborieuses connexions à la main avec Filezilla, on va automatiser ça.

FTP en PHP avec CURL

Ce n’est pas l’option la plus simple. En effet, il faut disposer de la bibliothèque CURL (pas si difficile que ça en fait), mais surtout écrier plusieurs lignes de php :

$ch = curl_init();
$localfile = 'test.txt';
$fp = fopen($localfile, 'r');

curl_setopt($ch, CURLOPT_URL, 'ftp://login:password@www.monsite.com/public_html/'.$localfile);
curl_setopt($ch, CURLOPT_UPLOAD, 1);
curl_setopt($ch, CURLOPT_INFILE, $fp);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($localfile));

curl_exec ($ch);
$error_no = curl_errno($ch);
curl_close ($ch);

if ($error_no == 0) {
$message = 'File uploaded successfully.';
} else {
$message = "File upload error: $error_no. Error codes explained here http://curl.haxx.se/libcurl/c/libcurl-errors.html.";
}
echo $message;

?>

ce script va charger le fichier test.txt de votre disque dur vers le serveur FTP et donc votre site web !

Mais comme toujours avec CURL, c’est fastidieux, il faut instancier l’objet CURL, injecter de paramètre et l’exécuter.

FTP en PHP plus simple avec les fonction FTP de PHP

Nos allons voir que c’est plus intuitif avec les fonction FTP de PHP.

En effet pour faire la même chose que le script ci-dessus:

// Ouverture de quelques fichiers pour lecture
$file = 'somefile.txt';
$fp = fopen($file, 'r');

// Mise en place d'une connexion basique
$conn_id = ftp_connect($ftp_server);

// Identification avec un nom d'utilisateur et un mot de passe
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

// Tente de charger le fichier $file
if (ftp_fput($conn_id, $file, $fp, FTP_ASCII)) {
echo "Chargement avec succès du fichier $file\n";
} else {
echo "Il y a eu un problème lors du chargement du fichier $file\n";
}

// Fermeture de la connexion et du pointeur de fichier
ftp_close($conn_id);
fclose($fp);

?>

Ici on crée une connexion FTP comme si on le faisait pour une connexion Mysql, on ouvre le fichier en local et on le met sur le serveur FTP. Avouez que c’est quand même plus lisible !

Utiliser MYSQL en ligne de commande sous Linux

Il y a des moment où vous ne pouvez plus faire appel à Phpmyadmin, car l’interface web a des lilmite lorsque vous devez manipuler de larges portions de données (en Gigaoctet).

 

Il faut donc revenir au bon vieux shell Linux.

Connexion au compte Mysql

mysql -u root -p

Après cette commande, vous devez entrer votre mot de passe root (notez que n’importe quel compte peut être administrateur de votre base si vous l’avez créé comme tel.

 

Sélectionner la base de données à utiliser

Vous devez le faire sinon vous ne pouvez pas requêter sur votre base.

use  `ma_base`;

N’oubliez pas de taper le point virgule qui indique la fin de la commande sql. Si vous avez tapé ENTRER déjà ce n’est pas grave vous pouvez le faire.

Les commandes SQL

A partir de maintenant, vous allez être en terrain familier. Le sql n’a pas changé, se rappeler juste qu’il faut mettre le point virgule à la fin de la commande.

 

Maintenant que vous connaissez la base, et que vous pouvez requêter en ligne de commande comme les pro, vous allez vraiment apprécier la vitesse d’exécution sur de grosse bases de données, là où phpmyadmin rame, vous irez en vitesse normale !

Pour vous déconnecter

Taper exit;

Vider le cache de Firefox

La méthode ultime pour vider le cache DNS de Firefox !

Les webmasters ont besoin lors de leur migration de voir où en est le pointage des DNS.

Souvent on est confronté depuis son ordinateur de travail à l’ancienne version de son site après avoir pointé les DNS vers un nouveau serveur DNS.

Vous shootez une demande de soutien à votre hébergeur, la réponse est toujours du type attendez 24 à 48 heures.

Dans la plupart du temps, on n’a pas besoin d’attendre 24 heures que les DNS se propagent, c’est quelques heures.

Alors pourquoi en dépit de cela après 48 heurs, on est toujours sur l’ancienne version? voire une page d’erreur du nouveau serveur d’hébergement?

La solution ultime pour vider le cache DNS de Firefox

Si vous travaillez avec Firefox, cet explorateur possède un petit cache qu’on appelle cache DNS, qui mémorise l’information du DNS. C’est ce cahce qui pose problème, pour résoudre ce problème de cache, on vous conseille souvent de faire about:config dans la barre d’adresse, solution classique, (  faites une recherche dans Google, on vous expliquera ça) mais cela ne marche pas toujours !

Même en remettant network.dnsCacheEntries à 0 et network.dnsCacheExpiration à 0 aussi, cela ne marche pas !

J’en ai fait l’expérience, et j’ai dû pour résoudre ce problème en vidant l’historique de Firefox.

Allez dans Historique > supprimer historique récent, vous aurez une fenêtre pour cocher les élément à supprimer, vous pouvez laisser cookie et connexion active (cela vous évitera de vous relogger dansles services web, dans le cas échéant, videz tout !).

 

Et c’est une solution qui garantit de marcher !

Equivalent de Explode en javascript

Javascript Split et Join

 

Explode et Implode en PHP sont deux fonctions bien pratiques, qui permettent de transformer une chaine de caractères en tableau et vice et versa.

En javascript il existe des équivalents, split() et join() .

Leur usage est tout simple:

var str = "item1,item2,item3,item34";
str.split(',');

 

Ce qui va engendrer un tableau de type :

Array(item1, item2,item3,item4);

Et pour le cas de join() la syntaxe est la suivante

array tab = new Array(item1,item2);

var str = tab.join('.');

 

et on aura un string de type « item1.item2 »

 

Installer la librairie GD pour PHP

Installe GD en ligne de commande

C’est très simple, il faut vous logger sur votre shell via putty en mode root (pour pouvoir installer des extension sous Linux il faut être en mode root.

Et ensuite tapez cette commande :

$ apt-get install php5-gd

Ou alors si vous n’êtes pas connecté en root, tapez cette commande et vous serez invité à entrer le mot de passe root.

$ sudo apt-get install php5-gd

l’installation dur une trentaine de seconde le temps de reconfigurer (automatiquement) le serveur web Apache

Mysql logo

Voir les requêtes lente sur mysql

Les requêtes lentes sont les slow queries, pour les voir il faut créer le fichier de log appelé slow query log.

Pour ce faire il faut éditer votre fichier my.cnf, le fichier de configuration de mysql et ajouter les lignes suivantes:

log_slow_queries = 1;
slow_query_log_file = ;

Toutes les requêtes qui prennent plus de 1 seconde seront loggées. Relancez le serveur mysql  avec :

/etc/init.d/mysql restart en utilisateur root

Une fois que vous avez réussi à générer le fichier log des requêtes lentes, il faut l’analyser.

Vous pouvez le faire en lisant les logs brutes ou alors utiliser un programme installé d’office avec Mysql appelé mysqldumpslow.

 

Une fois que vous avez identifié et triés celles qui vous intéressent il faut lancer la requêtes dans un EXPLAIN.

http://stackoverflow.com/questions/11606972/how-can-i-enable-slow-query-log-on-my-server

mysql

Les tables fragmentée de mysql le ralentissent

une table fragmentée c’est comme un disque dur fragmenté, l’information est éparpillée.

Donc il faut la défragmenter. Le problème c’est comment trouver les tables fragmentée?

Cette petite requêtes sql devra faire l’affaire :

select TABLE_NAME,Data_free
from information_schema.TABLES
where TABLE_SCHEMA NOT IN ('information_schema','mysql')
and Data_free > 0;

 

Une fois que vous avez des tables listée exécutez la requête suivante sur chaque table :

optimize table la_table_fragmentee

serveur web apache php

Limites de connection sur serveur Apache

Voici une commande linux pour connaitre le nombre de connexions simultanée acceptable par votre serveur:

#ab -c 5 -n 10000 http://www/domain.com/fichier.php

il est important de spécifier le fichier, http://www.domain.com/ ne marche pas

Mysql logo

MysqlTuner votre compagnon de route indispensable !

Pour installer mysqltuner sous Debian:

apt-get install mysqltuner

ensuite entrez

#mysqltuner

il est conseillé d’attendre d’avoir au moins 24 heure de stats mysql pour faire des analyses.

Mysqltuner est un premier pas pour dégrossir les optimisations les plus évidentes pour mysql.

Retour en haut