OVH Cloud OVH Cloud

PHP & API

6 réponses
Avatar
Philippe
Bonjour,

Je dois interfacer un site en PHP avec une application tiers.
Cette application est livrée avec un API sous forme de DLL, je souhaiterai
donc depuis PHP faire des appels à cette DLL.

J'ai donc essayé d'utiliser la fonction w32api_register_function mais sans
succès, j'obtiens soit un plantage apache soit Call to undefined function:
w32api_register_function() alors que l'extension est bien chargée dans PHP.

Si quelqun a un tuyau il est le bienvenue

Merci d'avance

Philippe

6 réponses

Avatar
Noe
"Philippe" a écrit dans le message de
news:c1dag7$1spg$
Bonjour,

Je dois interfacer un site en PHP avec une application tiers.
Cette application est livrée avec un API sous forme de DLL, je souhaiterai
donc depuis PHP faire des appels à cette DLL.

J'ai donc essayé d'utiliser la fonction w32api_register_function mais sans
succès, j'obtiens soit un plantage apache soit Call to undefined function:
w32api_register_function() alors que l'extension est bien chargée dans
PHP.


Si quelqun a un tuyau il est le bienvenue

Merci d'avance

Philippe


Questions à 3 balles :
- version de PHP
- OS
- serveur Web

Pense à utiliser w32api_set_call_method pour préciser si ta DLL est en
stdcall ou cdecl .

En tout cas, perso,j'ai joué avec ça il y a quelque temps, ça donnait pas
vraiment satisfaction... Au final, j'ai compilé un petit binaire en C qui
s'interface avec la DLL et qui est appelée par PHP via exec() .

N.O.E.

Avatar
Jean-Marc Molina
Bonjour,

je souhaiterai donc depuis PHP faire des appels à cette DLL.


Il te faut passer par les services web, des technologies comme SOAP, UDDI ou
WSDL devraient t'aider. L'idée c'est de partager des objets entre une
application client-serveur. Dans ton cas le client c'est le logiciel, il
échange des données avec le serveur (PHP).

Quelques liens :
http://directory.google.com/Top/Computers/Programming/Internet/Web_Services/?tc=1
zdnet.fr - Services web: nouvelle spécification suivie par Microsoft mais
sans IBM :
http://www.zdnet.fr/actualites/technologie/0,39020809,39136667,00.htm
zdnet.fr - Services web: pourquoi Microsoft fait fausse route avec .NET (par
Bob Cancilla) :
http://www.zdnet.fr/techupdate/applications/0,39020852,39125045,00.htm?nl=techupdate
sitepoint.com - Web Services Demystified (by Kevin Yank) :
http://www.sitepoint.com/article/692
journaldunet.com - Dossier Web Services :
http://solutions.journaldunet.com/dossiers/webservices/sommaire.shtml
Apple - WebObjects - Services Web :
http://www.apple.com/fr/webobjects/web_services.html
Builder.fr - Architecture > Services Web :
http://www.zdnet.fr/builder/architecture/services_web/
MSDN - Web Services Developer Center Home :
http://msdn.microsoft.com/webservices/
MSDN France - Technologies Web services XML - Microsoft France :
http://www.microsoft.com/france/msdn/technologies/technos/webservices/default.asp
ServicesWeb.org : http://www.servicesweb.org/

Je dois interfacer un site en PHP avec une application tiers.


Quelle est la techno de l'application ?

J'ai donc essayé d'utiliser la fonction w32api_register_function mais sans
succès


