Heim >Backend-Entwicklung >PHP-Tutorial >So erweitern Sie PHP (so verpackt) mit C unter Linux

So erweitern Sie PHP (so verpackt) mit C unter Linux

WBOY
WBOYOriginal
2016-08-08 09:21:271321Durchsuche

In diesem Artikel geht es hauptsächlich um die Unterschiede zwischen dem Packen von C-Erweiterungsdateien unter Linux und Windows. Detaillierte Code- und Konfigurationspläne finden Sie in einem anderen Blog: http://blog.csdn.net/maverick1990/article /details/. 46519045

Schritte:

1. Installieren Sie die PHP-Umgebung im Verzeichnis /usr/local/php/

2. Laden Sie die gleiche Version des PHP-Quellcodepakets herunter , Installiert im Verzeichnis /root/php-5.6.9/, können Sie es von der offiziellen Website http://www.php.net/downloads.php herunterladen

Führen Sie den Befehl aus:

cd /root
wget http://us1.php.net/distributions/php-5.6.9.tar.bz2
tar -xf php-5.6.9.tar.bz2
Hinweis: Einige historische Versionen verfügen nicht über Quellcodepakete und Sie müssen PHP auf eine Version aktualisieren, die Quellcodepakete bereitstellt.

3. Gehen Sie in das Verzeichnis /php-5.6.9/ext/ und verwenden Sie ext_skel, um das erweiterte Skelett zu generieren

cd ./php-5.6.9/ext
./ext_skel --extname=test

4. Ändern Sie die Konfigurationsdatei /test/config.m4

Brechen Sie die folgenden zwei Zeilen Dnl-Kommentare ab:

PHP_ARG_ENABLE(test, whether to enable test support,
dnl Make sure that the comment is aligned:
[  --enable-test           Enable test support])

Wenn Sie C++ zum Kompilieren verwenden möchten, benennen Sie test.c in test.cpp um und fügen Sie es zu config.m4 hinzu
PHP_REQUIRE_CXX()    
PHP_ADD_LIBRARY(stdc++, 1, EXTRA_LDFLAGS)
PHP_NEW_EXTENSION(test, test.cpp, $ext_shared)

5. Fügen Sie der Datei php_test.h Code hinzu und fügen Sie eine benutzerdefinierte Funktionsdeklaration hinzu:
PHP_MINIT_FUNCTION(test);
PHP_MSHUTDOWN_FUNCTION(test);
PHP_RINIT_FUNCTION(test);
PHP_RSHUTDOWN_FUNCTION(test);
PHP_MINFO_FUNCTION(test);

PHP_FUNCTION(confirm_test_compiled);	/* For testing, remove later. */
PHP_FUNCTION(testFunc);

6. Fügen Sie benutzerdefinierten Funktionscode in test.c/cpp hinzu:

(1) Führen Sie zunächst die an dieser Stelle verwendete Header-Datei ein:

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include <stdio.h>
#include <string.h>
#include <math.h>
#include "php.h"
#include "php_ini.h"
#include "ext/standard/info.h"
#include "php_test.h"
Andernfalls wird es eine geben viele Probleme mit der Funktionsneudefinition. Weitere Informationen finden Sie in einem anderen Blog: http://blog.csdn.net/maverick1990/article/details/46786685

(2) Fügen Sie dann den Funktionseintrag an dieser Stelle hinzu:

const zend_function_entry test_functions[] = {
	PHP_FE(confirm_test_compiled, NULL)		/* For testing, remove later. */
	PHP_FE(testFunc, NULL)
	PHP_FE_END	/* Must be the last line in test_functions[] */
};

