php怎么运营c语言程序,1恢弘开发入门

先是说爱他美(Dumex)下,PHP扩大有三种编译形式:
主意一:在编译PHP时直接将伸张编译进去
方法二:增加被编译成.so文件,在php.ini里配置加载路径;

率先说美素佳儿(Friso)(Meadjohnson)下,PHP增加有三种编译形式:
办法一:在编译PHP时直接将扩张编译进去
艺术二:伸张被编译成.so文件,在php.ini里配置加载路径;

先是步. 生成要求调用的so文件

第1步:

率先从官网下载了PHP源码

 

以下初叶表达创造PHP扩张并编译的步调:
下载PHP源码,并解压,在源码的根目录下初始操作,
1. 使用ext_skel生成增添框架,如下:

以下开始表达创造PHP伸张并编译的步调:
下载PHP源码,并解压,在源码的根目录下开端操作,
1. 使用ext_skel生成增添框架,如下:

1.  首先做3个简易的so文件:

第2步:

解压后得以见见根目录上面的ext文件夹里有ext_skel文件,

这个ext_skel是shell文件,是可以运作的。

cd到ext文件夹后,执行./ext_skel –extname=hello

就足以生成hello文件夹了

 

➜ php-5.6.24 cd ~/Downloads/tmp/php-5.6.24
➜ php-5.6.24 cd ext
➜ ext ./ext_skel --extname=myfirstext
➜ php-5.6.24 cd ~/Downloads/tmp/php-5.6.24
➜ php-5.6.24 cd ext
➜ ext ./ext_skel --extname=myfirstext

/** *php怎么运营c语言程序,1恢弘开发入门。 hello.c

第3步:

cd到hello文件夹里可以看出config.m4文件,打开找到那样的代码

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

把初叶的“dnl ”都去掉,也等于改成那样

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

亚洲必赢手机入口 ,那时你的代码就曾经得以展开phpize、./configure、make
install了,把hello.so文件加到php.ini扩充里就能用了。
您也就足以透过php
hello.php
来拓展测试config.m4文件是还是不是配备不奇怪了。

这3行代码的机能是为了让./configure时,可以调用enable-sample选项的最低要求.
PHP_ARG_ENABLE的第1个参数将在./configure处理进程中,到达那几个增添的安顿文件时显示.
其五个参数将在极限用户执行./configure –help时展现为协理音讯

 

第4步:测试

实际做完前3步扩充就已经成效率用了,
下边简单写三个PHP代码来测试呢。

 

 

* To compile, use following commands:

ext_skel在举行后,会提醒开发者后续的操作步骤,那些操作步骤是增加的二种编译方式里的章程一的步调,
如下:

ext_skel在推行后,会唤起开发者后续的操作步骤,那几个操作步骤是伸张的二种编译格局里的法子一的步骤,
如下:

 *   gcc -O -c -fPIC -o hello.o hello.c

To use your new extension, you will have to execute the following steps:

1.  $ cd ..
2.  $ vi ext/plogger/config.m4
3.  $ ./buildconf
4.  $ ./configure --[with|enable]-plogger
5.  $ make
6.  $ ./sapi/cli/php -f ext/plogger/plogger.php
7.  $ vi ext/plogger/plogger.c
8.  $ make
To use your new extension, you will have to execute the following steps:

1.  $ cd ..
2.  $ vi ext/plogger/config.m4
3.  $ ./buildconf
4.  $ ./configure --[with|enable]-plogger
5.  $ make
6.  $ ./sapi/cli/php -f ext/plogger/plogger.php
7.  $ vi ext/plogger/plogger.c
8.  $ make

  *   gcc -shared -o libhello.so hello.o

2. 修改文件ext/myfirstext/config.m4
重大看line10-18的代码,用于设置./configure时启用此伸张的下令选项,将内部line16和line18的dnl删掉,把dnl驾驭为注释符。

2. 改动文件ext/myfirstext/config.m4
紧要看line10-18的代码,用于设置./configure时启用此增加的指令选项,将其中line16和line18的dnl删掉,把dnl领悟为注释符。

*/

