2009-08-09 2 views
18

Ich habe C nicht seit den 1980er und 1990er Jahren mit meinen eigenen Experimenten verwendet. Ich möchte es wieder aufnehmen können, aber dieses Mal indem ich kleine Dinge darin baue und es dann in PHP auf Linux lade.Wie baue ich meine erste PHP-Erweiterung in C auf Linux GCC?

Hat jemand ein sehr kurzes Tutorial für mich, um eine foo() - Funktion in C als Shared Object-Erweiterung in einer php.ini zu laden? Ich nehme an, dass ich den GCC verwenden muss, aber nicht weiß, was ich sonst noch auf meiner Ubuntu Linux-Workstation benötige, um das in Gang zu bringen oder die Dateien zu erstellen.

Einige der Beispiele, die ich gesehen habe, haben gezeigt, wie man es in C++ macht oder es als eine statische Erweiterung zeigt, die in PHP kompiliert werden muss. Ich will das nicht - ich möchte es als C-Erweiterung machen, nicht als C++, und es über php.ini laden.

Ich denke an etwas, wo ich foo ('Hallo') und es gibt 'Welt' zurück, wenn es die eingehende Zeichenfolge 'Hallo' sieht.

Zum Beispiel, wenn diese in 100% PHP geschrieben wurde, könnte die Funktion sein:

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

Antwort

6

Erweiterung für dieses Beispiel.

<?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); 
} 

Bauen Sie Ihre Erweiterung $ phpize $ ./configure --enable-hello $ make

Nach jedem dieser Befehle ausführen, sollten Sie

extension = hello.so auf die Datei php.ini auszulösen es ein hello.so haben.

php -r 'echo hello_world();' 

Sie sind fertig. ;-)

mehr lesen here

für eine einfache Möglichkeit, nur versuchen zephir-lang-PHP-Erweiterung mit weniger Wissen über

namespace Test; 

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

Kompilierung zu bauen es mit zephir und bekommen test extension

+0

Bitte Dokumentations-URL angeben. –

+0

bereits bereitgestellt –

2

Versuchte Saurabhs exa mple mit PHP 7.1.6 und gefunden wurden einige kleinere Änderungen erforderlich:

  • ändern function_entry-zend_function_entry
  • ersetzen RETURN_STRING("Hello World", 1) mit RETURN_STRING("Hello World")

Dies ist ein großartiges Beispiel Code PHP-Erweiterung Entwicklung zu starten! Vielen Dank!

Verwandte Themen