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
Freigeben: 2016-08-08 09:21:27
Original
1289 Leute haben es durchsucht

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
Nach dem Login kopieren
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
Nach dem Login kopieren

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])
Nach dem Login kopieren

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)
Nach dem Login kopieren

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);
Nach dem Login kopieren

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>
Nach dem Login kopieren
#include "php.h"
#include "php_ini.h"
#include "ext/standard/info.h"
#include "php_test.h"
Nach dem Login kopieren
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[] */
};
Nach dem Login kopieren

(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);  
}  
Nach dem Login kopieren

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
Nach dem Login kopieren
Möglicherweise müssen Sie den Pfad hinzufügen:
/usr/local/php/bin/phpize
Nach dem Login kopieren

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
Nach dem Login kopieren

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.
Nach dem Login kopieren

Dann lösen Sie es mit der folgenden Methode:
yum install autoconf213
export PHP_AUTOC/bin/autoconf-2.13
Nach dem Login kopieren
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
Nach dem Login kopieren

10. Kompilieren und generieren Sie die .so-Erweiterungsdatei
make
make install
Nach dem Login kopieren
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
Nach dem Login kopieren

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"
Nach dem Login kopieren

13. Starten Sie den PHP-Dienst neu
service php-fpm restart
Nach dem Login kopieren

14. Verwenden Sie C++-Erweiterungsfunktionen in PHP

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

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
Nach dem Login kopieren

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.

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage