Il s'agit d'installer le couple Agavi/Propel sur un serveur sans compte shell. En effet, il n'est pas forcement très pratique d'avoir chez soit un PC dédié ou de louer un serveur.
Pour que ça fonctionne il faut :
Les limitations probables :
Point particulier aux serveur Free.fr
include situé à la racine du site est systématiquement dans le chemin de recherche.Je prendrai comme exemple la dernière version du projet forumphp-v1.16.01.tar.gz, qui a servi dans le tutorial Developpement avec DbDesigner/Propel/Agavi.
Les serveurs mutualisés, même si ils possèdent déjà pas mal de choses, n'ont pas toutes les librairies dont nous avons besoin, en particulier, il est assez peut probable qu'ils aient Propel ou Agavi. Nous allons donc commencer par uploader celles qui nous manques.
Il faut avoir sur son ordinateurs les sources décompressées d'Agavi, Propel 1.2 et Creole Creole
Sur les serveurs de free.fr, le répertoire include est systématiquement ajouté au chemin de recherche php. C'est donc dans ce répertoire que nous allons ajouter nos sources, pour les autres serveurs, il est également possible d'adopter le même répertoire et de l'ajouter dans le chemin de recherche.
Ce répertoire contiendra probablement des informations sensibles (mot de passe, code xml, etc ..). Pour éviter qu'il ne soit distribué à tout vent, on va le sécuriser en y ajoutant le fichier .htaccess suivant
deny from all
De cette manière toutes les requêtes externes vers ce répertoire seront rejetées.
Dans le répertoire des sources d'agavi, il y a un répertoire nommé src, commencez par le renommé Agavi. Une fois cela fait, utiliser votre client ftp favori pour l'uploader dans un sous répertoire include de votre serveur.
Une fois décompressé les sources de Propel contiennent un répertoire runtime qui lui même contient un répertoire classes qui contient (enfin) un répertoire propel. C'est ce répertoire qu'il faut uploader dans le répertoire include juste à coté de agavi
Il suffit de procéder de la même manière, après avoir décompressé les source, uploader le répertoire creole dans le répertoire include
Il n'est pas totalement impossible, que vous ayez à ajouter d'autres packages manquants sur votre serveur. Il suffira de faire comme pour le package Agavi et Propel, de les décomprésser en local et de les uploader dans le répertoire include
Sur le serveur Free, par exemple il faut uploader Log
Maintenant, nous avons un projet Agavi tout neuf, généré en locale sur notre PC/Mac, grace au script agavi. Il va falloir éditer quelque fichiers afin de lui faire comprendre où se trouve nos runtimes.
Nous allons uploader le contenu du répertoire pub à la racine de notre site et le répertoire app dans le répertoire pear
En principe, il y a juste a modifier le fichier index.php, en modifiant les 2 premier require. Comme notre chemin include est dans le chemin par défaut, nous pouvons tous spécifier à partir de celui-ci.
<?php
// +---------------------------------------------------------------------------+
// | An absolute filesystem path to the agavi/agavi.php script. |
// +---------------------------------------------------------------------------+
require('agavi/agavi.php');
// +---------------------------------------------------------------------------+
// | An absolute filesystem path to our app/config.php script. |
// +---------------------------------------------------------------------------+
require('app/config.php');
// +---------------------------------------------------------------------------+
// | Initialize the framework. You may pass an environment name to this method.|
// | By default the 'development' environment sets Agavi into a debug mode. |
// | In debug mode among other things the cache is cleaned on every request. |
// +---------------------------------------------------------------------------+
Agavi::bootstrap('development');
// +---------------------------------------------------------------------------+
// | Call the controller's dispatch method on the default context |
// +---------------------------------------------------------------------------+
AgaviContext::getInstance('web')->getController()->dispatch();
?>
Il faut egalement supprimer l'appel a la fonction filter_var, qui ne fait pas partie des fonctions php 5.1, elle est présente dans
Il faut maintenant tout mettre sur le serveur. Voici le tableau représentant ce que nous devons uploader et où les mettre. Je prends comme répertoire source de base, l'endroit ou vous avez decompressé l'archive de ForumPHP, et comme répertoire de destination la racine du serveur.
| Desc | Source | Destination |
|---|---|---|
| Application | agavi/app/ | include/app/ |
| Index | agavi/pub/index.php | index.php |
| Data Public | agavi/pub/modpub/ | modpub/ |
Forcement comme beaucoup de monde .. j'ai un compte chez free et c'est avec ce fournisseur que j'ai fait mes tests. Voici les petites adaptations à faire pour qu'agavi fonctionne :
Par défaut Free utilise php4. Pour forcer l'utilisation de php5 sur tout le site il faut uploader un fichier .htaccess à la racine du site contenant une seule ligne :
php 1
C'est bête … et je sais pas pourquoi ils ont choisit ça .. mais ça marche :)
Il reste un point à régler .. en effet à ce jour (19/07/2008), la version de php 5 utilisée par les serveurs de Free est 5.1.3RC4-dev. Et forcement, la fonction de comparaison de version utilisée par Agavi considère que ça n'est pas une vrai 5.1.3. La solution : éditer le fichier agavi.php et spécifier que la version minimum de php est la 5.1.2.
<?php
// +---------------------------------------------------------------------------+
// | This file is part of the Agavi package. |
// | Copyright (c) 2003-2008 the Agavi Project. |
// | |
// | For the full copyright and license information, please view the LICENSE |
// | file that was distributed with this source code. You can also view the |
// | LICENSE file online at http://www.agavi.org/LICENSE.txt |
// | vi: set noexpandtab: |
// | Local Variables: |
// | indent-tabs-mode: t |
// | End: |
// +---------------------------------------------------------------------------+
/**
* Pre-initialization script.
*
* @package agavi
*
* @author Sean Kerr <skerr@mojavi.org>
* @author Mike Vincent <mike@agavi.org>
* @author David Zülke <dz@bitxtender.com>
* @copyright Authors
* @copyright The Agavi Project
*
* @since 0.9.0
*
* @version $Id: agavi.php 2258 2008-01-03 16:54:04Z david $
*/
// load the AgaviConfig class
require(dirname(__FILE__) . '/config/AgaviConfig.class.php');
// check minimum PHP version
AgaviConfig::set('core.minimum_php_version', '5.1.2');
if(!version_compare(PHP_VERSION, AgaviConfig::get('core.minimum_php_version'), 'ge') ) {
die('You must be using PHP version ' . AgaviConfig::get('core.minimum_php_version') . ' or greater.');
}
// define a few filesystem paths
AgaviConfig::set('core.agavi_dir', dirname(__FILE__), true, true);
// default exception template
AgaviConfig::set('exception.default_template', AgaviConfig::get('core.agavi_dir') . '/exception/templates/shiny.php');
// required files
require(AgaviConfig::get('core.agavi_dir') . '/version.php');
require(AgaviConfig::get('core.agavi_dir') . '/core/Agavi.class.php');
?>
Dernier point, les sessions des serveurs Free sont stockées dans l'espace du site web, il faut donc avoir à la racine de celui-ci un répertoire sessions
N'oubliez pas d'y ajouter le fichier .htaccess
deny from all
Il faut au préalable créer quelques répertoires sur le serveur.
Dans chacun de ces répertoires il faut également créer un fichier .htaccess contenant :
deny from all
Afin de se garantir contre tout vol de données critiques
Comme seul le driver SQLITE est installé sur les serveurs de Free.fr, il faut également spécifier que c'est cette base que nous allons utiliser.
On a donc le fichier build.properties qui devient :
# The name of the project propel.project = forum # The database driver propel.database = sqlite
Et le fichier runtime-conf.xml :
<?xml version="1.0" encoding="ISO-8859-1"?>
<config>
<log>
<ident>propel-forum</ident>
<level>7</level>
<name>log/forum.log</name>
</log>
<propel>
<datasources default="forum">
<datasource id="forum">
<!-- the Propel adapter (usually same as phptype of connection DSN) -->
<adapter>sqlite</adapter>
<connection>
<phptype>sqlite</phptype>
<database>db/forum.db</database>
</connection>
</datasource>
</datasources>
</propel>
</config>
Il suffit ensuite de générer le projet propel avec la commande propel-gen, pour obtenir les fichiers de configuration et le code associé.
Une fois ces fichiers obtenus, il faut creer la base en local avec la commande sqlite. Attention, les serveurs de free.fr, utilisent la version 2 de sqlite pour les connections non PDO.
fabrice@golgoth13-ubu:~/dev/tofree/ForumPHP-V1.16.01/propel$ mkdir log fabrice@golgoth13-ubu:~/dev/tofree/ForumPHP-V1.16.01/propel$ mkdir db fabrice@golgoth13-ubu:~/dev/tofree/ForumPHP-V1.16.01/propel$ sqlite db/forum.db SQLite version 2.8.17 Enter ".help" for instructions sqlite> .read build/sql/schema.sql DROP TABLE [utilisateur]; SQL error: no such table: [utilisateur] DROP TABLE [message]; SQL error: no such table: [message] DROP TABLE [forum]; SQL error: no such table: [forum] DROP TABLE [discussion]; SQL error: no such table: [discussion] sqlite> .quit fabrice@golgoth13-ubu:~/dev/tofree/ForumPHP-V1.16.01/propel$
On peut ignorer les warnings, qui proviennent de la tentative d'effacement des tables qui n'existent pas (forcément on vient juste de les créer)
On doit pouvoir maintenant utiliser notre script php de création des données par défaut :
<?php
// Copyright (C) 2008 Fabrice Didierjean (fabrice@coredmp.net)
// This file is part of ForumPHP.
// Foobar is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// Foobar is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with Foobar. If not, see <http://www.gnu.org/licenses/>.
set_include_path(get_include_path() . PATH_SEPARATOR . './build/classes/');
set_include_path('../../propel-1.2.1/runtime/classes'. PATH_SEPARATOR .get_include_path());
print get_include_path();
require_once('propel/Propel.php');
require_once('forum/Utilisateur.php');
require_once('forum/Forum.php');
require_once('forum/Message.php');
require_once('forum/Discussion.php');
Propel::init("./build/conf/forum-conf.php");
print "Utilisateurs par defaut\n";
$user=new Utilisateur();
$user->setNom("toto");
$user->setMp("titi");
$user->save();
$guest=new Utilisateur();
$guest->setNom("guest");
$guest->setMp("guest");
$guest->save();
print "Forums par defaut\n";
$forums=array(array("Acceuil","Ici on acceuil"),array("Auberge","Ici on mange"),array("Amelioration","Ici on améliore"));
foreach($forums as $forum) {
$for=new Forum();
$for->setTitre($forum[0]);
$for->setResume($forum[1]);
$for->save();
}
/* On va creer un message d'acceuil dans le forum "Acceuil" */
$for=ForumPeer::retrieveByPK(1);
/* Creation d'une discussion */
print "Creation d'une discussion\n";
$discussion=new Discussion();
$discussion->setUtilisateur($user);
$discussion->setForum($for);
$discussion->setSujet("Bienvenu sur ForumPHP");
$discussion->setMessage("Ce forum a ete realiser grace a Agavi/Propel");
$discussion->setDate(Date('c'));
$discussion->save();
/* Creation d'un message */
print "Creation d'un message\n";
$message=new Message();
$message->setUtilisateur($guest);
$message->setDiscussion($discussion);
$message->setMessage("Ouais c'est tip top");
$message->setDate(Date('c'));
$message->save();
print "Fin\n";
?>
Il a juste été un peu adapté pour le forcer à utiliser la version 1.2.1 de propel.
Execution :fabrice@golgoth13-ubu:~/dev/tofree/ForumPHP-V1.16.01/propel$ php createdefault.php Utilisateurs par defaut Forums par defaut Creation d'une discussion Creation d'un message Fin
La version 1.2 de propel, ne sait pas faire l'autoloading dess fichiers includes. Il faut donc prévenir Agavi de où et comment charger ceux-ci. Il faut éditer le fichier autoload.xml, situé dans le repertoire config de notre application agavi :
<?xml version="1.0" encoding="UTF-8"?>
<configurations xmlns="http://agavi.org/agavi/1.0/config" parent="%core.system_config_dir%/autoload.xml">
<configuration>
<autoload name="ProjectBaseAction">%core.lib_dir%/action/ProjectBaseAction.class.php</autoload>
<autoload name="ProjectBaseModel">%core.lib_dir%/model/ProjectBaseModel.class.php</autoload>
<autoload name="ProjectBaseView">%core.lib_dir%/view/ProjectBaseView.class.php</autoload>
<autoload name="UtilisateurPeer">forum/UtilisateurPeer.php</autoload>
<autoload name="Utilisateur">forum/Utilisateur.php</autoload>
<autoload name="DiscussionPeer">forum/DiscussionPeer.php</autoload>
<autoload name="Discussion">forum/Discussion.php</autoload>
<autoload name="MessagePeer">forum/MessagePeer.php</autoload>
<autoload name="Message">forum/Message.php</autoload>
<autoload name="ForumPeer">forum/ForumPeer.php</autoload>
<autoload name="Forum">forum/Forum.php</autoload>
<autoload name="Criteria">propel/util/Criteria.php</autoload>
</configuration>
</configurations>
Penser à l'uploader sur le serveur dans la configuration Agavi
Il suffit maintenant d'uploader sur le serveur la base et les fichiers generer pour que tout fonctionne.
Voila vous avez maintenant une application Agavi/Propel sur un serveur mutualisé Free.
J'ai fait le choix d'utiliser sqlite, mais rien ne vous empêche d'utiliser postgres ou mysql, il suffit de modifier le fichier de configuration de propel. Noter que si nous n'avions pas utiliser Propel, il aurait fallut récrire totalement l'application (du moins celle communiquant avec la base). De la même manière le changement de version de propel (qui pourtant était un downgrade) c'est fait sans soucis (faut dire que l'application est simple).
L'application d'exemple tourne ici : http://coredmp95.free.fr