14 dnl Otherwise use enable:
15
16 dnl PHP_ARG_ENABLE(myfirstext, whether to enable myfirstext support,
17 dnl Make sure that the comment is aligned:
18 dnl [ --enable-myfirstext Enable myfirstext support])
19
20 if test "$PHP_MYFIRSTEXT" != "no"; then
21 dnl Write more examples of tests here...
14 dnl Otherwise use enable:
15
16 dnl PHP_ARG_ENABLE(myfirstext, whether to enable myfirstext support,
17 dnl Make sure that the comment is aligned:
18 dnl [ --enable-myfirstext Enable myfirstext support])
19
20 if test "$PHP_MYFIRSTEXT" != "no"; then
21 dnl Write more examples of tests here...

int hello_add(int a, int b)

如上两手续是公家的,以下将各自介绍编译PHP增加的二种格局,
方法一:编译PHP时直接将扩充编译进去
3. 在源码根目录下执行./buildconf,如下
4. 在源码根目录下执行./configure –enable-myfirstext
为了削减编译时间,可以在configure阶段指明不编译有个别模块,比如:

上述两步骤是公共的,以下将独家介绍编译PHP伸张的二种方法,
艺术一:编译PHP时间接将扩展编译进去
3. 在源码根目录下执行./buildconf,如下
4. 在源码根目录下执行./configure –enable-myfirstext
为了减小编译时间,可以在configure阶段指明不编译有个别模块,比如:

{

./configure --without-iconv --enable-debug --enable-myfirstext --disable-cgi --enable-cli --without-pear --disable-xml --without-mysql
./configure --without-iconv --enable-debug --enable-myfirstext --disable-cgi --enable-cli --without-pear --disable-xml --without-mysql

    return a + b;

5. 在源码根目录下执行make
留神编译成功后,别执行make
install了,因为至此,扩充myfirstext已经编译成功,并且一度成形了对应的php二进制文件了,它在./sapi/cli/php

5. 在源码根目录下执行make
专注编译成功后,别执行make
install了,因为至此,扩大myfirstext已经编译成功,并且已经变化了对应的php二进制文件了,它在./sapi/cli/php

}

艺术二:扩大被编译成.so文件,在php.ini里配置加载路径
3. 在增添目录ext/myfirstext/下执行phpize命令
4. 在增添目录ext/myfirstext/下执行./configure
–enable-myfirstext命令

5. 在扩大目录ext/myfirstext/下进行make
实践make后会在ext/myfirstext/modules下转移对应的.so文件,在php.ini中安插好加载此文件即可。

办法二:伸张被编译成.so文件,在php.ini里配置加载路径
3. 在伸张目录ext/myfirstext/下实施phpize命令
4. 在增添目录ext/myfirstext/下执行./configure
–enable-myfirstext命令

5. 在增添目录ext/myfirstext/下执行make
举行make后会在ext/myfirstext/modules下转移对应的.so文件,在php.ini中配置好加载此文件即可。

然后将它编译成.so文件并放置系统中:

校验增添是不是加载成功
执行./sapi/cli/php -f ext/myfirstext/myfirstext.php
或然通过php -m列出全数伸张,查看是或不是有myfirstext,
执行命令:./sapi/cli/php -m | grep myfirstext
通过以团长验,表明增添编译成功了。可是到近年来截止,还尚无编制过c相关的代码,一切都以ext_skel暗许生成的,查看那么些伸张myfirstext包括怎么样函数呢?如下:

校验扩张是不是加载成功
执行./sapi/cli/php -f ext/myfirstext/myfirstext.php
要么经过php -m列出全数增加,查看是不是有myfirstext,
执行命令:./sapi/cli/php -m | grep myfirstext
因而上述校验,表达增添编译成功了。不过到如今截至,还并未编制过c相关的代码,一切都以ext_skel私自认同生成的,查看那一个扩充myfirstext包罗怎么样函数呢?如下:

$ gcc -O -c -fPIC -o hello.o hello.c                      //
-fPIC:是指生成的动态库与岗位非亲非故

➜ php-5.6.24 ./sapi/cli/php -r 'print_r(get_extension_funcs("myfirstext"));'
➜ php-5.6.24 ./sapi/cli/php -r 'print_r(get_extension_funcs("myfirstext"));'

$ gcc -shared -o libhello.so hello.o                     //
-shared:是指明生成动态链接库

OK,
近年来停止熟稔了PHP伸张框架的浮动,配置,和编译。接下来就要往扩大myfirstext里添加3个团结的函数。

OK,
近期截至熟习了PHP增添框架的生成,配置,和编译。接下来就要往伸张myfirstext里添加二个协调的函数。

$ su        // 切换到最佳用户,此时,需求输入密码。

 

 

# cp libhello.so /usr/local/lib      // 把变化的链接库放到钦点的地点