C'est du béta-gamma cette extension :). Je l'ai utilisé pour accéder à des
fonctions de la Win32API, j'ai réussi mais c'est un peu aléatoire. Je
cherchais à récupérer le nom de l'utilisateur sous Windows NT/XP. La
meilleure solution ce sont les services ou bien d'opter pour des
technologies comme COM (ça s'en rapprochent avec DCOM et compagnie).

Après il existe quelques ouvrages sur le sujet :
Les Web services - Techniques, démarches et outils :
XML-WSDL-SOAP-UDDI-Rosetta-UML (de Hubert Kadima)
Services Web avec SOAP, WSDL, UDDI, ebXML... (de Jean-Marie Chauvet)
XML : Des bases de données aux services Web (de Georges Gardarin)
XML et les services Web (de Cyril Vincent)

Je te conseille celui de Jean-Marie Chauvet. Celui de Gardarien doit aussi
valoir le coup d'oeil mais je n'ai pas encore pris le temps de le lire. Tout
dépend de tes relations avec les BDDs et XML.

JM

Avatar
Mokhtar mehali
Salut,

Il existe un packtage inline_c de peer. C'est un pakage simple compose d'une
classe
PHP qui pemet d'ecrire du C à l'interieur du PHP.
Le but de cette classe est d'extraire le code C dans le fichier PHP est de
le compiler a la vollée.
Il y'a meme un exemple de demo.

Exemple :
----------------------------------------------------------------------------
-----
<?

require_once("Inline_C.php");
$function1 = <<<EOF
PHP_FUNCTION(times)
{
long i,j;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &i,&j) = FAILURE) {
WRONG_PARAM_COUNT;
}
RETURN_LONG(i*j);
}

EOF;

$function2 = <<<EOF
PHP_FUNCTION(cube)
{
long i;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &i) = FAILURE) {
WRONG_PARAM_COUNT;
}
RETURN_LONG(i*i*i);
}

EOF;

$inline = new Inline_C;
$inline->add_code($function1);
$inline->add_code($function2);
// To link against libfoo
//$inline->library("sp","/usr/local/lib");
$inline->compile();
for($i=0;$i<10;$i++) {
for($j=0; $j<10; $j++) {
print "$i * $j = ".times($i,$j)."n";
}
}
for($i=0;$i<10; $i++) {
print "$i^3 = ".cube($i)."n";
}

?>


La classe incline_c :
----------------------------------------------------------


<?php
/* vim: set expandtab tabstop=4 shiftwidth=4: */
//
// +----------------------------------------------------------------------+
// | Inline_C |
// +----------------------------------------------------------------------+
// | Copyright (c) 1997-2002 The PHP Group |
// +----------------------------------------------------------------------+
// | This source file is subject to version 2.02 of the PHP license, |
// | that is bundled with this package in the file LICENSE, and is |
// | available at through the world-wide-web at |
// | http://www.php.net/license/2_02.txt. |
// | If you did not receive a copy of the PHP license and are unable to |
// | obtain it through the world-wide-web, please send a note to |
// | so we can mail you a copy immediately. |
// +----------------------------------------------------------------------+
// | Authors: George Schlossnagle |
// +----------------------------------------------------------------------+
//
// $Id: Inline_C.php.in,v 1.1 2002/09/27 15:50:12 gschlossnagle Exp $
//

/**
* Inline::Inline_C
*
* Purpose:
*
* Allows for definitions of functions in C inline in php code.
*
* Example:
* a)
* require_once 'Inline/Inline_C.php';
* $inline = new Inline_C;
*
* $function1 = <<<EOF
* PHP_FUNCTION(times)
* {
* long i,j;
* if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &i,&j)
== FAILURE) {
* WRONG_PARAM_COUNT;
* }
* RETURN_LONG(i*j);
* }
* $inline = new Inline_C;
* $inline->add_code($function1);
* $inline->compile();
* for($i=0;$i<10;$i++) {
* for($j=0; $j<10; $j++) {
* print "$i * $j = ".times($i,$j)."n";
* }
* }
*
* b)
* require_once 'Inline/Inline_C.php';
* $inline = new Inline_C;
*
* $function2 = <<<EOF
* include "foo.h"
* PHP_FUNCTION(foo)
* {
* char *str, *out_str;
* int str_len, out_str_len;
* if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s",
&str,&str_len) == FAILURE) {
* WRONG_PARAM_COUNT;
* }
* foo(&out_str,&str);
* out_str_len = strlen(out_str);
* RETURN_STRINGL(out_str, out_str_len, 0);
* }
* EOF
* $inline = new Inline_C;
* $inline->add_code($function1);
* $inline->library("foo", "/usr/local/foo/lib");
* $inline->include("/usr/local/foo/include");
* $inline->compile();
* for($i=0;$i<10;$i++) {
* for($j=0; $j<10; $j++) {
* print "$i * $j = ".times($i,$j)."n";
* }
* }
*
* @author George Schlossangle
* @version $Revision: 1.1 $
* @access public
*/


class Inline_C {
/**
* Creates a C PHP extension on the fly, compiles, caches and dl()'s it.
*
* @access public
*/

var $glue_text;
var $build_dir = "@inline_c_builddir@";
var $makefile_template = "@inline_c_builddir@/Makefile.tmpl";
var $func_text;
var $shared_libadd = array();
var $preprocessor_text;

/**
* Constructor.
*
* @access public
*/

function Inline_C()
{
// We set glue_text (the extension header), since we seem to
// have problems using a heredoc in the default attribute setting.
$this->glue_text = <<<EOF
#include "php.h"
#include "php_ini.h"
#include "ext/standard/info.h"

%s

%s

function_entry __MD5NAME___functions[] = {
/* __function_entries_here__ */
%s
{NULL, NULL, NULL} /* Must be the last line in extname_functions[]
*/
};
zend_module_entry __MD5NAME___module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
STANDARD_MODULE_HEADER,
#endif
"__MD5NAME__",
__MD5NAME___functions,
NULL,
NULL,
NULL,
NULL,
NULL,
#if ZEND_MODULE_API_NO >= 20010901
"0.1", /* Replace with version number for your extension */
#endif
STANDARD_MODULE_PROPERTIES
};

ZEND_GET_MODULE(__MD5NAME__)

EOF;
}

/**
* Adds code to the preproceesor staanza in our extension.
* Used for adding #includes or such
*
* @param string $code code to add
* @access public
*/

function add_preproccesor($code)
{
$this->preprocessor_text .= $code;
}

/**
* Adds code to our extension.
*
* @param string $code code to add
* @access public
*/

function add_code($code)
{
$this->func_text .= $code;
}

/**
* Adds a library to the link line.
*
* @param string $library library to link against
* @param string $path optional library path, defaults to NULL
* @access public
*/

function library($library, $path = null)
{
$this->shared_libadd[] = "-l$library";
if ($path) {
$this->shared_libadd[] = "-L$path";
}
}

/**
* Adds a library path to the link line
*
* @param string $path library path
* @access public
*/

function library_path($path)
{
$this->shared_libadd[] = "-L$path";
}

/**
* Adds an include path to the link line
*
* @param string $path include path
* @access public
*/

function include_path($path)
{
$this->shared_libadd[] = "-I$path";
}

/**
* Compile and load our code!
*
* @access public
*/

