30.Jan 2007
C-Funktionen mit PHP

Um in PHP C-Funktionen nutzen zu können, muss man diese in einer eigenen Extension verpacken. Dann können diese wie normale Funktionen aufgerufen werden. Dieser Weg ist etwas aufwendiger als in Python.

// myExt.c
#include "php.h"

PHP_FUNCTION(fibonacci)
{	
  int n;

  if ( zend_parse_parameters( ZEND_NUM_ARGS() TSRMLS_CC, 
    "l|l", &n ) == FAILURE ) 
    RETURN_NULL();

  RETURN_LONG(fibonacci(n));
}

int fibonacci( int n ) 
{
  if( n > 2 )
    return fibonacci( n - 1 ) + fibonacci( n - 2 );
  else
    return 1;
}

static function_entry myExt_functions[] = {
  PHP_FE(fibonacci, NULL)
  { NULL, NULL, NULL }
};

zend_module_entry myExt_module_entry = {
  STANDARD_MODULE_HEADER,
  "myExt", // Name der Extension
  myExt_functions,
  NULL, NULL, NULL, NULL, NULL,
  "1.0", // Version
  STANDARD_MODULE_PROPERTIES
};                                

ZEND_GET_MODULE(myExt)

Übersetzt wird die Extension mit den Kommandos

gcc -fpic -c `php-config --includes` myExt.c
gcc -shared myExt.o -o myExt.so

Um die Bibliothek einzubinden, kopiert man sie in das PHP Modulverzeichnis und ergäzt die php.ini um die Zeile extension=myExt.so. Zum Testen der Performanceunterschiede kann man folgendes PHP-Skript ausprobieren:

function php_fibonacci( $n )
{
  if ( $n > 2 ) 
    return php_fibonacci( $n - 2 ) + php_fibonacci( $n - 1 );
  else 
    return 1;
}

$t = time(); 
echo php_fibonacci(40); 
echo ":" . ( time() - $t ) . "\n";

$t = time(); 
echo fibonacci(40); 
echo ":" . ( time() - $t ) . "\n";

Auf meinem Testrechner benötigt die C-Variante dabei 2 Sekunden und das Skript ca. vier Minuten.