Un Truc En PHP 5.3 Que Vous Ne Pouvez Plus Faire En PHP 5.4 Multi Define De La Même Constante

EN travaillant sur un script ecommerce ultra pourri mais qui est en prod et que je dois migrer vers un serveur avec une version PHP 5.4, je me suis aperçu qu'il y avait une erreur loggée dans error_log : il y avait deux définitions de la même constante. Et le scrit ne tournait donc pas sur le serveur, puisque après un test, avec un script php où je définissait deux fois la même constante, sur 5.3 ça tournait sans problème, la constante était aussi (presque) malléable qu'une variable, voici le script :

<?php
define('TO', "bonjour");
echo TO;
define('TO',"au revoir");
echo TO;
?>

sous PHP 5.3

$ php test.php
bonjourbonjour

Bien que la constante puisse être redéfinie, sa valeur  ne change pas.

sous PHP 5.4

$ php test.php
bonjourPHP Notice:  Constant TO already defined in /home/user/test.php on line 4
PHP Stack trace:
PHP   1. {main}() /home/user/test.php:0
PHP   2. define('TO', 'au revoir') /home/user/test.php:4

On voit que le premier echo est exécuté, mais que le second déclenche une notice (ça peut être une erreur fatale).

Je pense que c'est une bonne chose (absolument !), soyons logique une constante ne peut être changée alors pourquoi autoriser la redéclaration? Heureusement que ça a changé et que PHP soit un langage plus rigoureux.

 

Bonus :

En PHP 5.3 vous pouvez utiliser un index d'un tableau qui n'existe pas sans qu'il vous geule dessus,

ainsi :

<?php
echo $p[0];

ne vous avertira rien.

 

 

 

 

 

 

 

 

2017-05-12 07:05:12 0 Commentaires

Magento : Enlever Le Index.php De L'url

Par défaut, si lors de l'installation de Magento, vous n'avez pas coché l'option rewrite_url, vos urls auront "index.php" juste après le nom de domaine. Pour l'enlever, car ce n'est pas très beau, il faut au préalable que mod_rewrite (un module Apache pour réécrire les urls) soit installé.

Une fois ce prérequis rempli, vous allez dans System > Configuration, puis sous Genral > Web, dans la section Search Engine Optimization, pour la dropdown list mettez sur 'Yes'. Rafraichissez votre page administration et frontend.

2017-02-15 13:02:03 0 Commentaires

Magento Désinstaller Un Module Manuellement

Il existe peu d'information pour désinstaller un module dans Magento, or il est préférable de la faire proprement.

Désintaller un module consiste à désactiver dans un premier temps le module et ensuite effacer les fichiers php, et les tables qui sont créée s'il y en a.

Commencez par désactiver le module

Regardez s'il n'a pas un script de création de table (il existe alors un répertoire sql au même niveau que /Helper ou /controllers)

Enlevez donc les tables correspondantes

la table Magento native core_resource peut contenir des informations des modules.

Effacer les fichiers dans app/code et app/design, /skin, /js

 

Par rapport à Prestashop, c'est vraiment pas top, Prestashop permet de désinstaller programmatiquement, inutile de s'emmerder avec toutes ces manipulations.

2017-02-14 10:02:20 0 Commentaires

Magento Comment Mettre Des Produits Sur La Homepage

A la différence des autres logiciels de ecommerce, avec Magento vous allez avoir du mal à mettre votre produit en page d'accueil, sans faire une manipulation bien particulière.

Afficher des produits d'une catégorie sur la page d'accueil

Allez sur la catégorie qui vous intéresse et regardez son ID vous en aurez besoin pour la suite.

Allez dans CMS > Pages > Home

Allez dans l'onglet Content et collez le bout de code suivant :

{{block  type="catalog/product_list" category_id="4"  template="catalog/product/list.phtml"}}

 Update  !

Due à une mise à jour de sécurité, vous ne pouvez plus adopter cette méthode (plus exactement la SUPEE-6788), il faut toucher au xml du layout directement, donc dans la section Design de la page CMS, vous collez le bout de code suivant :

 

 

 

2017-02-13 08:02:56 0 Commentaires

Optimiser Mysql Avec Mysqltuner

Une installation de base de Mysql n'est pas optimisé pour votre ou vos sites web.

Aussi après un certains temps de fonctionnement, une heure par exemple, vous devez commencer à régler les paramètres de Mysql pour que Mysql aille plus vite.

Nous allons nous aider d'un programme en Perl Mysqltuner, que vous allez télécharger depuis votre shell via la commande suivante :

$ wget http://mysqltuner.pl/ -O mysqltuner.pl

$ perl mysqltuner.pl

Au bout de quelques instants Mysqltuner va vous sortir un rapport avec des recommandation. Ce sont de réglages à faire dans votre fichier my.cnf qui est le fichier de configuration de Mysql.

Voici un exemple de rapport généré :

[!!] User '@localhost' is an anonymous account.
[!!] User '@ns35.ovh.net' is an anonymous account.
[!!] User '@localhost' has no password set.
[!!] User '@ns35.ovh.net' has no password set.
[!!] User 'root@127.0.0.1' has no password set.
[!!] User 'root@ns35.ovh.net' has no password set.
[!!] User '@localhost' has user name as password.
[!!] User '@ns35.ovh.net' has user name as password.
[!!] There is no basic password file list!

-------- CVE Security Recommendations --------------------------------------------------------------
[--] Skipped due to --cvefile option undefined

