Système: OpenBSD 4.9
Packages installés: php5-core-5.2.17, php5-extensions-5.2.17, php5-gd-5.2.17, php5-mysql-5.2.17, php5-snmp-5.2.17, mysql-server-5.1.54p3, mysql-client-5.1.54p0

Bonjour,

J'ai un script de tests placé dans /var/www/htdocs avec /var/www le chroot d'Apache.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
include('../adodb5/adodb.inc.php');
$conn = &ADONewConnection('mysql');
$conn->PConnect('localhost','cacti','cactipw','cactidb');
$sql = 'select hostname,description from host;';
$recordSet = &$conn->Execute($sql);
if (!$recordSet)
        print $conn->ErrorMsg();
else
while (!$recordSet->EOF) {
        print $recordSet->fields[0].' '.$recordSet->fields[1].'<BR>';
        $recordSet->MoveNext();
}
$recordSet->Close();
$conn->Close();
?>
J'ai aussi téléchargé adodb5 que j'ai placé dans /var/www

Mon serveur mysql est lancé par la commande suivante
Code : Sélectionner tout - Visualiser dans une fenêtre à part
# /usr/local/bin/mysqld_safe --user=_mysql --pid-file=/var/mysql/mysql.pid &
Et j'ai configuré /etc/my.cnf (avec / non chrooté)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
[mysqld]
socket          = /var/www/var/run/mysql/mysql.sock
Lorsque mon serveur mysqld est démarré, il crée mysql.sock dans /var/www/var/run/mysql
# ls -l /var/www/var/run/mysql/
srwxrwxrwx 6 _mysql daemon 0 Oct 4 23:04 mysql.sock
J'ai fais un lien pour que mysql.sock soit aussi joignable dans /var/run/mysql/
Code : Sélectionner tout - Visualiser dans une fenêtre à part
# ln /var/www/var/run/mysql/mysql.sock /var/run/mysql/mysql.sock

Cas 1: Le script est executé hors de toute considération chroot => FONCTIONNE
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
# /usr/local/bin/php /var/www/htdocs/adotest.php
127.0.0.1 System1<BR>1.1.1.1 System2<BR>

Cas 2: Le script est executé en http par l'intermédiare d'Apache (qui est chrooté) url http://localhost/adotest.php => FONCTIONNE
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
127.0.0.1 System1
1.1.1.1 System2
Case 3: Le script est executé en ligne de commande et simule un utilisateur dans le chroot d'Apache => ECHOUE
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
# /usr/sbin/chroot /var/www /bin/php /htdocs/adotest.php
PHP Fatal error:  Call to undefined function mysql_pconnect() in /adodb5/drivers/adodb-mysql.inc.php on line 383
Fatal error: Call to undefined function mysql_pconnect() in /adodb5/drivers/adodb-mysql.inc.php on line 383
Vous remarquerez que le script adotest.php est parvenu à inclure /adodb5/drivers/adodb-mysql.inc.php

J'ai aussi copié /etc/my.cnf dans /var/www/etc mais changé le chemin pour le client mysql
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
[client]
socket         = /var/run/mysql/mysql.sock
J'ai pensé qu'il y avait un problème de connexion mysql, j'ai donc copié le client mysql dans le chroot (/var/www/bin) ainsi que les librairies dynamiques qui lui sont liées. Et la connexion fonctionne bien !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
# /bin/mysql -u cacti -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6

Je ne comprends absolument pas pourquoi dans Cas 3 la connexion vers mysql ne s'effectue pas.
Comme vous pouvez l'imaginer j'ai énormément cherché

Merci