Inhaltsverzeichnis
PHP内核的学习--创建PHP扩展
Heim Backend-Entwicklung PHP-Tutorial PHP内核的学习--创建PHP扩展_PHP教程

PHP内核的学习--创建PHP扩展_PHP教程

Jul 13, 2016 am 09:57 AM
Kernel

PHP内核的学习--创建PHP扩展

PHP取得成功的一个主要原因之一是它拥有大量的可用扩展。web开发者无论有何种需求,这种需求最有可能在PHP发行包里找到。PHP发行包包括支持各种数据库,图形文件格式,压缩,XML技术扩展在内的许多扩展。
 
扩展API的引入使PHP3取得了巨大的进展,扩展API机制使PHP开发社区很容易的开发出几十种扩展。现在,两个版本过去了,API仍然和PHP3时的非常相似。扩展主要的思想是:尽可能的从扩展编写者那里隐藏PHP的内部机制和脚本引擎本身,仅仅需要开发者熟悉API。
 
有两个理由需要自己编写PHP扩展。第一个理由是:PHP需要支持一项她还未支持的技术。这通常包括包裹一些现成的C函数库,以便提供PHP接口。例如,如果一个叫FooBase的数据库已推出市场,你需要建立一个PHP扩展帮助你从PHP里调用FooBase的C函数库。这个工作可能仅由一个人完成,然后被整个PHP社区共享(如果你愿意的话)。第二个不是很普遍的理由是:你需要从性能或功能的原因考虑来编写一些商业逻辑。
 
假设你正在开发一个网站,需要一个把字符串重复n次的函数。下面是用PHP写的例子:
 
 
function util_str_repeat($string, $n){
    $result = "";
    for($i = 0; $i
        $result .= $string;
    }
    return $result;
}
 
util_str_repeat("One", 3);// returns "OneOneOne".
util_str_repeat("One", 1);// returns "One".
 
假设由于一些奇怪的原因,你需要时常调用这个函数,而且还要传给函数很长的字符串和大值n。这意味着在脚本里有相当巨大的字符串连接量和内存重新分配过程,以至显著地降低脚本执行速度。如果有一个函数能够更快地分配大量且足够的内存来存放结果字符串,然后把$string重复n次,就不需要在每次循环迭代中分配内存。
 
为扩展建立函数的第一步是写一个函数定义文件,该函数定义文件定义了扩展对外提供的函数原形。该例中,定义函数只有一行函数原形util_str_repeat() :
 
string util_str_repeat(string str, int n)
函数定义文件的一般格式是一个函数一行。你可以定义可选参数和使用大量的PHP类型,包括: bool, float, int, array等。
 
保存为util.def文件至PHP原代码目录树下(即与ext_skel文件放在同一目录下,我的目录是/usr/share/php5/)。
 
然后就是通过扩展骨架(skeleton)构造器运行函数定义文件的时机了。该构造器脚本就是ext_skel。假设你把函数定义保存在一个叫做util.def的文件里,而且你希望把扩展取名为util,运行下面的命令来建立扩展骨架:
 
sudo ./ext_skel --extname=util --proto=util.def
执行之后,我这里报了如下错误:
 
 
./ext_skel: 1: cd: can't cd to /usr/lib/php5/skeleton
Creating directory util
awk: cannot open /create_stubs (No such file or directory)
Creating basic files: config.m4 config.w32 .svnignore util.c./ext_skel: 216: ./ext_skel: cannot open /skeleton.c: No such file
 php_util.h./ext_skel: 234: ./ext_skel: cannot open /php_skeleton.h: No such file
 CREDITS./ext_skel: 238: ./ext_skel: cannot open /CREDITS: No such file
 EXPERIMENTAL./ext_skel: 242: ./ext_skel: cannot open /EXPERIMENTAL: No such file
 tests/001.phpt./ext_skel: 247: ./ext_skel: cannot open /tests/001.phpt: No such file
 util.php./ext_skel: 251: ./ext_skel: cannot open /skeleton.php: No such file
rm: cannot remove ‘function_entries’: No such file or directory
rm: cannot remove ‘function_declarations’: No such file or directory
rm: cannot remove ‘function_stubs’: No such file or directory
 [done].
 
To use your new extension, you will have to execute the following steps:
 
1.  $ cd ..
2.  $ vi ext/util/config.m4
3.  $ ./buildconf
4.  $ ./configure --[with|enable]-util
5.  $ make
6.  $ ./php -f ext/util/util.php
7.  $ vi ext/util/util.c
8.  $ make
 
Repeat steps 3-6 until you are satisfied with ext/util/config.m4 and
step 6 confirms that your module is compiled into PHP. Then, start writing
code and repeat the last two steps as often as necessary.
 
很明显是/usr/lib/php5/skeleton路径的错误,编辑ext_skel文件,将/usr/lib/php5/skeleton修改为/usr/share/php5/skeleton,然后移除掉生成的util文件夹,再次执行之前的命令,成功后提示如下:
 
 
Creating directory util
Creating basic files: config.m4 config.w32 .svnignore util.c php_util.h CREDITS EXPERIMENTAL tests/001.phpt util.php [done].
 
To use your new extension, you will have to execute the following steps:
 
1.  $ cd ..
2.  $ vi ext/util/config.m4
3.  $ ./buildconf
4.  $ ./configure --[with|enable]-util
5.  $ make
6.  $ ./php -f ext/util/util.php
7.  $ vi ext/util/util.c
8.  $ make
 
Repeat steps 3-6 until you are satisfied with ext/util/config.m4 and
step 6 confirms that your module is compiled into PHP. Then, start writing
code and repeat the last two steps as often as necessary.
 
然后采用静态编译的方式编译扩展。为了使扩展能够被编译,需要修改扩展目录util/下的config.m4文件。扩展没有包裹任何外部的C库,你需要添加支持–enable-util配置开关到PHP编译系统里(–with-extension 开关用于那些需要用户指定相关C库路径的扩展)。找到如下内容:
 
dnl PHP_ARG_ENABLE(util, whether to enable util support,
dnl Make sure that the comment is aligned:
dnl [  --enable-util           Enable util support])
将前面的dnl 去掉,修改为如下结果:
 
PHP_ARG_ENABLE(util, whether to enable util support,
Make sure that the comment is aligned:
[  --enable-util           Enable util support])
然后修改util.c文件,找到如下代码:
 
 
PHP_FUNCTION(util_str_repeat)
{
    char *str = NULL;
    int argc = ZEND_NUM_ARGS();
    int str_len;
    long n;
 
    if (zend_parse_parameters(argc TSRMLS_CC, "sl", &str, &str_len, &n) == FAILURE) 
        return;
 
    php_error(E_WARNING, "util_str_repeat: not yet implemented");
}
 
将其修改为如下代码:
 
 
PHP_FUNCTION(util_str_repeat)
{
    char *str = NULL;
    int argc = ZEND_NUM_ARGS();
    int str_len;
    long n;
    char *result; /* Points to resulting string */
    char *ptr; /* Points at the next location we want to copy to */
    int result_length; /* Length of resulting string */
 
    if (zend_parse_parameters(argc TSRMLS_CC, "sl", &str, &str_len, &n) == FAILURE)
        return;
 
    /* Calculate length of result */
    result_length = (str_len * n);
    /* Allocate memory for result */
    result = (char *) emalloc(result_length + 1);
    /* Point at the beginning of the result */
    ptr = result;
 
    while (n--) {
        /* Copy str to the result */
        memcpy(ptr, str, str_len);
        /* Increment ptr to point at the next position we want to write to */
        ptr += str_len;
    }
 
    /* Null terminate the result. Always null-terminate your strings
    even if they are binary strings */
    *ptr = '\0';
    /* Return result to the scripting engine without duplicating it*/
    RETURN_STRINGL(result, result_length, 0);
}
  里面的具体内容,就不在这里说了,之后会慢慢写到。
 
然后就是编译,安装。在util目录下,命令如下(命令可能都需要加sudo):
 
phpize
./configure
make
make test
make install
然后配置生成的扩展文件,在php5.5版本中,进入到/etc/php5/mods-available目录下,创建util.ini文件,写入如下内容:
 
extension=util.so
然后enable util扩展
 
sudo php5enmod util
最后,重启php-fpm
 
sudo service php5-fpm restart
创建一个php文件,测试一下,测试文件如下:
 
for ($i = 1; $i
    print util_str_repeat("CraryPrimitiveMan ", $i);
    print "\n";
}
?>
执行结果如下:
 
