亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

PHP7擴(kuò)展開發(fā)(一):hello world

Thanatos / 2408人閱讀

摘要:起步最近在看擴(kuò)展開發(fā)中文教程的版。擴(kuò)展是什么用過的人一定也用過擴(kuò)展。本身帶有個(gè)擴(kuò)展,擴(kuò)展是對(duì)語言功能的一個(gè)延伸,的核心由兩部分組成最底層的引擎和內(nèi)核。額外不使用工具寫擴(kuò)展一個(gè)擴(kuò)展為避免與寫過的沖突,采用作為名字,至少包含個(gè)文件。

起步

最近在看 《PHP擴(kuò)展開發(fā)中文教程》 的pdf版。PHP的解釋器是用C語言寫的,所以PHP擴(kuò)展自然也是用C 語言了。

擴(kuò)展是什么

用過php的人一定也用過php擴(kuò)展。php本身帶有86個(gè)擴(kuò)展,擴(kuò)展是對(duì)php語言功能的一個(gè)延伸,php的核心由兩部分組成:最底層的 Zend引擎PHP內(nèi)核 。ze把腳本解析成機(jī)器可讀的符號(hào),也會(huì)處理內(nèi)存管理,變量作用域,程序調(diào)度。PHP內(nèi)核則主要涉及主機(jī)環(huán)境(Apache,IIS,Nginx),處理與主機(jī)的通信。

動(dòng)機(jī)

當(dāng)php自身不滿足需求的時(shí)候就可以自己去造輪子了。采用C語言開發(fā)還能一定程度上解決性能問題,而php是我最喜歡的一門編程語言,寫擴(kuò)展的機(jī)會(huì)自然不放過,更重要的是可以 裝逼 。

新建擴(kuò)展

我們要寫個(gè)擴(kuò)展代替以下的功能:


我的開發(fā)環(huán)境是:

系統(tǒng): Ubuntu 16.04

PHP: 7.0+

gcc :4.8.4
PHP已經(jīng)提供了工具用來創(chuàng)建擴(kuò)展,并初始化代碼:ext_skel

$ cd php-src/ext
$ ./ext_skel --extname=hello

工具會(huì)在當(dāng)前目錄生成 hello 文件夾。

修改配置文件

cd到hello,工具已經(jīng)初始化了目錄,打開配置文件 config.m4:

dnl If your extension references something external, use with:

dnl PHP_ARG_WITH(hello, for hello support,
dnl Make sure that the comment is aligned:
dnl [  --with-hello             Include hello support])

dnl Otherwise use enable:

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

dnl 是注釋符,表示當(dāng)前行是注釋。這段話是說如果此擴(kuò)展依賴其他擴(kuò)展,去掉PHP_ARG_WITH段的注釋符;否則去掉PHP_ARG_ENABLE段的注釋符。顯然我們不依賴其他擴(kuò)展或lib庫(kù),所以去掉PHP_ARG_ENABLE段的注釋符:

PHP_ARG_ENABLE(hello, whether to enable hello support,
Make sure that the comment is aligned:
[  --enable-hello           Enable hello support])
書寫代碼

工具生成的hello.c,寫上我們的實(shí)現(xiàn):

PHP_FUNCTION(hello)
{
    zend_string *strg;
    strg = strpprintf(0, "hello world.");
    RETURN_STR(strg);
}

添加到編譯列表里:

const zend_function_entry hello_functions[] = {
    PHP_FE(hello, NULL)  /*添加這行*/
    PHP_FE(confirm_hello_compiled,  NULL)       /* For testing, remove later. */
    PHP_FE_END  /* Must be the last line in hello_functions[] */
};
編譯與安裝
$ phpize
$ ./configure --with-php-config=/usr/local/php7/bin/php-config
$ make & make install

修改php.ini,開啟擴(kuò)展,若找不到可以用phpinfo()查看使用哪個(gè)配置文件.

extension=hello.so

寫個(gè)腳本: 不出意外就能看到輸出了。

額外:不使用工具寫擴(kuò)展

一個(gè)擴(kuò)展(為避免與寫過的hello沖突,采用world作為名字),至少包含3個(gè)文件: config.m4、 php_world.h 、 world.c 。一個(gè)是phpize用來準(zhǔn)備編譯擴(kuò)展的配置文件,一個(gè)是引用包含的頭文件,一個(gè)是源碼文件。

config.m4

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

if test "$PHP_WORLD" != "no"; then
    AC_DEFINE(HAVE_WORLD,1,[ ])
    PHP_NEW_EXTENSION(world, world.c, $ext_shared,, -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1)
fi

php_world.h

#ifndef PHP_WORLD_H
#define PHP_WORLD_H


extern zend_module_entry hello_module_entry;
#define phpext_hello_ptr &hello_module_entry
#define PHP_WORLD_VERSION "0.1.0"
#define PHP_WORLD_EXTNAME "world"

#endif

world.c

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

#include "php.h"
#include "php_world.h"

PHP_FUNCTION(world)
{
    zend_string *strg;
    strg = strpprintf(0, "hello world. (from world module)");
    RETURN_STR(strg);
}