-------- Performance Metrics -----------------------------------------------------------------------
[--] Up for: 4d 12h 12m 30s (89M q [228.694 qps], 20M conn, TX: 582G, RX: 4G)
[--] Reads / Writes: 78% / 22%
[--] Binary logging is disabled
[--] Physical Memory     : 1.9G
[--] Max MySQL memory    : 449.2M
[--] Other process memory: 518.0M
[--] Total buffers: 34.0M global + 2.7M per thread (151 max threads)
[--] P_S Max memory usage: 0B
[--] Galera GCache Max memory usage: 0B
[OK] Maximum reached memory usage: 141.2M (7.12% of installed RAM)
[OK] Maximum possible memory usage: 449.2M (22.64% of installed RAM)
[OK] Overall possible memory usage with other process is compatible with memory available
[OK] Slow queries: 0% (22/89M)
[OK] Highest usage of available connections: 25% (39/151)
[OK] Aborted connections: 0.00%  (65/20403660)
[!!] name resolution is active : a reverse name resolution is made for each new connection and can reduce performance
[!!] Query cache is disabled
[OK] Sorts requiring temporary tables: 0% (1K temp sorts / 4M sorts)
[!!] Joins performed without indexes: 296569
[OK] Temporary tables created on disk: 9% (90K on disk / 958K total)
[!!] Thread cache is disabled
[!!] Table cache hit rate: 0% (64 open / 299K opened)
[OK] Open file limit used: 12% (127/1K)
[OK] Table locks acquired immediately: 99% (32M immediate / 32M locks)

 

  Remove Anonymous User accounts - there are 2 anonymous accounts.
    Set up a Password for user with the following SQL statement ( SET PASSWORD FOR 'user'@'SpecificDNSorIp' = PASSWORD('secure_password'); )
    Set up a Secure Password for user@host ( SET PASSWORD FOR 'user'@'SpecificDNSorIp' = PASSWORD('secure_password'); )
    Enable the slow query log to troubleshoot bad queries
    Configure your accounts with ip or subnets only, then update your configuration with skip-name-resolve=1
    Adjust your join queries to always utilize indexes
    Set thread_cache_size to 4 as a starting value
    Increase table_open_cache gradually to avoid file descriptor limits
    Read this before increasing table_open_cache over 64: http://bit.ly/1mi7c4C
    Beware that open_files_limit (1024) variable
    should be greater than table_open_cache (64)
Variables to adjust:
    query_cache_size (>= 8M)
    join_buffer_size (> 128.0K, or always use indexes with joins)
    thread_cache_size (start at 4)
    table_open_cache (> 64)
    innodb_file_per_table=ON
    innodb_log_file_size should be equals to 1/4 of buffer pool size (=2M) if possible.


Regardez les point d'exclamations, ce sont les point à travailler ! Mais tous les point n'ont pa s la même importance selon ce que vous recherchez. Moi je cherche la performance, voici ce que je regarde de ce rapport :

Ce qui saute aux yeux c'est query cache qui n'est pas activé !! Le cache stocke les requêtes qui sont les plus utilisée, afin de ne pas taper dans le moteur de base de données Mysql, mais sur un résultat déjà calculé donc on gagne du temps.

Voyons comment on peut soigner ce point :

Vous aurez remarqué qu'une des recommandations est de logger les requêtes lents via le slow query log. Pour ce faire, on va mettre en action le slow query log .

Ensuite nous allons donner une taille au cache de 8 Mo comme suggéré.

D'abord il faut se connecter à Mysql en ligne de commande.

Ensuite pour connaitre l'existence d'un query cache :

mysql > SHOW VARIABLES LIKE 'have_query_cache';

+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| have_query_cache | YES   |
+------------------+-------+

Selon la documentation officielle ce n'est pas parce que c'est à YES qu'il existe !

mysql> SHOW VARIABLES LIKE 'query_cache_size';

+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| query_cache_size | 0     |
+------------------+-------+

Enfin il existe mais est à zéro. Donnons lui une taille :

mysql> SET GLOBAL query_cache_size = 8000000;

 


+------------------+---------+
| Variable_name    | Value   |
+------------------+---------+
| query_cache_size | 7999488 |
+------------------+---------+

voilà c'est en place ! Attendre un petit peu suivant le traffic de votre site web.

 

Attention ! ceci est à faire dans le fichier my.cnf, sinon quand vous allez redémarrer mysql, ça va disparaitre. Voilci quelques valeur recommandées :

query_cache_type = 1 // pour activer le cache
query_cache_size = 256M
query_cache_limit = 2M
query_cache_strip_comments =1

 

 

 

 

2017-02-02 14:02:34 0 Commentaires

Les Sous Modules Dans Git

UPDATE :

N'utilisez pas les sous module GIT, ils sont d'un usage délicat, googlez le sujet, vous verrez des blogs qui votent contre. Préférez cloner dans un sous répertoire et ignorer ce sous-répertoire.

 

Lorsque vous développez un module pour Prestashop ou Magento, les fichiers se logent dans un sous répertoire de la solution. Si en même temps vous devez versionner la solution globale, et le module, mais que vous voulez gérer deux dépôts Git différent, pour pouvoir par exemple distribuer le module indépendamment plus tard, la solution qui s'offre est la gestion des sous-modules de git.

 

Vous avez votre module dans une répertoire quelconque, et vous avez déjà versionné les scripts.

Vous allez dans un sous-répertoire de la solution globale, et vous clonez le dépôt du module :

$ git clone git@github.com:gituser/module.git

 

2017-01-30 16:01:40 0 Commentaires