CraryPrimitiveMan 
CraryPrimitiveMan CraryPrimitiveMan 
CraryPrimitiveMan CraryPrimitiveMan CraryPrimitiveMan
这样我们就成功创建了一个包含简单的PHP函数的扩展。

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/984112.htmlTechArticlePHP内核的学习--创建PHP扩展 PHP取得成功的一个主要原因之一是它拥有大量的可用扩展。web开发者无论有何种需求,这种需求最有可能在PHP发...
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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So installieren Sie den Linux-Kernel unter Ubuntu 22.04 Detailliertes Tutorial! So installieren Sie den Linux-Kernel unter Ubuntu 22.04 Detailliertes Tutorial! Mar 01, 2024 pm 10:34 PM

Um den Linux-Kernel auf Ubuntu22.04 zu installieren, können Sie die folgenden Schritte ausführen: Aktualisieren Sie das System: Stellen Sie zunächst sicher, dass Ihr Ubuntu-System auf dem neuesten Stand ist. Führen Sie den folgenden Befehl aus, um das Systempaket zu aktualisieren: sudoaptupdatesudoaptupgrade Laden Sie die Kerneldatei herunter: Besuchen Sie die Offizielle Linux-Kernel-Website () zum Herunterladen der erforderlichen Kernel-Version. Wählen Sie eine stabile Version und laden Sie die Quellcodedatei herunter (mit der Erweiterung .tar.gz oder .tar.xz), zum Beispiel: wget Entpacken Sie die Datei: Verwenden Sie den folgenden Befehl, um die heruntergeladene Kernel-Quellcodedatei zu entpacken: tar-xflinux-5.14 .tar. xz install build dependencies: Installieren Sie die zum Erstellen des Kernels erforderlichen Tools und Abhängigkeiten. Ausführen

Ändern Sie die Startsequenz des Linux-Kernels Ändern Sie die Startsequenz des Linux-Kernels Feb 23, 2024 pm 10:22 PM

Ändern Sie die Kernel-Startsequenz von Linux 1. Ändern Sie die Kernel-Startsequenz von RHEL6/CentOS6. Überprüfen Sie die Datei /etc/grub.conf, um die Systemkernel-Situation zu ermitteln. Dem Dokument zufolge gibt es im System zwei Kernel-Versionen, nämlich 2.6.32-573.18.1.el6.x86_64 und 2.6.32-431.23.3.el6.x86_64. Die Kernel-Versionen werden von oben nach unten aufgelistet. In der Datei grub.conf können Sie durch Anpassen der Standardparameter entscheiden, welche Kernel-Version beim Systemstart verwendet werden soll. Der Standardwert ist 0, was bedeutet, dass das System die neueste Kernel-Version startet. Ein Wert von 0 entspricht dem ersten Inhalt, der in der Datei grub.conf aufgeführt ist.

Basiert das Android-System auf dem Linux-Kernel? Basiert das Android-System auf dem Linux-Kernel? Mar 14, 2024 pm 03:12 PM

Basiert das Android-System auf dem Linux-Kernel? Das Android-System, eines der am weitesten verbreiteten mobilen Betriebssysteme der Welt, soll seit jeher auf Basis des Linux-Kernels entwickelt werden. Doch wie ist die reale Situation? Lassen Sie uns dieses Problem untersuchen. Lassen Sie uns zunächst etwas über den Linux-Kernel lernen. Der Linux-Kernel als Open-Source-Betriebssystemkernel wurde erstmals 1991 von Linus Torvalds veröffentlicht. Es bietet eine gute Grundlage für viele Betriebssysteme, einschließlich And

Analyse und Analyse der Hauptfunktionen des Linux-Kernels Analyse und Analyse der Hauptfunktionen des Linux-Kernels Mar 14, 2024 am 11:27 AM

Analyse und Analyse der Hauptfunktionen des Linux-Kernels Der Linux-Kernel ist ein großes und komplexes System, in dem die Hauptfunktion eine wichtige Rolle spielt. Sie ist der Einstiegspunkt des gesamten Systems und schließlich für die Initialisierung verschiedener Subsysteme, Treiber und Kernelmodule verantwortlich Starten Sie das gesamte Betriebssystem. In diesem Artikel werden die Hauptfunktionen des Linux-Kernels analysiert und analysiert und seine Schlüsselfunktionen und der Ausführungsablauf anhand spezifischer Codebeispiele demonstriert. Im Linux-Kernel ist der Einstiegspunkt der Hauptfunktion start_k in der Datei init/main.c.