const zend_function_entry world_functions[] = {
    PHP_FE(world, NULL)
    PHP_FE_END
};
zend_module_entry world_module_entry = {
    STANDARD_MODULE_HEADER,
    PHP_WORLD_EXTNAME,
    world_functions,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    PHP_WORLD_VERSION,
    STANDARD_MODULE_PROPERTIES
};

#ifdef COMPILE_DL_WORLD
#ifdef ZTS
ZEND_TSRMLS_CACHE_DEFINE()
#endif
ZEND_GET_MODULE(world)
#endif

編譯安裝:

$ phpize
$ ./configure --with-php-config=/usr/local/php7/bin/php-config
$ make & make install

測(cè)試:
一樣需要在php.ini添加extension=world.so

不使用工具的精簡(jiǎn)的一個(gè)擴(kuò)展完成。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/22067.html

相關(guān)文章

  • PHP7擴(kuò)展開發(fā)入門

    摘要:下載源代碼要開發(fā)擴(kuò)展,需要先下載的源代碼,一方面是因?yàn)槲覀兊臄U(kuò)展一般會(huì)用到自身定義的函數(shù)和宏,另一方面我們可以利用官方提供的工具減少工作量。重點(diǎn)關(guān)注,,即可,最簡(jiǎn)單的場(chǎng)景下這三個(gè)文件就是一個(gè)擴(kuò)展的全部組成部分了。 下載PHP源代碼 要開發(fā)PHP擴(kuò)展,需要先下載PHP的源代碼,一方面是因?yàn)槲覀兊臄U(kuò)展一般會(huì)用到PHP自身定義的函數(shù)和宏,另一方面我們可以利用官方提供的工具減少工作量。我下載了...

    ytwman 評(píng)論0 收藏0
  • PHP擴(kuò)展開發(fā)教程1 - 相關(guān)開發(fā)技術(shù)對(duì)比及介紹

    摘要:四使用語言開發(fā)是我重點(diǎn)推薦的擴(kuò)展開發(fā)框架,簡(jiǎn)明易懂,功能強(qiáng)大,開發(fā)效率高,代碼易維護(hù),執(zhí)行速度快。優(yōu)點(diǎn)三支持,的擴(kuò)展開發(fā)有兩套擴(kuò)展開發(fā)框架,分別支持,,雖然框架代碼有兩個(gè),但是接口卻是一樣的。 PHP擴(kuò)展是高級(jí)PHP程序員必須了解的技能之一,對(duì)于一個(gè)初入門的PHP擴(kuò)展開發(fā)者,怎么才能開發(fā)一個(gè)成熟的擴(kuò)展,進(jìn)入PHP開發(fā)的高級(jí)領(lǐng)域呢?本系列開發(fā)教程將手把手帶您從入門進(jìn)入高級(jí)階段。本教程系列...

    alaege 評(píng)論0 收藏0
  • 使用 Zephir 輕松構(gòu)建 PHP 擴(kuò)展

    摘要:簡(jiǎn)介通過擴(kuò)展,我們可以在代碼中使用一些特定的方法大部分的擴(kuò)展都是用寫的。這個(gè)目錄與我們的擴(kuò)展同名。我們先來在擴(kuò)展中創(chuàng)建一個(gè)類,使用此類來渲染。接下來命令行執(zhí)行以下命令來編譯擴(kuò)展第一次運(yùn)行以上命令時(shí),會(huì)初始化一些東西。 showImg(https://segmentfault.com/img/remote/1460000018698586); 簡(jiǎn)介: 通過 PHP 擴(kuò)展, 我們可以在 p...

    gaosboy 評(píng)論0 收藏0
  • 【PHP 擴(kuò)展開發(fā)】Zephir 簡(jiǎn)介

    摘要:什么是是一種中間語言,以接近的語法來編寫代碼,然后轉(zhuǎn)換編譯成擴(kuò)展,旨在簡(jiǎn)化擴(kuò)展的創(chuàng)建和可維護(hù)性。如果成功,會(huì)自動(dòng)生成文件到目錄你需要編輯填加擴(kuò)展測(cè)試一下就這樣,你也會(huì)擴(kuò)展開發(fā)了附附編譯擴(kuò)展的方法 什么是 Zephir Zephir 是一種中間語言,以接近 PHP 的語法來編寫代碼,然后轉(zhuǎn)換編譯成 PHP 擴(kuò)展,旨在簡(jiǎn)化 PHP 擴(kuò)展的創(chuàng)建和可維護(hù)性。利用編譯來提高性能和資源消耗,又不需...

    arashicage 評(píng)論0 收藏0
  • PHP7 擴(kuò)展之自動(dòng)化測(cè)試

    摘要:在安裝及各種擴(kuò)展的過程中,如果你是用源碼安裝,會(huì)注意到在成功之后總會(huì)有一句提示這個(gè)就是運(yùn)行的自動(dòng)化測(cè)試了。本文轉(zhuǎn)自官方博客 在安裝 PHP7 及各種擴(kuò)展的過程中,如果你是用源碼安裝,會(huì)注意到在 make 成功之后總會(huì)有一句提示:Dont forget to run make test. 這個(gè) make test 就是運(yùn)行 PHP 的自動(dòng)化測(cè)試了。 如果你剛剛安裝完 PHP7,直接運(yùn)行 ...

    graf 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

Thanatos

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<