亚洲必赢手机入口 1

亚洲必赢手机入口 2

# echo /usr/local/lib > /etc/ld.so.conf.d/local.conf       // 
把库地址写入到安顿文件中

 

 

# /sbin/ldconfig                // 用此命令,使刚刚写的配备文件生效

  1. 写段小程序来表明其科学:

/**

 * hellotest.c

 * To compile, use following commands:

*   gcc -o hellotest -lhello hellotest.c

*/

#include

int main()

{

    int a = 3, b = 4;

    printf(“%d + %d = %d”, a, b, hello_add(a,b));

    return 0;

}

编译并履行:

$ gcc -o hellotest -lhello hellotest.c                //
编译测试文件,生成测试程序

$ ./hellotest           // 运转测试程序

第①步. 制作PHP模块(外部模块)

请保管您已设置 PHP及APACHE服务器。

$ cd php-5.2.3/ext

  1. 下一场经过上边的通令用ext_skel脚本建立一个名为 hello 的模块:

$ ./ext_skel –extname=hello

2.
执行该命令之后它会唤醒您应当用怎么样命令来编译模块,可惜那是将模块集成到php内部的编译方法。

若是要编译成可动态加载的 php_hello.so,方法要更为不难。

$ cd hello

 首先编辑 config.m4 文本,去掉第叁6行和第②8行的笺注(注释符号为 dnl 。)

16:  PHP_ARG_ENABLE(hello, whether to enable hello support,

17:  dnl Make sure that the comment is aligned:

18:  [  –enable-hello           Enable hello support])

  1. 下一场实施 phpize 程序,生成configure脚本:

$ phpize

 该程序在ubuntu的php5-dev包中

  1. 打开 php_hello.h,在 PHP_FUNCTION(confirm_hello_compiled);
    之下插手函数申明:

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

PHP_FUNCTION(hello_add);

  1. 打开 hello.c,在 PHP_FE(confirm_hello_compiled, NULL)
    下方插足以下内容。

zend_function_entry hello_functions[] = {

    PHP_FE(confirm_hello_compiled,  NULL)       /* For testing,
remove later. */

    PHP_FE(hello_add,   NULL)       /* For testing, remove later. */

    {NULL, NULL, NULL}  /* Must be the last line in
hello_functions[] */};

    然后在 hello.c 的最末尾书写hello_add函数的内容: 

PHP_FUNCTION(hello_add)

{

    long int a, b;

    long int result;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, “ll”, &a,
&b) == FAILURE) {

        return;

    }

    result = hello_add(a, b);

    RETURN_LONG(result);}保存退出,编译并安装:

  1. $ ./configure

$ make LDFLAGS=-lhello

$ sudo make install

Installing shared extensions:     /usr/lib/php5/20060613+lfs/$ su# cp
modules/hello.so/usr/lib/php/modules

luther@gliethttp:~$ sudo vim /etc/php5/apache2/php.ini;

enable_dl = Off;允许dl()动态加载so扩张功效enable_dl = On

luther@gliethttp:~$ sudo service apache2 reload    然后在 /var/www/html
下成立多少个 hello.php 文件,内容如下:

<?php

    dl(“hello.so”);

    echo hello_add(3, 4);

?>

接下来在浏览器中打开hello.php文件,如果彰显7,则证实函数调用成功了。

其三步. 制作PHP模块(内部模块)

其余可以在apache重启的时候让我们的so库直接动态编译进php5,就像linux的insmod
hello.ko模块一样,不用dl加载也不用重新编译php,就足以直接采纳so的函数了,步骤如下:

luther@gliethttp:~$ sudo vim /etc/php5/apache2/php.ini
enable_dl = Off
extension=hello.so
luther@gliethttp:~$ sudo service apache2 restart

不可以reload而必须restart apache,那样so如同insmod
hello.ko一样被融到了php5内核,然后代码就可以忽略掉dl(“hello.so”);了,

[留神,那种艺术只适合hello.so库内有着机能代码已经整整调试ok,若是还地处调试时期,那么须求采取地点的dl强制加载的不二法门]

代码如下:

<?php

    echo hello_add(3, 4);

?>,

     不过该意义不太相符调试,因为每一次修改hello.so中代码的话,都亟需让service
apacherestart重启才能让php5内核再次加载新的hello.so伸张.可以如此定义hello.so的落到实处,那样每一趟执行.php网页,都会在/var/www/下建立2个文书夹,所以php增添完结了