(3) Fügen Sie abschließend den Code der testFunc-Funktion am Ende der Datei hinzu. Sie können auch andere benutzerdefinierte definieren funktioniert hier.
PHP_FUNCTION(testFunc)  
{  
    char *x = NULL;  
    char *y = NULL;  
    int argc = ZEND_NUM_ARGS();  
    int x_len;  
    int y_len;  
  
    if (zend_parse_parameters(argc TSRMLS_CC, "ss", &x, &x_len, &y, &y_len) == FAILURE)   
        return;  
      
    int result_length = x_len + y_len;  
    char* result = (char *) emalloc(result_length + 1);  
    strcpy(result, x);  
    strcat(result, y);  
  
    RETURN_STRINGL(result, result_length, 0);  
}  

Einzelheiten zum Schreiben der PHP_FUNCTION-Funktion finden Sie im Blog: http://weizhifeng.net/write-php-extension-part2-1.html

7. Erstellen Sie im Verzeichnis /root/php-5.6.9/ext/test/ ein PHP-Erweiterungsmodul:

phpize
Möglicherweise müssen Sie den Pfad hinzufügen:
/usr/local/php/bin/phpize

8. Kehren Sie zum Verzeichnis /root/php-5.6.9/ zurück und stellen Sie die für die Kompilierung erforderliche Konfiguration wieder her:

cd ../..
./buildconf --force

Wenn ein ähnlicher Fehler auftritt:

buildconf: You need autoconf 2.59 or lower to build this version of PHP.
          You are currently trying to use 2.63
          Most distros have separate autoconf 2.13 or 2.59 packages.
          On Debian/Ubuntu both autoconf2.13 and autoconf2.59 packages exist.
          Install autoconf2.13 and set the PHP_AUTOCONF env var to
          autoconf2.13 and try again.

Dann lösen Sie es mit der folgenden Methode:
yum install autoconf213
export PHP_AUTOC/bin/autoconf-2.13
9. Gehen Sie in das Verzeichnis /root/php-5.6.9/ext/test/ und generieren Sie die Konfiguration:
./configure --with-php-c/local/php/bin/php-config

10. Kompilieren und generieren Sie die .so-Erweiterungsdatei
make
make install
Wenn make eine Fehler, ändern Sie den Code, bis die Kompilierung erfolgreich ist

Wenn bei make install ein Fehler auftritt, müssen Sie nach der Änderung die aktuell generierten Erweiterungsmodule löschen:

phpize --clean

Dann beginnen Sie erneut mit Schritt 7

11. Überprüfen Sie, ob test.so generiert wurde

Nach erfolgreicher Make-Installation wird der Generierungspfad angegeben, zum Beispiel: /usr/local/php/lib/php/extensions/no-debug -non-zts- 20131226/test.so

12. Ändern Sie php.ini

Ändern Sie die Datei /usr/local/php/etc/php.ini und fügen Sie den Erweiterungspfad und -namen hinzu :

extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/"

extension = "teste.so"

13. Starten Sie den PHP-Dienst neu
service php-fpm restart

14. Verwenden Sie C++-Erweiterungsfunktionen in PHP

<?php 
$concat_str = testFunc("concat1","concat2");
echo $concat_str;
?>

Hinweis: Wenn bei der Verwendung ein Fehler auftritt die Erweiterungsfunktion:
PHP Warning  PHP Startup Unable to initialize module 
Module compiled with module API=20121212 PHP    
compiled with module API=20090626 
These options need to match  in Unknown on line 0

Dies liegt daran, dass sich die Version des PHP-Quellcodepakets, die zum Kompilieren der .so-Datei verwendet wird, von der aktuell verwendeten Version von PHP unterscheidet. Sie müssen die aktuelle Version des PHP-Quellcodepakets herunterladen und neu kompilieren Erweiterung

Copyright-Erklärung: Dieser Artikel ist ein Originalartikel des Bloggers und darf nicht ohne die Erlaubnis des Bloggers reproduziert werden.

Das Obige stellt die Methode zur Verwendung von C zum Erweitern von PHP (in PHP verpackt) unter Linux vor, einschließlich der relevanten Inhalte. Ich hoffe, dass es für Freunde hilfreich sein wird, die sich für PHP-Tutorials interessieren.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn