Maison  >  Article  >  développement back-end  >  Utilisez php pour appeler le code dans le fichier de bibliothèque so

Utilisez php pour appeler le code dans le fichier de bibliothèque so

不言
不言original
2018-04-09 10:04:157331parcourir

Le contenu de cet article est d'utiliser PHP pour appeler le code dans le fichier de la bibliothèque so. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer

Une certaine fonction est compilée dans le fichier so, alors comment l'appeler via php ? Une méthode consiste à

écrire un module php (extension php), à appeler la fonction dans le module en php, puis à utiliser le module pour appeler la fonction dans donc . Voici un exemple simple utilisant Fedora Core 6 comme système d'exploitation.

Créez d'abord un fichier so simple :

1  /**
 2   * hello.c
 3   * To compile, use following commands:
 4   *   gcc -O -c -fPIC -o hello.o hello.c 
 5   *   gcc -shared -o libhello.so hello.o
 6   */
 7  
 8  int hello_add(int a, int b)
 9  {
10      return a + b;
11  }
Ensuite, compilez-le dans un fichier .so et mettez-le dans le système :

1 ___FCKpd___1nbsp;gcc -O -c -fPIC -o hello.o hello.c
2 ___FCKpd___1nbsp;gcc -shared -o libhello.so hello.o
3 ___FCKpd___1nbsp;su
4 # echo /usr/local/lib > /etc/ld.so.conf.d/local.conf
5 # cp libhello.so /usr/local/lib
6 # /sbin/ldconfig
Écrivez un petit programme pour vérifier son exactitude :

 1/**
 2  * hellotest.c
 3  * To compile, use following commands:
 4  *   gcc -o hellotest -lhello hellotest.c
 5  */
 6 #include <stdio.h>
 7 int main()
 8 {
 9     int a = 3, b = 4;
10     printf("%d + %d = %d/n", a, b, hello_add(a,b));
11     return 0;
12 }
Compilez et exécutez :

 $ gcc -o hellotest -lhello hellotest.c
$ ./hellotest
3 + 4 = 7
OK, créons le module PHP. Tout d’abord, assurez-vous d’avoir installé le package php-devel. Sinon, veuillez le trouver sur le CD d’installation. Téléchargez ensuite le code source php. J'utilise php-5.2.3.tar.gz, décompressé.

 $ tar xzvf php-5.2.3.tar.gz
$ cd php-5.2.3/ext
Créez ensuite un module nommé bonjour via la commande suivante.

 $ ./ext_skel --extname=hello
Après avoir exécuté cette commande, il vous demandera quelle commande doit être utilisée pour compiler le module. Malheureusement, c'est la méthode de compilation qui intègre le module dans PHP. Si vous souhaitez le compiler dans un php_hello.so chargeable dynamiquement, la méthode est plus simple.

 $ cd hello
Modifiez d'abord le fichier config.m4 et supprimez les commentaires sur les lignes 16 et 18 (le symbole du commentaire est dnl.)

1 16:  PHP_ARG_ENABLE(hello, whether to enable hello support,
2 17:  dnl Make sure that the comment is aligned:
3 18:  [  --enable-hello           Enable hello support])
Ensuite, exécutez le programme phpize pour générer le configurer le script :

 $ phpize
Puis ouvrez php_hello.h, ajoutez la déclaration de fonction sous PHP_FUNCTION(confirm_hello_compiled);:

1PHP_FUNCTION(confirm_hello_compiled);   /* For testing, remove later. */
2 PHP_FUNCTION(hello_add);
Ouvrez hello.c, sous PHP_FE(confirm_hello_compiled, NULL) Ajouter ce qui suit.

<br/>
Écrivez ensuite le contenu de la fonction hello_add à la fin de hello.c :

 1PHP_FUNCTION(hello_add)
 2 {
 3     long int a, b;
 4     long int result;
 5 
 6     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &a, &b) == FAILURE) {
 7         return;
 8     }
 9 
10     result = hello_add(a, b);
11 
12     RETURN_LONG(result);
13 }
Enregistrez et quittez, compilez et installez :

___FCKpd___12nbsp;./configure
 ___FCKpd___12nbsp;make LDFLAGS=-lhello
 ___FCKpd___12nbsp;su
 # cp modules/hello.so /usr/lib/php/modules
Puis dans Créez un fichier hello.php sous /var/www/html avec le contenu suivant :

 <?php
dl("hello.so");
echo hello_add(3, 4);
?>
Ouvrez ensuite le fichier hello.php dans le navigateur Si 7 est affiché, l'appel de fonction est réussi. .


Supplément de connaissances Linux :

En raison de l'utilisation d'Editplus, le programme source par défaut du langage C est enregistré au format .cpp, puis je le compile avec gcc sous cygwin, et certaines fonctions apparaissent toujours non déclarées, mais ces fonctions sont toutes des appels système standard. Pourquoi ?


J'ai été déprimé par ce problème tout l'après-midi et la nuit. Ensuite, je ne savais pas pourquoi on m'avait demandé d'essayer de changer le programme source .cpp en .c, et. la compilation s'est déroulée sans problème.

Plus tard, j'ai appris sur Internet que sous Linux, gcc est utilisé pour compiler les fichiers .c, tandis que les fichiers c++ nécessitent la commande g++ pour compiler le programme source c++.

Recommandations associées :

Utilisez PHP pour obtenir l'adresse IP des visiteurs, l'emplacement régional, le navigateur et les informations sur la page source

PHP utilise PHPstorm Explication détaillée de la fonction d'invite automatique

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn