Premiers tests de Google App Engine en PHP

C’est une des grosses annonces de la Google I/O 2013, Google App Engine supporte maintenant PHP. J’ai eu l’occasion de le tester sur un de mes projets. La première chose qu’il faut constater, c’est que l’utilisation du service en PHP n’est pas vraiment ouverte. Pour le moment il faut passer par une phase de validation de son projet pour avoir le droit d’utiliser le service. On est maintenant à 2 semaines de l’annonce et seulement 282 projets on été acceptés.

Configuration

Qui dit PHP dit LAMP et donc mysql. Google a justement ouvert une offre Cloud SQL. Nous ne sommes plus limités à leur DataStore NoSql sur GAE (c’était déjà le cas depuis plusieurs mois). Par contre la facturation du service Cloud SQL se fait à l’heure alors que le DataStore facture à l’usage (nombre de read/write). C’est moins économique pour un petit projet mais plus facilement prédictif. Pour la sauvegarde de fichier il faut utiliser Google Cloud Storage qui n’est ni plus ni moins une copie du service S3 d’Amazon. Les APIs sont même compatibles.

Pour utiliser l’ensemble de ces services la console GAE n’est plus suffisante, il faut utiliser la “Cloud Console”. Et c’est là que commence le parcours du combattant.

SNS

Sur mon projet, au moment de vouloir créer mon premier Bucket sur Cloud Storage on me demande d’activer le Billing. J’ai donc entré mes informations personnelles et mon numéro de carte bleue. Rien d’exceptionnel s’il ne fallait pas le faire pour chaque projet ! A chaque fois on me redemande la même chose. Pire il faut aussi activer le billing sur la console Google App Engine. Donc pour chaque projet on va avoir 2 lignes de facturation ? La semaine dernière j’ai eu un débit de 0.15 € sur mon compte et 0.40€ de frais bancaires. Si j’ai 10 lignes à moins de 1€ sur mon compte par semaine, c’est mon comptable qui va être content :( J’ai l’impression que l’on peut simplifier les choses en souscrivant à une offre de support Google. La moins chère est à 150€ par mois, dans mon cas ça attendra.

Une fois le billing activé, impossible de créer un bucket sur Cloud Storage. J’ai le message :

The account for the specified project has been disabled.

Et oui car il y a une seconde console où il faut activer le Cloud Storage pour pouvoir l’utiliser ! Bien sûr aucun lien direct vers cette console que j’ai trouvée grâce à StackOverflow : https://code.google.com/apis/console

Le code

Une fois cette partie gestion terminée, je peux enfin commencer à tester mon service PHP sur GAE. C’est une petite application facebook codée avec le framework codeigniter. Premier problème, il ne trouve pas la fonction php_sapi_name. Par défaut, beaucoup de fonctions PHP sont désactivées sur GAE, mais il est possible de les réactiver en ajoutant un fichier php.ini à la racine de votre projet :

google_app_engine.enable_functions = “phpversion, phpinfo, php_sapi_name”

Ensuite j’ai un problème avec la variable $_SERVER, il ne trouve pas l’élément SCRIPT_NAME. Comme ce n’est pas structurant pour mon application je l’ai juste retiré du code. La connexion à la base se passe sans problème. J’ai juste du mettre l’option db_debug à FALSE pour que ça fonctionne. Attention aussi par défaut il n’y a que l’utilisateur root sur votre base, c’est à vous de créer votre user (comme sur votre mysql en fait).

$db[‘hostname’] = ‘:/cloudsql/<project_name>:<sql_name>’;

$db[‘username’] = ‘login’;

$db[‘password’] = ‘pass’;

$db[‘database’] = ‘basename’;

$db[‘dbdriver’] = ‘mysql’;

$db[‘dbprefix’] = ”;

$db[‘pconnect’] = TRUE;

$db[‘db_debug’] = FALSE;

$db[‘cache_on’] = FALSE;

$db[‘cachedir’] = ”;

$db[‘char_set’] = ‘utf8’;

$db[‘dbcollat’] = ‘utf8_general_ci’;

$db[‘swap_pre’] = ”;

$db[‘autoinit’] = TRUE;

$db[‘stricton’] = FALSE;

Donc avec très peu de modifications mon application PHP tourne sur GAE. Il me reste à regarder le stockage sur Cloud Storage. La documentation est succinte mais nous avons les éléments pour le faire. Mes premiers tests n’étaient pas très concluants, j’avais un retour d’erreur sur l’adresse d’upload :

503 Service Unavailable

Et c’est à ce moment qu’il faut comprendre que “Service Unavailable” veut dire : “vous n’avez pas les bons droits d’accès”. Après avoir ajouté des droits d’accès sur le bucket l’upload de fichier fonctionne. La documentation est vraiment très pauvre quand même. Certaines fonctions php son implementées (comme unlink) et d’autre pas (pas de rename). Il y a un vrai manque de documentation pour utiliser Cloud Storage en PHP, il nous faut vraiment le même niveau de doc que ce qui est proposé en Python. J’ai aussi remonté un bug sur la méthode move_uploaded_file, pour le moment on perd l’info sur le type du fichier à la copie. C’est gênant surtout qu’aucune documentation ne nous dit comment modifier les metadata d’un fichier. Le ticket a été validé par google.

Comme je l’ai dit au début, l’objectif est de réaliser une application FaceBook, il faut donc avoir un service disponible en HTTPS. Là rien de très compliqué techniquement, il faut utiliser la console de gestion de domaine (oui une quatrième console !). Ce tuto explique très bien les différentes étapes d’installation. Par contre j’ai eu la surprise de découvrir qu’il fallait payer 9$ par mois pour pouvoir ajouter un certificat SSL (en plus du prix du certificat bien sûr).

Une fois que l’ensemble fonctionne, on peut se concentrer sur le point important : Les temps de réponse. Est-ce que le gros problème de temps de démarrage d’instance Java que j’ai décrit ici il y a 1 an (toujours d’actualité :() se retrouve aussi en PHP ? La réponse est mitigée. Oui c’est plus rapide, on est souvent autour d’une seconde pour démarrer une nouvelle instance. Par contre il faut 6,5s pour uploader un fichier de 300ko ! Quand je dis uploader, je compte l’ensemble du traitement comme il est noté dans la doc à savoir : upload + move_uploaded_file + unlink du fichier temp. C’est vraiment l’upload qui est long puisque je descends à 5,5s de temps d’exécution si je retire move_uploaded_file et unlink. Cette lenteur est complètement bloquante dans certains cas et difficilement explicable.

Conclusion

La bonne nouvelle est que j’ai pu installer une application PHP existante assez rapidement sur GAE. Je n’ai dû recoder que la partie upload de fichiers. Par contre l’offre Cloud de Google reste encore un peu lourde. On voit bien que  c’est le début et que tout n’est pas encore intégré. Le fait d’avoir 4 consoles différentes montre qu’il y a encore du travail :

On est donc loin de la maturité d’Amazon mais l’offre est intéressante. Elle a au moins eu l’avantage d’ouvrir une guerre des prix entre les 2 géants :)

Points positifs :

Points négatifs :