2009-08-09 6 views
18

Je n'ai pas utilisé C depuis les années 1980 et 1990 avec mes propres expériences. J'aimerais pouvoir le reprendre, mais cette fois en y construisant de petites choses et en le chargeant en PHP sur Linux.Comment construire ma première extension PHP en C sur Linux GCC?

Est-ce que quelqu'un a un tutoriel très court pour moi de faire une fonction foo() en C en tant qu'extension d'objet partagé chargé dans un php.ini? Je suppose que j'aurai besoin d'utiliser le GCC, mais je ne sais pas de quoi d'autre j'ai besoin sur mon poste de travail Ubuntu Linux pour le faire, ou comment composer les fichiers.

Certains des exemples que j'ai vus ont montré comment le faire en C++ ou le montrer comme une extension statique qui doit être compilée en PHP. Je ne veux pas ça - je veux le faire comme une extension C, pas C++, et le charger via php.ini.

Je pense à quelque chose où j'appelle foo ('bonjour') et il renvoie 'world' s'il voit la chaîne entrante est 'bonjour'.

Par exemple, si cela a été écrit dans 100% PHP, la fonction pourrait être:

function foo($s) { 
    switch ($s) 
    case 'hello': 
     return 'world'; 
     break; 
    default: 
     return $s; 
    } 
} 

Répondre

6

extension pour cet exemple.

<?php 
    function hello_world() { 
     return 'Hello World'; 
    } 
?> 
### config.m4
PHP_ARG_ENABLE(hello, whether to enable Hello 
World support, 
[ --enable-hello Enable Hello World support]) 
if test "$PHP_HELLO" = "yes"; then 
    AC_DEFINE(HAVE_HELLO, 1, [Whether you have Hello World]) 
    PHP_NEW_EXTENSION(hello, hello.c, $ext_shared) 
fi 
### php_hello.h
#ifndef PHP_HELLO_H 
#define PHP_HELLO_H 1 
#define PHP_HELLO_WORLD_VERSION "1.0" 
#define PHP_HELLO_WORLD_EXTNAME "hello" 

PHP_FUNCTION(hello_world); 

extern zend_module_entry hello_module_entry; 
#define phpext_hello_ptr &hello_module_entry 

#endif 
#### hello.c
#ifdef HAVE_CONFIG_H 
#include "config.h" 
#endif 
#include "php.h" 
#include "php_hello.h" 

static function_entry hello_functions[] = { 
    PHP_FE(hello_world, NULL) 
    {NULL, NULL, NULL} 
}; 

zend_module_entry hello_module_entry = { 
#if ZEND_MODULE_API_NO >= 20010901 
    STANDARD_MODULE_HEADER, 
#endif 
    PHP_HELLO_WORLD_EXTNAME, 
    hello_functions, 
    NULL, 
    NULL, 
    NULL, 
    NULL, 
    NULL, 
#if ZEND_MODULE_API_NO >= 20010901 
    PHP_HELLO_WORLD_VERSION, 
#endif 
    STANDARD_MODULE_PROPERTIES 
}; 

#ifdef COMPILE_DL_HELLO 
ZEND_GET_MODULE(hello) 
#endif 

PHP_FUNCTION(hello_world) 
{ 
    RETURN_STRING("Hello World", 1); 
} 

Construire votre poste phpize $ $ ./configure --enable-hello $ faites

Après avoir exécuté ces commandes, vous devriez avoir une hello.so

extension = hello.so à votre php.ini pour le déclencher.

php -r 'echo hello_world();' 

vous avez terminé. ;-)

lire la suite here

pour la manière facile d'essayer juste Zephir-lang pour construire l'extension php avec moins de connaissances

namespace Test; 

/** 
* This is a sample class 
*/ 
class Hello 
{ 
    /** 
    * This is a sample method 
    */ 
    public function say() 
    { 
     echo "Hello World!"; 
    } 
} 

compilation avec zephir et obtenir l'extension de test

+0

Veuillez fournir l'url de documentation. –

+0

déjà fourni –

2

Examinée Saurabh's exa mple avec PHP 7.1.6 et a trouvé quelques modifications mineures ont été nécessaires:

  • changement function_entry-zend_function_entry
  • Remplacer RETURN_STRING("Hello World", 1) avec RETURN_STRING("Hello World")

Ceci est un exemple de code pour commencer le développement d'extensions PHP! Je vous remercie!

Questions connexes