当前位置:必发365电子游戏 > 编程 > 这种需求最有可能在PHP发行包里找到,命令行参数传递给PHP解释器要执行的脚本
这种需求最有可能在PHP发行包里找到,命令行参数传递给PHP解释器要执行的脚本
2019-12-19

整个的带头: SAPI接口

SAPI(Server Application Programming Interface卡塔尔指的是PHP具体选择的编制程序接口, 就如PC同样,无论安装哪些操作系统,只要满意了PC的接口标准都足以在PC上健康运作, PHP脚本要举办有很五种方法,通过Web服务器,恐怕直接在指令行下,也得以停放在别的程序中。

习认为常,我们利用Apache或然Nginx那类Web服务器来测量检验PHP脚本,或许在指令行下通过PHP解释器程序来实行。 脚本实施完后,Web服务器应答,浏览器突显应答消息,可能在命令行标准输出上展现内容。

咱俩非常少关切PHP解释器在哪个地方。即使通过Web服务器和下令行程序履行脚本看起来十分不一样等, 实际上它们的劳作流程是如出大器晚成辙的。命令行参数字传送递给PHP解释器要施行的本子, 约等于经过url央求多少个PHP页面。脚本实践到位后归来响应结果,只不过命令行的响应结果是展示在顶峰上。

剧本推行的起头都是以SAPI接口达成伊始的。只是不一样的SAPI接口达成会做到他们一定的干活, 举例Apache的mod_php SAPI完结要求初叶化从Apache获取的部分新闻,在出口内容是将内容再次来到给Apache, 别的的SAPI实现也临近。

上面多少个小节将对有些见惯司空的SAPI完结实行更为深入的牵线。

发端看PHP内核也可能有大器晚成段时间了,今后起始边学边总计,前几天就计算一下如何创设本人的PHP扩张。

早先和了结

PHP起头实施今后会透过多个关键的等第:管理供给以前的启幕阶段和伸手之后的终结阶段。 初叶阶段有七个进度:第二个经过是模块开端化阶段(MINIT), 在方方面面SAPI生命周期内(比方Apache运转今后的总体生命周期内依旧命令路程序整个实行进度中卡塔尔国, 该进程只实行叁遍。第贰个经过是模块激活阶段(陆风X8INIT),该进程产生在伸手阶段, 举例通过url央求有些页面,则在每便央浼早先都会进行模块激活(大切诺基INIT央求此前)。 比如PHP注册了有的扩展模块,则在MINIT阶段会回调抱有模块的MINIT函数。 模块在此个阶段能够拓宽一些起先化专门的学问,比方登记常量,定义模块使用的类等等。 模块在贯彻时得以透过如下宏来完毕那一个回调函数:

PHP_MINIT_FUNCTION(myphpextension)
{
    // 注册常量或者类等初始化操作
    return SUCCESS; 
}

恳请达到未来PHP开端化施行脚本的大旨条件,比方创造三个实行情形,包含保存PHP运转过程中变量名称和值内容的符号表, 以致当前具备的函数以致类等音信的符号表。然后PHP会调用全部模块的LX570INIT函数, 在此个品级依次模块也能够施行一些互为表里的操作,模块的宝马X5INIT函数和MINIT回调函数相同:

PHP_RINIT_FUNCTION(myphpextension)
{
    // 例如记录请求开始时间
    // 随后在请求结束的时候记录结束时间。这样我们就能够记录下处理请求所花费的时间了
    return SUCCESS; 
}

乞求管理完后就进来了命赴黄泉阶段,常常脚本实践到最后也许通过调用exit(卡塔尔国或die(卡塔尔(قطر‎函数, PHP都将跻身收尾阶段。和开始阶段对应,结束阶段也分为七个环节,三个在伏乞截至后停用模块(PAJEROSHUTDOWN,对应EvoqueINIT卡塔尔(قطر‎, 一个在SAPI生命周期停止(Web服务器退出或许命令行脚本实践实现退出)时关闭模块(MSHUTDOWN,对应MINIT卡塔尔。

PHP_RSHUTDOWN_FUNCTION(myphpextension)
{
    // 例如记录请求结束时间,并把相应的信息写入到日至文件中。
    return SUCCESS; 
}

本身的条件如下:

单进度SAPI生命周期

CLI/CGI情势的PHP属于单进度的SAPI情势。那类的伸手在管理二遍倡议后就关闭。也便是只会透过如下多少个环节: 开首 - 央求开端 - 恳求关闭 - 甘休SAPI接口完结就果熟蒂落了其生命周期。如下图所示:

 必发365电子游戏 1

单进度SAPI生命周期

 

如上的图是特别简单,也很好精通。只是在相继阶段之间PHP还做了庞大的办事。这里做一些补充:

启动

在调用各个模块的模块伊始化前,会有二个初叶化的进程,它包蕴:

这边的早先化全局变量大多数景观下是将其安装为NULL,有豆蔻梢头部分除了,譬喻设置zuf(zend_utility_functions), 以zuf.printf_function = php_printf为例,这里的php_printf在zend_startup函数中会被赋值给zend_printf作为全局函数指针使用, 而zend_printf函数经常会作为常规字符串输出使用,比如呈现程序调用栈的debug_print_backtrace便是行使它打字与印刷相关音讯。

这里的常量是PHP自个儿的有的常量,那个常量要么是硬编码在前后相继中,举例PHP_VETiguanSION,要么是写在布署头文件中, 举个例子PEA福睿斯_EXTENSION_DI凯雷德,这一个是写在config.w32.h文件中。

前段时间提到的zend_startup函数的功能便是早先化Zend引擎,这里的发轫化操作包蕴内部存款和储蓄器管理伊始化、 全局使用的函数指针初叶化(如前方所说的zend_printf等),对PHP源文件进行词法剖析、语法深入分析、 中间代码实行的函数指针的赋值,开头化若干HashTable(比方函数表,常量表等等),为ini文件解析做计划, 为PHP源文件解析做绸缪,注册内置函数(如strlen、define等),注册标准常量(如E_ALL、TRUE、NULL等)、注册GLOBALS全局变量等。

php_init_config函数的效用是读取php.ini文件,设置配置参数,加载zend扩大并注册PHP扩充函数。此函数分为如下几步: 开首化参数配置表,调用当前方式下的ini初叶化配置,比方CLI情势下,会做如下初叶化:

INI_DEFAULT("report_zend_debug", "0");
INI_DEFAULT("display_errors", "1");

但是在其余情势下却从未这么的开首化操作。接下来会的各类操作都是探求ini文件:

  1. 认清是还是不是有php_ini_path_override,在CLI方式下能够透过-c参数钦命此路线(在php的下令参数中-c表示在钦命的门路中寻觅ini文件)。
  2. 倘使未有php_ini_path_override,判断php_ini_ignore是还是不是为非空(忽视php.ini配置,这里也就CLI形式下有用,使用-n参数)。
  3. 若是不忽略ini配置,则开首拍卖php_ini_search_path(查找ini文件的不二秘技),这个路子不外乎CWD(当前路径,但是这种不适用CLI方式卡塔尔、 实施脚本所在目录、景况变量PATH和PHPRC和布局文件中的PHP_CONFIG_FILE_PATH的值。
  4. 在备选完查找渠道后,PHP会剖断现在的ini路线(php_ini_file_name)是或不是为文件和是不是可张开。 要是这里ini路线是文本同一时间可张开,则会动用此文件, 也便是CLI形式下通过-c参数内定的ini文件的预先级是最高的, 其次是PHPRC钦定的文件,第三是在物色路线中查找php-%sapi-module-name%.ini文件(如CLI方式下相应是搜索php-cli.ini文件), 最终才是寻找路线中检索php.ini文件。

php_startup_auto_globals函数会早先化在客商空间所利用频率异常高的有的全局变量,如:$_GET、$_POST、$_FILES等。 这里只是开首化,所调用的zend_register_auto_global函数也只是将这一个变量名增多到CG(auto_globals卡塔尔(قطر‎这么些变量表。

php_startup_sapi_content_types函数用来开端化SAPI对于分歧档案的次序内容的管理函数, 这里的管理函数包含POST数据暗中同意管理函数、私下认可数据管理函数等。

php_register_internal_extensions_func函数用来注册静态创设的模块,也便是暗许加载的模块, 大家得以将其感觉内置模块。在PHP5.3.0版本中贮存的模块包含PHP规范扩充模块(/ext/standard/目录, 这里是大家用的最频仍的函数,举例字符串函数,数学函数,数组操作函数等等),日历扩展模块、FTP扩充模块、 session扩大模块等。这么些内置模块并不是金城汤池的,在分化的PHP模板中,由于区别时间的急需或任何影响因素会导致这几个私下认可加载的模块会转换, 譬喻从代码中大家就足以见到mysql、xml等扩展模块曾经或未来会作为内置模块出现。

模块开头化会施行五个操作: 1. 将那一个模块注册到已注册模块列表(module_registry),若是注册的模块已经登记过了,PHP会报Module XXX already loaded的失实。 1. 将每一个模块中蕴藏的函数注册到函数表( CG(function_table卡塔尔(قطر‎ ),借使函数不可能增多,则会报 Unable to register functions, unable to load。

在登记了静态营造的模块后,PHP会注册附加的模块,不相同的方式下得以加载差别的模块集,举例在CLI情势下是一直不那么些附加的模块的。

在放置模块和叠合模块后,接下去是注册通过分享对象(比方DLL)和php.ini文件灵活配置的恢弘。

在具有的模块都登记后,PHP会立即试行模块开端化操作(zend_startup_modules)。 它的全体进程正是种种遍历每一种模块,调用每一种模块的模块开始化函数, 也即是在本小节前面所说的用宏PHP_MINIT_必发365电子游戏,FUNCTION满含的内容。

php_disable_functions函数用来剥夺PHP的生机勃勃对函数。那个被剥夺的函数来自PHP的配置文件的disable_functions变量。 其剥夺的长河是调用zend_disable_function函数将钦赐的函数名从CG(function_table卡塔尔国函数表中删去。

php_disable_classes函数用来剥夺PHP的局地类。那些被剥夺的类来自PHP的配备文件的disable_classes变量。 其剥夺的进度是调用zend_disable_class函数将内定的类名从CG(class_table卡塔尔(قطر‎类表中剔除。

ACTIVATION

在管理了文本有关的从头到尾的经过,PHP会调用php_request_startup做要求伊始化操作。 央求开首化操作,除了图中突显的调用每一个模块的伸手早先化函数外,还做了相当多的其他专门的工作,其主要内容如下:

gc_reset函数用来重新初始化垃圾采撷体制,当然那是在PHP5.3之后才有的。

init_compiler函数用来起初化编写翻译器,例如将编写翻译进度中在放opcode的数组清空,筹算编写翻译时用来的数据布局等等。

init_executor函数用来伊始化中间代码施行进程。 在编写翻译进程中,函数列表、类列表等都贮存在编译时的全局变量中, 在希图进行进度时,会将那么些列表赋值给推行的全局变量中,如:EG(function_table) = CG(function_table卡塔尔; 中间代码推行是在PHP的实行设想栈中,起头化时那个栈等都会一齐被早先化。 除了栈,还大概有寄存变量的符号表(EG(symbol_table卡塔尔(英语:State of Qatar)卡塔尔会被开始化为四十八个因素的hashtable,寄放对象的EG(objects_store卡塔尔(قطر‎被开头化了10二十五个成分。 PHP的施行意况除了下边包车型客车有些变量外,还应该有错误管理,至极管理等等,这一个都以在那间被初步化的。 通过php.ini配置的zend_extensions也是在那间被遍历调用activate函数。

sapi_activate函数用来开头化SG(sapi_headers)和SG(request_info卡塔尔(英语:State of Qatar),并且针对HTTP须要的办法设置有个别剧情, 举例当倡议方法为HEAD时,设置SG(request_info).headers_only=1; 此函数最要紧的二个操作是拍卖央求的数目,其最终都会调用sapi_module.default_post_reader。 而sapi_module.default_post_reader在头里的模块开头化是透过php_startup_sapi_content_types函数注册了 暗许管理函数为main/php_content_types.c文件中php_default_post_reader函数。 此函数会将POST的原有数据写入$HTTP_RAW_POST_DATA变量。

在管理了post数据后,PHP会通过sapi_module.read_cookies读取cookie的值, 在CLI形式下,此函数的兑现为sapi_cli_read_cookies,而在函数体中却唯有一个return NULL;

倘诺当前格局下有设置activate函数,则运行此函数,激活SAPI,在CLI情势下此函数指针棉被服装置为NULL。

此地的条件最初化是指在客户空间中必要利用的部分碰着变量开端化,这里的情况包括服务器遭逢、要求数据意况等。 实际到大家用到的变量,正是$_POST、$_GET、$_COOKIE、$_SERVER、$_ENV、$_FILES。 和sapi_module.default_post_reader一样,sapi_module.treat_data的值也是在模块最初化时, 通过php_startup_sapi_content_types函数注册了暗许数据管理函数为main/php_variables.c文件中php_default_treat_data函数。

以$_COOKIE为例,php_default_treat_data函数会对基于分隔符,将拥有的cookie拆分并赋值给相应的变量。

PHP通过zend_activate_modules函数完成模块的央浼最先化,也便是大家在图中见到Call each extension's RubiconINIT。 此函数通过遍历注册在module_registry变量中的全数模块,调用其RubiconINIT方法落成模块的央浼开端化操作。

运行

php_execute_script函数包括了运营PHP脚本的上上下下进度。

当叁个PHP文件供给分析实践时,它大概会必要进行多少个文件,在那之中囊括多个放置实施文书、当前亟需奉行的主文件和贰个前置履行文书。 非当前的八个文件能够在php.ini文件通过auto_prepend_file参数和auto_append_file参数设置。 假使将那多少个参数设置为空,则禁止使用对应的进行理文件书。

对于需求分析施行的文本,通过zend_compile_file(compile_file函数)做词法深入分析、语法分析和中间代码生成操作,重返此文件的持有中间代码。 如若言之有序的文件有生成有效的中间代码,则调用zend_execute(execute函数)实施中间代码。 如果在实行进度中现身相当并且客户有定义对这几个特别的拍卖,则调用那些特别管理函数。 在有着的操作都管理完后,PHP通过EG(return_value_ptr_ptr卡塔尔(قطر‎重返结果。

DEACTIVATION

PHP关闭央求的进程是四个多少个闭馆操作的会晤,那些集结存在于php_request_shutdown函数中。 那几个集结富含如下内容:

  1. 调用全数通过register_shutdown_function(卡塔尔注册的函数。那几个在关闭时调用的函数是在客商空间增加进去的。 四个简单易行的例证,大家得以在剧本出错开上下班时间调用三个合併的函数,给客商叁个和谐一些的页面,那么些略带肖似于网页中的404页面。
  2. 实行全体可用的__destruct函数。 这里的析构函数富含在对象池(EG(objects_store)中的全数目的的析构函数以至EG(symbol_table卡塔尔(قطر‎中各样要素的析构方法。
  3. 将装有的输出刷出来。
  4. 发送HTTP应答头。那也是二个输出字符串的进程,只是这些字符串大概相符有些规范。
  5. 遍历每种模块的关闭诉求方法,执行模块的恳求关闭操作,那正是我们在图中看出的Call each extension's 冠道SHUTDOWN。
  6. 销毁全局变量表(PG(http_globals))的变量。
  7. 通过zend_deactivate函数,关闭词法深入分析器、语法剖判器和中间代码实践器。
  8. 调用每一个扩大的post-本田CR-VSHUTDOWN函数。只是基本每一个增加的post_这种需求最有可能在PHP发行包里找到,命令行参数传递给PHP解释器要执行的脚本。deactivate_func函数指针都以NULL。
  9. 关闭SAPI,通过sapi_deactivate销毁SG(sapi_headers)、SG(request_info卡塔尔等的剧情。
  10. 关闭流的包装器、关闭流的过滤器。
  11. 闭馆内存管理。
  12. 双重设置最大实践时间

结束

最终到了要甘休之处了。

sapi_flush将最终的故事情节刷新出去。其调用的是sapi_module.flush,在CLI形式下等价于fflush函数。

zend_shutdown将关闭Zend引擎。

这儿对应图中的流程,大家应有是实施各种模块的倒闭模块操作。 在此唯有一个zend_hash_graceful_reverse_destroy函数将module_registry销毁了。 当然,它最后也是调用了关门模块的点子的,其来源于在于在初始化module_registry时就安装了那几个hash表析构时调用ZEND_MODULE_DTOR宏。 而ZEND_MODULE_DTO讴歌ZDX宏对应的是module_destructor函数。 在那函数中会调用模块的module_shutdown_func方法,即PHP_RSHUTDOWN_FUNCTION宏产生的老大函数。

在关门全数的模块后,PHP继续销毁全局函数表,销毁全局类表、发卖全局变量表等。 通过zend_shutdown_extensions遍历zend_extensions全数因素,调用每一种扩张的shutdown函数。

系统:Ubuntu 14.04

多进度SAPI生命周期

平时PHP是编写翻译为apache的多少个模块来拍卖PHP乞请。Apache平日会接纳多进度格局, Apache运维后会fork出三个子进度,种种进程的内部存款和储蓄器空间独立,每种子进程都会经太早先和终止环节, 可是各样进程的启幕阶段只在进度fork出来的话后张开,在一切经过的生命周期内只怕会管理四个央浼。 唯有在Apache关闭恐怕经过被终止之后才会进展关闭阶段,在那七个等第之间会趁机每一个乞求重复乞请带头-央求关闭的环节。 如下图所示:

 必发365电子游戏 2

多进度SAPI生命周期

 

php版本:5.5.19

十六线程的SAPI生命周期

三十二线程情势和多进度中的有些进度相符,不相同的是在总体进度的生命周期内会并行的重新着 诉求以前-必要关闭的环节

 必发365电子游戏 3

八线程SAPI生命周期

 

摘自:

 

仿效摘录:用C/C++扩大你的PHP

PHP拿到成功的叁个要害原因之一是它有着大批量的可用增加。web开荒者无论有啥种须求,这种须要最有希望在PHP发行李包裹里找到。PHP发行手提包括扶助种种数据库,图形文件格式,压缩,XML技能扩张在内的广大扩充。

扩张API的引进使PHP3获得了惊天动地的扩充,扩大API机制使PHP开辟社区相当轻松的付出出几十种扩张。以往,八个本子过去了,API照旧和PHP3时的特别形似。扩张首要的钻探是:尽只怕的从扩张编写者这里掩瞒PHP的当中机制温州昆曲本引擎自身,仅仅须求开辟者熟识API。

有八个理由必要本身编排PHP扩大。第三个理由是:PHP须求协理大器晚成项她尚未扶持的技术。那日常满含包裹一些现存的C函数库,以便提供PHP接口。比方,假设三个叫FooBase的数据库已推出市镇,你必要建构三个PHP扩大扶植你从PHP里调用FooBase的C函数库。那么些工作大概仅由一人完成,然后被全数PHP社区分享(要是您愿意的话)。第1个不是特别不足为道的理由是:你供给从质量或效果与利益的原由考虑来编排一些生意逻辑。

假诺你正在开荒贰个网址,须要三个把字符串重复n次的函数。上面是用PHP写的事例:

function util_str_repeat($string, $n){
    $result = "";
    for($i = 0; $i < $n; $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 = '';
    /* 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文件,测量检验一下,测量试验文件如下:

<?php
for ($i = 1; $i <= 3; $i++) {
    print util_str_repeat("CraryPrimitiveMan ", $i);
    print "n";
}
?>

实行结果如下:

CraryPrimitiveMan 
CraryPrimitiveMan CraryPrimitiveMan 
CraryPrimitiveMan CraryPrimitiveMan CraryPrimitiveMan

诸如此比大家就打响开创了一个含有轻易的PHP函数的扩大。

盗图一张~~

必发365电子游戏 4

明日就先到此地~~