一,搭建php环境
下载php 5.2.6 源码 并解压
编译安装,搭建php环境
二,成立扩张项目
进入源码目录
cd php5.2.6/ext/
./ext_skel –extname=my_ext
创办名字为my_ext的类型,最后会生成my_ext.so
三,更改配置和次序
$ vi ext/my_ext/config.m4
按照你本身的选料将
dnl PHP_ARG_WITH(my_ext, for my_ext support,
dnl Make sure that the comment is aligned:
dnl [ –with-my_ext Include my_ext support])
修改成
PHP_ARG_WITH(my_ext, for my_ext support,
Make sure that the comment is aligned:
[ –with-my_ext Include my_ext support])
或者将
dnl PHP_ARG_ENABLE(my_ext, whether to enable my_ext support,
dnl Make sure that the comment is aligned:
dnl [ –enable-my_ext Enable my_ext support])
修改成
PHP_ARG_ENABLE(my_ext, whether to enable my_ext support,
Make sure that the comment is aligned:
[ –enable-my_ext Enable my_ext support])
$ vi ext/my_ext/php_my_ext.h

PHP_FUNCTION(confirm_my_ext_compiled); /* For testing, remove
later. */
更改为
PHP_FUNCTION(say_hello);
$ vi ext/my_ext/my_ext.c

zend_function_entry php5cpp_functions[] = {
PHP_FE(confirm_my_ext_compiled, NULL) /* For testing, remove later.
*/
{NULL, NULL, NULL} /* Must be the last line in php5cpp_functions[]
*/
};
更改为
zend_function_entry php5cpp_functions[] = {
PHP_FE(say_hello, NULL)
{NULL, NULL, NULL} /* Must be the last line in php5cpp_functions[]
*/
};
在终极添加:
PHP_FUNCTION(say_hello)
{
zend_printf(“hello world\n”);
}
四,编译
$ cd my_ext
$ /usr/local/php/bin/phpize
ps: 如若出现:Cannot find
autoconf.……的错误新闻,则须求设置 autoconf (安装进程略)
$ ./configure –with-php-config=/usr/local/php/bin/php-config
$ make
那时候会编译出 my_ext/modules/my_ext.so
五,配置php.ini
将my_ext.so放入/usr/local/php/ext/目录
$ vi php.ini

修改添加如下:
extension_dir = ‘/usr/local/php/ext/’
extension=my_ext.so
六,测试
$ vi test.php
<?php
say_hello();
?>
$ /usr/local/php/bin/php test.php
hello world.
则水到渠成

上面小编来讲讲什么作3个php的增加
第②要有二个搭建好的php环境
自家把php的装置在了/usr/local/php当然也透过
php的多个配备php.ini的路线不过要注意了
用那种措施安装的php增添不可能完毕
我们在php安装以后的/usr/local/php/bin目录
找到那个文件phpize稍后咱们将用到她
她就是个shell脚本你可以用vi phpize来查看他的内容
但是你要留心了那几个剧本不是在哪里都得以选取的
[root@ns root]# phpize
Cannot find config.m4.
Make sure that you run ‘/usr/local/bin/phpize’ in the top level source
directory of the module

[root@ns root]# phpize
Cannot find config.m4.
Make sure that you run ‘/usr/local/bin/phpize’ in the top level source
directory of the module
您会看出那两种结果其实你查看了这几个本子
很自在的就会意识是怎么来拍卖的
你的模扩充的时候最好
放在/usr/local/src/php-4.3.5/ext下
来举行他你在那边也得以如此/usr/local/php/bin/phpize来执行也足以
phpize来执行

小编们在/usr/local/src/php-4.3.5/ext下找到那一个工具
来树立三个php扩充的一个框架
[root@ns ext]#cd /usr/local/src/php-4.3.5/ext/
[root@ns ext]# ./ext_skel –extname=jinzhesheng_module
Creating directory jinzhesheng_module
Creating basic files: config.m4 .cvsignore
jinzhesheng_module.cphp_jinzhesheng_module.h CREDITS EXPERIMENTAL
tests/001.phptjinzhesheng_module.php [done].

To use your new extension, you will have to execute the following steps:

1.  $ cd ..
2.  $ vi ext/jinzhesheng_module/config.m4
3.  $ ./buildconf
4.  $ ./configure –[with|enable]-jinzhesheng_module
5.  $ make
6.  $ ./php -f ext/jinzhesheng_module/jinzhesheng_module.php
7.  $ vi ext/jinzhesheng_module/jinzhesheng_module.c
8.  $ make
实施了那些手续之后你会看到这么的结果
Repeat steps 3-6 until you are satisfied with
ext/jinzhesheng_module/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.
这么之后大家会在这几个目录下生成二个索引叫jinzhesheng_module
进去那之中大家看看
[root@ns ext]# cd jinzhesheng_module/
[root@ns jinzhesheng_module]# ls
config.m4  EXPERIMENTAL          jinzhesheng_module.php    tests
CREDITS    jinzhesheng_module.c  php_jinzhesheng_module.h

下一场我们要修改文件相继是
configue.m4
jinzhesheng_module.c
php_jinzhesheng_module.h

选取文本编辑器打开config.m4文件,文件内容大体如下:

dnl $Id$d

dnl config.m4 for extension my_module

dnl don’t forget to callPHP_EXTENSION(my_module)

dnl Comments in this file start with the string ‘dnl’.

dnl Remove where necessary. This file will not work

dnl without editing.

dnl If your extension references something external, use with:

dnl PHP_ARG_WITH(my_module, for my_module support,

dnl Make sure that the comment is aligned:

dnl [  –with-my_module             Include my_module support])

dnl Otherwise use enable:

dnl PHP_ARG_ENABLE(my_module, whether to enable my_module support,

dnl Make sure that the comment is aligned:

dnl [  –enable-my_module           Enable my_module support])

if test “$PHP_MY_MODULE” != “no”; then

  dnl If you will not be testing anything external, like existence of

  dnl headers, libraries or functions in them, just uncomment the

  dnl following line and you are ready to go.

  dnl Write more examples of tests here…

  PHP_EXTENSION(my_module, $ext_shared)

Fi

据悉你协调的拔取将

dnl PHP_ARG_WITH(my_module, for my_module support,

dnl Make sure that the comment is aligned:

dnl [  –with-my_module             Include my_module support])

修改成

PHP_ARG_WITH(my_module, for my_module support,

Make sure that the comment is aligned:

[  –with-my_module             Include my_module support])

或者将

dnl PHP_ARG_ENABLE(my_module, whether to enable my_module support,

dnl Make sure that the comment is aligned:

dnl [  –enable-my_module           Enable my_module support])

修改成

PHP_ARG_ENABLE(my_module, whether to enable my_module support,

Make sure that the comment is aligned:

[  –enable-my_module           Enable my_module support])
本人那里用了后者
下一场保留退出
然后在编制
Vi my_module.c
将文件之中的下列代码进行修改

/* Every user visible function must have an entry in
my_module_functions[].

*/

function_entry my_module_functions[] = {

        PHP_FE(say_hello,       NULL)  /* ?添加着一溜儿代码 */

        PHP_FE(confirm_my_module_compiled,      NULL) /* For
testing, remove later. */

        {NULL, NULL, NULL}      /* Must be the last line in
my_module_functions[] */

};

在文件的最后添加下列代码

PHP_FUNCTION(say_hello)

{

        zend_printf(“hello world\n”);

}

封存文件退出

下一场大家就足以在这一个目录下利用方面的授命了
/usr/local/php/bin/phpize
实践将来会看出上面的
[root@ns jinzhesheng_module]# /usr/local/php/bin/phpize
Configuring for:
PHP Api Version:         20020918
Zend Module Api No:      20020429
Zend Extension Api No:   20050606
[root@ns jinzhesheng_module]#
下一场执行./configure –enable-jinzhesheng_module
–with-apxs=/usr/local/apache/bin/apxs
–with-php-config=/usr/local/php/bin/php-config
我们在设置未来的php的bin目录下的可以找到那个文件的
php-config 和phpize
这一步骤一定要注意你的apache的apxs放在何地了
下一场实施make
您会看到出现错误了你再一次定义了函数大家日前的
其一你在回头改一下那一个文件把原先的函数删除掉在变化的文件之中会有相同的函数
您在加盟你的代码
就足以经过了
本条时候会在如今的目录下生成3个索引叫modules他的上边就放着你要的
jinzhesheng_module.so文件
cp modules/jinzhesheng_module.so /usr/local/php/ext/
此间要求您先安装你的php的恢弘目录的在
在php.ini里面
通过extension_dir
末尾一不是你在php.ini文件中打开这些扩张
extension=jinzhesheng_module.so
然后
重新起动apache
用phpinfo来察看一下ok了

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图