Entdecken Sie die Programmiersprachen, die unter der Haube des Linux-Kernels verwendet werden Entdecken Sie die Programmiersprachen, die unter der Haube des Linux-Kernels verwendet werden Mar 20, 2024 am 08:06 AM

Titel: Erkundung der Programmiersprache, die dem Linux-Kernel zugrunde liegt. Als stabiler und zuverlässiger Open-Source-Betriebssystemkern bietet der Linux-Kernel ein breites Anwendungsspektrum im Computerbereich. Um ein tiefgreifendes Verständnis des Linux-Kernels zu erlangen, müssen Sie die auf der zugrunde liegenden Ebene verwendete Programmiersprache einbeziehen. Tatsächlich ist der Linux-Kernel hauptsächlich in der Sprache C geschrieben, einer effizienten, flexiblen und einfach zu wartenden Programmiersprache, die sich sehr gut für die Betriebssystementwicklung eignet. In diesem Artikel werden die Grundlagen des Linux-Kernels aus einer detaillierten Perspektive untersucht

Detaillierte Erläuterung des Speicherorts des Linux-Kernel-Quellcodes Detaillierte Erläuterung des Speicherorts des Linux-Kernel-Quellcodes Mar 14, 2024 pm 06:12 PM

Detaillierte Erläuterung des Speicherorts des Linux-Kernel-Quellcodes. Der Linux-Kernel-Quellcode ist der Kernbestandteil des Linux-Betriebssystems. Er enthält den Implementierungscode für verschiedene Funktionen des Betriebssystems. Um zu verstehen, wo der Linux-Kernel-Quellcode gespeichert ist, müssen wir zunächst die Organisationsstruktur des Linux-Kernels verstehen. Der Linux-Kernel-Quellcode wird normalerweise im Verzeichnis /usr/src/linux oder /usr/src/linux- gespeichert. In diesem Verzeichnis gibt es viele

Tutorial zum Kompilieren und Installieren des Ubuntu-Kernels. Tutorial zum Kompilieren und Installieren des Ubuntu-Kernels. Feb 19, 2024 pm 02:54 PM

Das Kompilieren und Installieren des Ubuntu-Kernels erfordert bestimmte Fachkenntnisse und praktische Erfahrung. Hier sind die allgemeinen Schritte, aber bitte gehen Sie vorsichtig vor, da dieser Vorgang gewisse Risiken bergen kann. Bevor Sie beginnen, sichern Sie unbedingt wichtige Daten und Systeme. Holen Sie sich den Quellcode: Besuchen Sie die offizielle Ubuntu-Website () oder die Kernel-Entwickler-Website (), um den neuesten Kernel-Quellcode herunterzuladen. Entpacken Sie den Quellcode in ein geeignetes Verzeichnis, z. B. /usr/src. Kompilierungsabhängigkeiten installieren: Installieren Sie die Abhängigkeiten, die zum Erstellen des Kernels erforderlich sind. Öffnen Sie ein Terminal und führen Sie den folgenden Befehl aus: sudoapt-getinstallbuild-essentiallibncurses-devbisonflexlibssl-devlibelf-d

Tutorial zum CentOS 7-Kernel-Upgrade. Tutorial zum CentOS 7-Kernel-Upgrade. Feb 18, 2024 pm 05:33 PM

Das Upgrade des Kernels auf CentOS7 erfordert die folgenden Schritte: Überprüfen Sie die aktuelle Kernel-Version: Öffnen Sie ein Terminal und führen Sie den folgenden Befehl aus: uname -r Add ELRepo source: Führen Sie den folgenden Befehl aus, um die ELRepo-Quelle hinzuzufügen: rpm --import Neuen Kernel installieren: Führen Sie den folgenden Befehl aus, um den neuesten stabilen Kernel zu installieren: yum --enablerepo=elrepo-kernelinstallkernel-ml Boot-Manager-Konfiguration (GRUB) aktualisieren: Führen Sie den folgenden Befehl aus, um die GRUB-Konfigurationsdatei zu aktualisieren: grub2-mkconfig -o/boot/grub2/grub .cfg Starten Sie das System neu: Führen Sie den folgenden Befehl aus, um das System neu zu starten: Überprüfung des Neustarts

See all articles