• PHP拓展开发


    痛定思痛: 开始了解 PHP 拓展开发,下面这篇文章不错!照着文章讲的,终于实现了!

    m.php的代码

    浏览器访问 m.php 文件!(备注:在linux 命令行中 php -r 'cthulhu();'  是错误的)

    但在浏览器访问是可以的!! 

    说明: 测试 成功!!

     这个链接不错: https://www.simonholywell.com/post/2010/09/15-excellent-resources-for-php-extension-development/

    ----------------------------------------------------------------------------------------------

    https://www.kchodorow.com/blog/2011/08/11/php-extensions-made-eldrich-hello-world/

    PHP Extensions Made Eldrich: Hello, World!

    This is part 2 of a 4-part tutorial on writing PHP extensions:

    1. Setting Up PHP – compiling PHP for extension development
    2. Hello, world! – your first extension
    3. Working with the API – the PHP C API
    4. Classes – creating PHP objects in C

    First we need to think of a name for our extension. I’ve been reading some H.P. Lovecraft, so let’s call it “rlyeh”.

    For our first extension, we’ll create a new function, cthulhu(). When we call cthulhu() (tee hee), PHP will print “In his house at R’lyeh dead Cthulhu waits dreaming.”

    Cheat Sheet

    If you don’t want to copy/paste all of the code, you can clone the Github repo for this tutorial and check out sections as you go.

    $ git clone git://github.com/kchodorow/rlyeh.git
    

    This part of the tutorial (Hello, world!) is the master branch. Stating in part 3, each “unit” has a branch: <branchname> at the beginning of the section. You can checkout this branch if you want to see the code example in context.

    For example, if you see branch: oop, you’d do:

    $ git checkout -b oop origin/oop
    

    Then you can compare what you’re doing to the “ideal” example code.

    Setting Up

    Create a directory for your PHP extension, named “rlyeh”. This is where all of the source code for your extension will live.

    $ mkdir rlyeh
    $ cd rlyeh
    

    A PHP extension consists of at least three files:

    1. “config.m4”, which contains compilation instructions for PHP
    2. “php_extname.c”: source code
    3. “php_extname.h”: a header file

    Creating a config.m4 file is wholly lacking in interest, so just cut/paste the one below.

    dnl lines starting with "dnl" are comments
    
    PHP_ARG_ENABLE(rlyeh, whether to enable Rlyeh extension, [  --enable-rlyeh   Enable Rlyeh extension])
    
    if test "$PHP_RLYEH" != "no"; then
    
      dnl this defines the extension
      PHP_NEW_EXTENSION(rlyeh, php_rlyeh.c, $ext_shared)
    
      dnl this is boilerplate to make the extension work on OS X
      case $build_os in
      darwin1*.*.*)
        AC_MSG_CHECKING([whether to compile for recent osx architectures])
        CFLAGS="$CFLAGS -arch i386 -arch x86_64 -mmacosx-version-min=10.5"
        AC_MSG_RESULT([yes])
        ;;
      darwin*)
        AC_MSG_CHECKING([whether to compile for every osx architecture ever])
        CFLAGS="$CFLAGS -arch i386 -arch x86_64 -arch ppc -arch ppc64"
        AC_MSG_RESULT([yes])
        ;;
      esac
    
    fi
    

    If you want to call your extension something else, global replace “rlyeh” with your extension’s name.

    Now for the actual extension: create a file called php_rlyeh.c with the following content:

    // include PHP API
    #include <php.h>
     
    // header file we'll create below
    #include "php_rlyeh.h"
     
    // define the function(s) we want to add
    zend_function_entry rlyeh_functions[] = {
      PHP_FE(cthulhu, NULL)
      { NULL, NULL, NULL }
    };
     
    // "rlyeh_functions" refers to the struct defined above
    // we'll be filling in more of this later: you can use this to specify
    // globals, php.ini info, startup and teardown functions, etc.
    zend_module_entry rlyeh_module_entry = {
      STANDARD_MODULE_HEADER,
      PHP_RLYEH_EXTNAME,
      rlyeh_functions,
      NULL,
      NULL,
      NULL,
      NULL,
      NULL,
      PHP_RLYEH_VERSION,
      STANDARD_MODULE_PROPERTIES
    };
     
    // install module
    ZEND_GET_MODULE(rlyeh)
     
    // actual non-template code!
    PHP_FUNCTION(cthulhu) {
        // php_printf is PHP's version of printf, it's essentially "echo" from C
        php_printf("In his house at R'lyeh dead Cthulhu waits dreaming.
    ");
    }

    That’s a whole lotta template, but it’ll make more sense as you go along.

    Learning PHP extension programming is sort of like learning Java as your first programming language: “type ‘public static void main’.” “Why? What does that even mean?” “It doesn’t matter, you’ll learn about it later.”

    You also have to make a header file, to declare the cthulhu function as well as the two extension info macros used in php_rlyeh.c (PHP_RLYEH_EXTNAME and PHP_RLYEH_VERSION).

    Create a new file, php_rlyeh.h, and add a couple of lines:

     
    #define PHP_RLYEH_EXTNAME "rlyeh"
    #define PHP_RLYEH_VERSION "0.01"
     
    PHP_FUNCTION(cthulhu);

    You can change the version whenever you do a new release. It can be any string. It’s displayed when you do:

    $ php --ri rlyeh
    

    (once the extension is installed).

    Speaking of, now all that’s left is to compile and install. Make sure that your custom-compiled-PHP is first in your PATH. If it isn’t, put it there before doing the rest of the install.

    $ echo $PATH
    $PHPDIR/install-debug-zts/bin:/usr/local/bin:/usr/bin
    $ phpize
    Configuring for:
    PHP Api Version:         20090626
    Zend Module Api No:      20090626
    Zend Extension Api No:   220090626
    $
    $ ./configure
    # lots of checks...
    $
    $ make
    # compile...
    
    Build complete.
    Don't forget to run 'make test'.
    
    $ make install
    $
    Installing shared extensions:     $PHPDIR/install-debug-zts/lib/php/extensions/debug-zts-20090626/
    

    Now, add your extension to your php.ini file. PHP is probably expecting a php.ini file in the lib/ subdirectory of your install directory ($PHPDIR/install-debug-zts/lib/php.ini). It probably doesn’t exist yet, so create a new php.ini file with one line:

    extension=rlyeh.so
    

    Now you should be able to use your function from PHP without importing, loading, or requiring anything. Do:

    $ php -r 'cthulhu();'
    In his house at R'lyeh dead Cthulhu waits dreaming.
    

    Your first PHP extension is working!

    Next up: a deep dive into the PHP API.

  • 相关阅读:
    Fix the Package System is Broken error in Ubuntu
    linux源镜像网站
    VS2010快捷键大全
    自定义函数与存储过程的比较
    vbcr,vblf和 vbcrlf之间的区别?
    GridView序号问题
    Outlook2007设置备份账号、联系人和个性签名的方法
    c#.net4.0利用odac连接oracle取数
    无法打开登录所请求的数据库DbName 。登录失败。 用户 'IIS APPPOOL\DefaultAppPool' 登录失败。 的解决方案
    C#开发和调用Web Service
  • 原文地址:https://www.cnblogs.com/oxspirt/p/6401918.html
Copyright © 2020-2023  润新知