function compile()
{
$fd = fopen($this->makefile_template, "r");
$makefile_text = fread ($fd, filesize ($this->makefile_template));
fclose($fd);

preg_match_all("/PHP_FUNCTION((w+))/", $this->func_text,
$matches);
$functions = array_unique($matches[1]);
foreach ($functions as $funcname) {
$function_entry_stanza .= "PHP_FE($funcname, NULL)n";
$function_proto_stanza .= "PHP_FUNCTION($funcname);n";
}
$body = sprintf($this->glue_text,
$this->preprocessor_text,$function_proto_stanza,
$function_entry_stanza).$this->func_text;
$md5 = md5($body);
if (!($extension_dir = ini_get("extension_dir")) || ($extension_dir
== './')) {
$extension_dir = $this->build_dir;
}
$extension_dir .= "/inline_libs";
if (!is_file("$extension_dir/inline_$md5.so")) {
$body = str_replace("__MD5NAME__", "inline_$md5", $body);
$makefile_text = str_replace("__MD5NAME__", "inline_$md5",
$makefile_text);
$makefile_text = str_replace("__SHARED_LIBADD__", join("
",$this->shared_libadd), $makefile_text);
$mkfd = fopen("$this->build_dir/Makefile", "w");
fwrite($mkfd, $makefile_text);
fclose($mkfd);
$gluefd = fopen("$this->build_dir/inline_$md5.c", "w");
fwrite($gluefd, $body);
fclose($gluefd);
chdir($this->build_dir);
exec('make');
copy("$this->build_dir/modules/inline_$md5.so",
"$extension_dir/inline_$md5.so");
exec('make clean');
}
if (!($extension_dir = ini_get("extension_dir")) || ($extension_dir
== './')) {
$cwd = getcwd();
chdir($this->build_dir);
dl("inline_libs/inline_$md5.so");
chdir($cwd);
} else {
dl("inline_libs/inline_$md5.so");
}
}
}
?>

M. MEHALI
EspritSoft Magazine
www.espritsoft.com

"Philippe" a écrit dans le message de
news:c1dag7$1spg$
Bonjour,

Je dois interfacer un site en PHP avec une application tiers.
Cette application est livrée avec un API sous forme de DLL, je souhaiterai
donc depuis PHP faire des appels à cette DLL.

J'ai donc essayé d'utiliser la fonction w32api_register_function mais sans
succès, j'obtiens soit un plantage apache soit Call to undefined function:
w32api_register_function() alors que l'extension est bien chargée dans
PHP.


Si quelqun a un tuyau il est le bienvenue

Merci d'avance

Philippe


Avatar
John Gallet
Bonsoir,

Je dois interfacer un site en PHP avec une application tiers.
Cette application est livrée avec un API sous forme de DLL, je souhaiterai
donc depuis PHP faire des appels à cette DLL.



Facile, il suffit d'écrire une extension. Ca tombe bien, quelqu'un a demandé
l'url d'un tutoriel pour le faire et a eu une réponse. Sinon lire le manuel
e PHP, section "Extending PHp : Zend API".

Toute autre solution sera une horreur en termes de performances et/ou de
fiablilité du résultat.

a++
JG

Avatar
Jean-Marc Molina
Facile, il suffit d'écrire une extension. Ca tombe bien, quelqu'un a
demandé

l'url d'un tutoriel pour le faire et a eu une réponse. Sinon lire le manuel
e PHP, section "Extending PHp : Zend API".

En fait il faudrait savoir ce que tes applications doivent échanger comme
information. Tu pourrais en effet développer une nouvelle extension s'il
s'agit d'ajouter des fonctionnalités. Mais si c'est pour échanger des
données je pense qu'il faut mieux opter pour une techno service web.

JM

Avatar
John Gallet
Re,


En fait il faudrait savoir ce que tes applications doivent échanger comme
information.
oui je suis d'accord avec toi, difficile de donner une solution optimale

sans savoir ce que font les fonctons de ladite dll.

Tu pourrais en effet développer une nouvelle extension s'il
s'agit d'ajouter des fonctionnalités. Mais si c'est pour échanger des
données je pense qu'il faut mieux opter pour une techno service web.


Là je ne te rejoins pas du tout pour deux raisons :

- il s'agit d'appeler une fonction (écrite en C ou C++) de cette DLL. Tu vas
quand même pas installer un serveur d'applications et dépolyer autant de
services soap qu'il y a de fonctions dans la DLL quand même ? Si ? Tu
m'inquiètes là !

- je veux bien qu'on soit sur la même machine et que donc le trafic "réseau"
ne sera pas long. Mais les flux XML, s'ils apporrtent de la souplesse, sont
très verbeux. Pour récupérer un pauvre entier de la part d'une fonction de
la DLL, il faudra envoyer une requête de 300 à 400 caractères avec headers
et tout le foutoir, et pareil en retour.

Si vraiment il était nécessaire d'écrire un deamon tournant en local, vers
lequel php ouvrait une socket pour récupérer des données, je ne choisirais
pas le format XML par défaut pour causer.

Mais bon, après ça chacun voit midi à sa montre hein.
a++;
JG