Accueil > > > CLASSE D'INTERFACE SFTP
CLASSE D'INTERFACE SFTP
Information sur la source
Description
Une class user friendly calibré pour les besoins de mon stage permettant principalement de récupérer et déposer de très gros fichier par SFTP ne permettant pas l'utilisation de ssh2_exec. Les fonctions ci dessous sont beaucoup plus rapide que ssh_scp_rcv/send et surtout, non bloquante en cas d'erreur. La classe est documentée pour doxygen. Beaucoup de ce code à été inspiré par les "User Contributed Notes" de php.net. Débutant, je suis ouvert à toutes vos remarques sur ce code, en particulier la gestion des erreurs ou les commentaires ! Merci d'avance pour vos contributions ! La bibliothèque ssh2 doit être installé sur le serveur pour utiliser cette classe : http://fr2.php.net/manual/fr/ssh2.setup.php.
Source
- <?php
- function debug($msg, $var = 'debug')
- {
- if (isset($_GET[$var]))
- {
- echo trim($msg), "\n";
- ob_flush();
- flush();
- }
- }
- if (!function_exists("ssh2_connect")) die("La bibliotheque ssh2 n'est pas disponible sur le serveur, pour l'installer visitez par exemple <a href=\"http://naeh.net/installer-libssh2-ssh2-pour-php/\">http://naeh.net/installer-libssh2-ssh2-pour-php</a>/\n");
- /** @class sftp
- * @brief interface sftp
- *
- */
- class sftp
- {
- private $id = false, $server = false, $url = false;
-
- /** @brief Constructeur
- *
- * Tente d'etablir une connexion SFTP à un serveur distant.
- * @param $server
- * ip/host du server
- * @param $user
- * Identifiant de la connexion
- * @param $pass
- * Mot de passe
- * @throw
- * Une exception remontera en cas d'erreur
- */
- public function __construct ($server, $user, $pass)
- {
- debug("Tentative de connexion au serveur SSH " . $server);
- $this->id = ssh2_connect($server, 22);
- if(!$this->id || empty($this->id))
- throw new Exception ('Échec de connexion à ' . $server);
- debug("Tentative d'authentification");
- if (!ssh2_auth_password($this->id, $user, $pass))
- throw new Exception ("Échec d'identification à " . $server);
- $this->url = ssh2_sftp($this->id);
- if (!$this->url)
- throw new Exception ("Echec d'ouverture du SFTP sur le serveur " . $server);
- debug("SFTP ouvert");
- $this->server = $server;
- }
-
- /** @brief Destructeur
- *
- * Ferme une connection sftp
- */
- public function __destruct()
- {
- debug("Fermeture de la connexion SSH\n");
- ssh2_exec($this->id, "exit");
- }
-
- /** @brief Retourne la taille d'un fichier sur le serveur distant
- * @param $file
- * chemin absolu du fichier
- * @return
- * taille du fichier en octet
- */
- private function getfilesize($file)
- {
- return filesize("ssh2.sftp://" . $this->url . $file);
- }
-
- /** @brief Recupere un fichier sur le serveur distant
- *
- * Tente de recuperer un fichier sur le serveur distant,
- * user friendly , $name n'a pas besoin d'être le chemin absolu vers le fichier
- * par exemple get("foo/zomg/lol.csv") va recuperer le fichier /../foo/zomg/lol.csv sur le serveur
- * dans le fichier lol.csv du dossier courant local
- * @param $name
- * nom du fichier à récuperer sur le serveur
- * @param $local_name
- * facultatif, nom du fichier en local après transfert
- * @return
- * Renvois le chemin du fichier recupéré en local
- * @throw
- * Une exception remontera en cas d'erreur
- */
- public function get($name, $local_name = false)
- {
- try {$name = $this->fpath($name);}
- catch (Exception $e) {throw $e;}
- if (!$local_name)
- $local_name = '.' . (strpos(name, '/') === false?strrchr($name, '/'):('/' . $name));
- debug("Tentative de transfert du fichier '" .$local_name ."' depuis le serveur '" .$name . "'");
- $handle = @fopen("ssh2.sftp://" . $this->url . $name, 'r');
- if (!$handle)
- throw new Exception ("Impossible d'ouvrir le fichier " . $name . " sur le serveur distant " . $this->server);
- $size = $this->getfilesize($name);
- $contents = '';
- $transfered = 0;$i = 0;
- while ($transfered < $size && ($buffer = fread($handle, $size - $transfered)))
- {
- debug($transfered, " transfere sur ", $size);
- $transfered += strlen($buffer);
- $contents .= $buffer;
- if ($i++ > 1000)
- {
- fclose($handle);
- throw new Exception ('Erreur pendant le transfert du fichier ' . $name . 'depuis le serveur' . $this->server . ' : timeout');
- }
- }
- file_put_contents ($local_name, $contents);
- fclose($handle);
- debug("\nTransfert du fichier '" . $name . "' depuis le serveur " . $this->server . " reussi");
- return ($local_name);
- }
-
- /** @brief Dépose un fichier sur le serveur distant
- *
- * Tente de déposer un fichier sur le serveur distant,
- * user friendly , $name n'a pas besoin d'être le chemin absolu vers le fichier
- * par exemple put("foo/zomg/lol.csv") va deposer le fichier lol.csv du dossier courant dans le dossier /../foo/zomg/lol.csv du serveur
- * @param $name
- * nom du fichier à déposer sur le serveur
- * @param $local_name
- * facultatif, nom du fichier
- * @throw
- * Une exception remontera en cas d'erreur
- */
- public function put($name, $remote_name = false)
- {
- try
- {
- if (!$remote_name)
- {
- $remote_name = $this->fpath($name);
- $name = '.' . (strpos($name, '/') === false ?('/' . $name):strrchr($name, '/'));
- }
- else
- $remote_name = $this->path(substr($remote_name, 0 , strrpos($remote_name, '/'))) . strrchr($remote_name, '/');
- }
- catch (Exception $e) {throw $e;}
- debug("Tentative de transfert du fichier '" . $name . "' sur le serveur " . $this->server);
- $handle = fopen("ssh2.sftp://" . $this->url . $remote_name, 'w');
- if (!$handle)
- throw new Exception('Impossible d\'ouvrir le fichier ' . $remote_name . ' en ecriture sur le serveur ' . $this->server);
- $data = file_get_contents(strpos($name, "/")?'.' . strrchr($name, "/"):$name);
- if ($data === false)
- throw new Exception("Impossible d'ouvrir le fichier local " . $name);
- $transfered = fwrite($handle, $data);
- if ($transfered === false)
- throw new Exception("Impossible de transferer le fichier " . $name);
- $size = strlen($data);
- if ($transfered != $size)
- {
- while ($transfered < $size && ($transfered += fwrite($handle, mb_substr($data, $transfered, $size - $transfered))))
- debug($transfered . " transfere sur " . $size);
- }
- debug("Fichier " . $remote_name . " correctement depose");
- fclose($handle);
- }
-
-
- /** @brief Deplace un fichier sur le serveur distant
- *
- * Tente de deplacer un fichier sur le serveur distant
- * user friendly , les chemins n'ont pas besoin d'être absolu
- * par exemple mv("foo/zomg/lol.csv", "omfg/lolz.txt") va deplacer /../foo/zomg/lol.csv vers /../omfg/lolz.txt
- * @param $old
- * nom du fichier à déplacer
- * @param $new
- * nouveau nom & chemin
- * @throw
- * Une exception remontera en cas d'erreur
- */
- public function mv($old, $new)
- {
- try
- {
- $old = $this->fpath($old);
- $new = $this->fpath($new);
- }
- catch (Exception $e)
- {
- throw $e;
- }
- debug('Tentative de deplacement du fichier \'' . $old . '\' vers \'' . $new . "'");
- $old_handle = fopen("ssh2.sftp://" . $this->url .$old, 'r');
- if (!$old_handle)
- throw new Exception ("Impossible d'ouvrir en lecture le fichier '" . $old . "' sur le serveur distant");
- $new_handle = fopen("ssh2.sftp://" . $this->url .$new, 'w');
- if (!$new_handle)
- throw new Exception ("Impossible d'ouvrir en ecriture le fichier '" . $new . "' sur le serveur distant");
- $size = $this->getfilesize($old);
- $read = 0;
- $wrote = 0;
- while ($read < $size && ($buffer = fread($old_handle, $size - $read)))
- {
- $tmp_size = strlen($buffer);
- $read += $tmp_size;
- $tmp_wrote = 0;
- while ($tmp_wrote <$tmp_size)
- {
- $tmp = fwrite($new_handle, substr($buffer, $tmp_wrote));
- if (!$tmp)
- break;
- $tmp_wrote += $tmp;
- }
- $wrote += $tmp_size;
- }
- debug("taille du fichier = " . $size . " , " . $read . " octets lu, " . $wrote . " octets ecrit");
- fclose($new_handle);
- fclose($old_handle);
- if ($size == $read && $read == $wrote)
- unlink("ssh2.sftp://" . $this->url . $old);
- else
- throw new Exception ("Erreur pendant le deplacement du fichier " . $old . " en " . $old . "\ntaille du fichier = " . $size . " , " . $read . " octets lu, " . $wrote . " octets ecrit\n");
- }
-
- /** @brief Récupere le chemin absolu d'un dossier
- *
- * @param $dir
- * nom du dossier
- * @return
- * chemin absolu du dossier $dir sur le serveur distant
- */
- private function path($dir)
- {
- $rlpath = @ssh2_sftp_realpath($this->url, $dir);
- if (!$rlpath)
- throw new Exception ("Dossier introuvable sur le serveur distant : " . $dir);
- return $rlpath;
- }
-
- /** @brief Récupere le chemin absolu d'un fichier sur le serveur
- *
- * @param $name
- * nom du fichier
- * @return
- * chemin absolu du fichier sur le serveur
- */
- private function fpath($name)
- {
- try
- {
- if (strpos($name, '/') === false)
- $name = $this->path('.') . '/' . $name;
- else
- $name = $this->path(substr($name, 0 , strrpos($name, '/'))) . strrchr($name, '/');
- }
- catch (Exception $e)
- {
- throw $e;
- }
- return $name;
- }
-
- /** @brief Liste le contenu d'un dossier
- *
- * Liste le contenu d'un dossier passé en parametre ou le dossier courant si aucun dossié donné.
- * Ne renvois pas les dossiers
- * Offre la possibilitée de filtrer les resultats possedant l'extension "$ext" et la chaîne de caractere $like dans leur noms
- * @param $directory
- * nom du dossier
- * @param $like
- * pattern à respeceter
- * @param $ext
- * extension des fichiers à respecter
- * @return
- * renvois la liste des fichiers sous la forme d'un tableau non associatif
- * @throw
- * une exception remontera en cas d'erreur
- */
- public function flist($directory = './' , $like = false, $ext = false)
- {
- $dir = $this->path($directory);
- $handle = opendir("ssh2.sftp://" . $this->url . $dir);
- if (!$handle)
- throw new Exception ("Impossible d'ouvrir le dossier " . $directory . " sur le serveur " . $this->server);
- $files = array();
- while (false !== ($file = readdir($handle)))
- {
- if (substr($file, 0, 1) != "." && !is_dir($file))
- {
- if ($like && $ext)
- {
- if (stripos($file, $like) !== false && strrchr($file , ".") == (strpos($ext, ".") !== false?$ext:(".".$ext)))
- $files[] = $dir . '/' . $file;
- }
- else
- $files[] = $dir . '/' . $file;
- }
- }
- sort($files);
- return $files;
- }
-
- /** @brief Recupere une liste de fichier
- *
- * Recupere une liste de fichier et les deplace (sur le serveur distant) ds le dossier $dir_if_success si spécifié
- * @param $files_ar
- * tableau de fichiers
- * @param $like
- * pattern à respeceter
- * @param $ext
- * extension des fichiers à respecter
- * @return
- * renvois la liste des fichiers sous la forme d'un tableau non associatif
- * @throw
- * une exception remontera en cas d'erreur
- */
- public function get_files($files_ar, $dir_if_success = false)
- {
- $error = count($files_ar);
- $files = array();
- foreach ($files_ar as $k =>$v)
- {
- debug("Transfert de $v.");
- try
- {
- $files[$k] = $this->get($v);
- if ($dir_if_success)
- $this->mv($v, $dir_if_success . strrchr($files[$k], "/"));
- debug("Transfert reussi");
- }
- catch (Exception $e)
- {
- debug("Echec dans le transfer du fichier $v :\n" . $e->getMessage());;
- $error--;
- }
- }
- if (!$error)
- throw new Exception ("Impossible de récuperer les fichiers spécifié, vérifiez les droit, le type de transfert ou type de connexion");
- if (empty($files))
- return false;
- sort($files);
- return $files;
- }
- }
- /* Exemple d'utilisation : */
- try
- {
- $_GET['debug'] = true;
- $sftp = new sftp(SERVER, USER, PASS);
- $files = $sftp->flist("data/");
- print_r($files);
- $sftp->get_files($files, "data/treated/");
- }
- catch (Exception $e)
- {
- die ($e->getMessage()."\n");
- }
<?php
function debug($msg, $var = 'debug')
{
if (isset($_GET[$var]))
{
echo trim($msg), "\n";
ob_flush();
flush();
}
}
if (!function_exists("ssh2_connect")) die("La bibliotheque ssh2 n'est pas disponible sur le serveur, pour l'installer visitez par exemple <a href=\"http://naeh.net/installer-libssh2-ssh2-pour-php/\">http://naeh.net/installer-libssh2-ssh2-pour-php</a>/\n");
/** @class sftp
* @brief interface sftp
*
*/
class sftp
{
private $id = false, $server = false, $url = false;
/** @brief Constructeur
*
* Tente d'etablir une connexion SFTP à un serveur distant.
* @param $server
* ip/host du server
* @param $user
* Identifiant de la connexion
* @param $pass
* Mot de passe
* @throw
* Une exception remontera en cas d'erreur
*/
public function __construct ($server, $user, $pass)
{
debug("Tentative de connexion au serveur SSH " . $server);
$this->id = ssh2_connect($server, 22);
if(!$this->id || empty($this->id))
throw new Exception ('Échec de connexion à ' . $server);
debug("Tentative d'authentification");
if (!ssh2_auth_password($this->id, $user, $pass))
throw new Exception ("Échec d'identification à " . $server);
$this->url = ssh2_sftp($this->id);
if (!$this->url)
throw new Exception ("Echec d'ouverture du SFTP sur le serveur " . $server);
debug("SFTP ouvert");
$this->server = $server;
}
/** @brief Destructeur
*
* Ferme une connection sftp
*/
public function __destruct()
{
debug("Fermeture de la connexion SSH\n");
ssh2_exec($this->id, "exit");
}
/** @brief Retourne la taille d'un fichier sur le serveur distant
* @param $file
* chemin absolu du fichier
* @return
* taille du fichier en octet
*/
private function getfilesize($file)
{
return filesize("ssh2.sftp://" . $this->url . $file);
}
/** @brief Recupere un fichier sur le serveur distant
*
* Tente de recuperer un fichier sur le serveur distant,
* user friendly , $name n'a pas besoin d'être le chemin absolu vers le fichier
* par exemple get("foo/zomg/lol.csv") va recuperer le fichier /../foo/zomg/lol.csv sur le serveur
* dans le fichier lol.csv du dossier courant local
* @param $name
* nom du fichier à récuperer sur le serveur
* @param $local_name
* facultatif, nom du fichier en local après transfert
* @return
* Renvois le chemin du fichier recupéré en local
* @throw
* Une exception remontera en cas d'erreur
*/
public function get($name, $local_name = false)
{
try {$name = $this->fpath($name);}
catch (Exception $e) {throw $e;}
if (!$local_name)
$local_name = '.' . (strpos(name, '/') === false?strrchr($name, '/'):('/' . $name));
debug("Tentative de transfert du fichier '" .$local_name ."' depuis le serveur '" .$name . "'");
$handle = @fopen("ssh2.sftp://" . $this->url . $name, 'r');
if (!$handle)
throw new Exception ("Impossible d'ouvrir le fichier " . $name . " sur le serveur distant " . $this->server);
$size = $this->getfilesize($name);
$contents = '';
$transfered = 0;$i = 0;
while ($transfered < $size && ($buffer = fread($handle, $size - $transfered)))
{
debug($transfered, " transfere sur ", $size);
$transfered += strlen($buffer);
$contents .= $buffer;
if ($i++ > 1000)
{
fclose($handle);
throw new Exception ('Erreur pendant le transfert du fichier ' . $name . 'depuis le serveur' . $this->server . ' : timeout');
}
}
file_put_contents ($local_name, $contents);
fclose($handle);
debug("\nTransfert du fichier '" . $name . "' depuis le serveur " . $this->server . " reussi");
return ($local_name);
}
/** @brief Dépose un fichier sur le serveur distant
*
* Tente de déposer un fichier sur le serveur distant,
* user friendly , $name n'a pas besoin d'être le chemin absolu vers le fichier
* par exemple put("foo/zomg/lol.csv") va deposer le fichier lol.csv du dossier courant dans le dossier /../foo/zomg/lol.csv du serveur
* @param $name
* nom du fichier à déposer sur le serveur
* @param $local_name
* facultatif, nom du fichier
* @throw
* Une exception remontera en cas d'erreur
*/
public function put($name, $remote_name = false)
{
try
{
if (!$remote_name)
{
$remote_name = $this->fpath($name);
$name = '.' . (strpos($name, '/') === false ?('/' . $name):strrchr($name, '/'));
}
else
$remote_name = $this->path(substr($remote_name, 0 , strrpos($remote_name, '/'))) . strrchr($remote_name, '/');
}
catch (Exception $e) {throw $e;}
debug("Tentative de transfert du fichier '" . $name . "' sur le serveur " . $this->server);
$handle = fopen("ssh2.sftp://" . $this->url . $remote_name, 'w');
if (!$handle)
throw new Exception('Impossible d\'ouvrir le fichier ' . $remote_name . ' en ecriture sur le serveur ' . $this->server);
$data = file_get_contents(strpos($name, "/")?'.' . strrchr($name, "/"):$name);
if ($data === false)
throw new Exception("Impossible d'ouvrir le fichier local " . $name);
$transfered = fwrite($handle, $data);
if ($transfered === false)
throw new Exception("Impossible de transferer le fichier " . $name);
$size = strlen($data);
if ($transfered != $size)
{
while ($transfered < $size && ($transfered += fwrite($handle, mb_substr($data, $transfered, $size - $transfered))))
debug($transfered . " transfere sur " . $size);
}
debug("Fichier " . $remote_name . " correctement depose");
fclose($handle);
}
/** @brief Deplace un fichier sur le serveur distant
*
* Tente de deplacer un fichier sur le serveur distant
* user friendly , les chemins n'ont pas besoin d'être absolu
* par exemple mv("foo/zomg/lol.csv", "omfg/lolz.txt") va deplacer /../foo/zomg/lol.csv vers /../omfg/lolz.txt
* @param $old
* nom du fichier à déplacer
* @param $new
* nouveau nom & chemin
* @throw
* Une exception remontera en cas d'erreur
*/
public function mv($old, $new)
{
try
{
$old = $this->fpath($old);
$new = $this->fpath($new);
}
catch (Exception $e)
{
throw $e;
}
debug('Tentative de deplacement du fichier \'' . $old . '\' vers \'' . $new . "'");
$old_handle = fopen("ssh2.sftp://" . $this->url .$old, 'r');
if (!$old_handle)
throw new Exception ("Impossible d'ouvrir en lecture le fichier '" . $old . "' sur le serveur distant");
$new_handle = fopen("ssh2.sftp://" . $this->url .$new, 'w');
if (!$new_handle)
throw new Exception ("Impossible d'ouvrir en ecriture le fichier '" . $new . "' sur le serveur distant");
$size = $this->getfilesize($old);
$read = 0;
$wrote = 0;
while ($read < $size && ($buffer = fread($old_handle, $size - $read)))
{
$tmp_size = strlen($buffer);
$read += $tmp_size;
$tmp_wrote = 0;
while ($tmp_wrote <$tmp_size)
{
$tmp = fwrite($new_handle, substr($buffer, $tmp_wrote));
if (!$tmp)
break;
$tmp_wrote += $tmp;
}
$wrote += $tmp_size;
}
debug("taille du fichier = " . $size . " , " . $read . " octets lu, " . $wrote . " octets ecrit");
fclose($new_handle);
fclose($old_handle);
if ($size == $read && $read == $wrote)
unlink("ssh2.sftp://" . $this->url . $old);
else
throw new Exception ("Erreur pendant le deplacement du fichier " . $old . " en " . $old . "\ntaille du fichier = " . $size . " , " . $read . " octets lu, " . $wrote . " octets ecrit\n");
}
/** @brief Récupere le chemin absolu d'un dossier
*
* @param $dir
* nom du dossier
* @return
* chemin absolu du dossier $dir sur le serveur distant
*/
private function path($dir)
{
$rlpath = @ssh2_sftp_realpath($this->url, $dir);
if (!$rlpath)
throw new Exception ("Dossier introuvable sur le serveur distant : " . $dir);
return $rlpath;
}
/** @brief Récupere le chemin absolu d'un fichier sur le serveur
*
* @param $name
* nom du fichier
* @return
* chemin absolu du fichier sur le serveur
*/
private function fpath($name)
{
try
{
if (strpos($name, '/') === false)
$name = $this->path('.') . '/' . $name;
else
$name = $this->path(substr($name, 0 , strrpos($name, '/'))) . strrchr($name, '/');
}
catch (Exception $e)
{
throw $e;
}
return $name;
}
/** @brief Liste le contenu d'un dossier
*
* Liste le contenu d'un dossier passé en parametre ou le dossier courant si aucun dossié donné.
* Ne renvois pas les dossiers
* Offre la possibilitée de filtrer les resultats possedant l'extension "$ext" et la chaîne de caractere $like dans leur noms
* @param $directory
* nom du dossier
* @param $like
* pattern à respeceter
* @param $ext
* extension des fichiers à respecter
* @return
* renvois la liste des fichiers sous la forme d'un tableau non associatif
* @throw
* une exception remontera en cas d'erreur
*/
public function flist($directory = './' , $like = false, $ext = false)
{
$dir = $this->path($directory);
$handle = opendir("ssh2.sftp://" . $this->url . $dir);
if (!$handle)
throw new Exception ("Impossible d'ouvrir le dossier " . $directory . " sur le serveur " . $this->server);
$files = array();
while (false !== ($file = readdir($handle)))
{
if (substr($file, 0, 1) != "." && !is_dir($file))
{
if ($like && $ext)
{
if (stripos($file, $like) !== false && strrchr($file , ".") == (strpos($ext, ".") !== false?$ext:(".".$ext)))
$files[] = $dir . '/' . $file;
}
else
$files[] = $dir . '/' . $file;
}
}
sort($files);
return $files;
}
/** @brief Recupere une liste de fichier
*
* Recupere une liste de fichier et les deplace (sur le serveur distant) ds le dossier $dir_if_success si spécifié
* @param $files_ar
* tableau de fichiers
* @param $like
* pattern à respeceter
* @param $ext
* extension des fichiers à respecter
* @return
* renvois la liste des fichiers sous la forme d'un tableau non associatif
* @throw
* une exception remontera en cas d'erreur
*/
public function get_files($files_ar, $dir_if_success = false)
{
$error = count($files_ar);
$files = array();
foreach ($files_ar as $k =>$v)
{
debug("Transfert de $v.");
try
{
$files[$k] = $this->get($v);
if ($dir_if_success)
$this->mv($v, $dir_if_success . strrchr($files[$k], "/"));
debug("Transfert reussi");
}
catch (Exception $e)
{
debug("Echec dans le transfer du fichier $v :\n" . $e->getMessage());;
$error--;
}
}
if (!$error)
throw new Exception ("Impossible de récuperer les fichiers spécifié, vérifiez les droit, le type de transfert ou type de connexion");
if (empty($files))
return false;
sort($files);
return $files;
}
}
/* Exemple d'utilisation : */
try
{
$_GET['debug'] = true;
$sftp = new sftp(SERVER, USER, PASS);
$files = $sftp->flist("data/");
print_r($files);
$sftp->get_files($files, "data/treated/");
}
catch (Exception $e)
{
die ($e->getMessage()."\n");
}
Conclusion
A terme j'aimerais me passer des file_get_contents et file_put_contents forçant à augmenter drastiquement la mémoire alloué dans php.ini.
Historique
- 14 juin 2010 19:54:30 :
- Ajout d'un zip.
- 14 juin 2010 20:24:08 :
- Rajout d'une conclusion :)
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Comment tester les fichiers PHP [ par Clem ]
Comment tester les fichiers PHP sans les publier sur son site ? Dans le genre de PWS avec l'asp
PWS version PHP ! [ par Clem ]
J'ai trouvé un PWS en mieux, et pour le PHP !Sur http://www.easyphp.org/, il suffit de télécharger la dernière version (8Mo) et de l'installer.L'avant
comment faire avec pws [ par arnaud ]
voila je veux me mettre au PHP je sais que je peux faire fonctionner PWS comme server pour PHP mais je trouve rien Alors pour ceux qui sont te,nte ai
Developpeur PHP rechercher. [ par Trafalio BlackHammer ]
Bonjour, je recherche un bon developpeur PHP, MySQL. Veuillez me contacter a trafalio@godsoft.orgMerci
statistiques ,graphique, php et mysql [ par mouss ]
connaissez vous des exemples mettant en oeuvre une base de donnée mysql ,php permettant de créer des courbes, nuages de points sur une feuille html (p
Extensions de PHP [ par zerg ]
je sais que l'on peut ajouter des extensions en php, ses propres extensions ou celle telechargeables mais difficiles a trouver.... ==> ces extensio
Mail et recup [ par H@lloWin___HiA ]
SalutJe sais envoyé un mail avec un script PHP sur un serveurMais peut on envoyer un mail depuis un script qui serait ds localhost (easy php)Le proble
Comment fait t-on pour executer des pages php [ par Arnaud ]
merci
Urgent svp !!! [ par Clem ]
Comment récupérer le nom d'un fichier a partir de son adresse internet ?(Par exemple obtenir le nom dex.php a partir de http://localhost/dex.php)
Démarrage sous PHP. [ par SurfSilver ]
Salut à tous.JE me suis m'y cette semaine à Php dans l'espoir de concevoir une appli en base de donnée. Cet avec interet que j'essaierai de donner mes
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
GOOGLE MAPGOOGLE MAP par fatmanajjar
Cliquez pour lire la suite par fatmanajjar
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|