Generally speaking, php is already faster, but for some more advanced development For readers, if you want to pursue faster speed, there is no doubt that you can write C code yourself and compile it into a dynamic link library (often a .so file), and then PHP creates a new extension (extension). And call the .so file in the extension, and expose the php function interface to the outside world.
In actual use, as long as the function interface is called, the underlying faster C function service can be used.
1. Dynamic link library (shared)
The file name suffix of dynamic link library is usually ".so". In Windows systems, the file name suffix is ".dll".
If the program is linked with a dynamic link library, the corresponding dynamic link library file needs to be found when the program is running.
Programs compiled using dynamic link libraries require that corresponding dynamic link library files must be installed on the user's machine when running. These library files need to be placed in specific directories to allow the program to load these libraries.
Although this does not seem to be as convenient as using a program using a static link library, it does reduce the size of the program. For libraries that will be used by many programs, the benefits of using dynamic linking are even more obvious.
Production of dynamic link library:
gcc -shared -fPIC -o libmylib.so mylib.c ; # 编译成为shared library
The option -fPIC is required on AMD64, but not required on other platforms.
Include static link library into dynamic link library
When compiling a dynamic link library, if you need to link a static library and include the contents of the link library into the dynamic library to be compiled, you can use the option -Wl, --whole-archive.
For example:
gcc -shared -o libmylib.so -Wl,--whole-archive libmylib.a \ -Wl,--no-whole-archive libother.a
The -Wl above means passed to the linker.
2. Call the dynamic C/C link library
Below, the development environment background of this article is CentOS release 6.5. In order to be able to call the c library, our php 5.6.9 and apache 2.4 are downloaded and compiled from source code, and cannot be installed directly through yum! Please note. As for the source code compilation of php and apache, this article will not mention it. Just pay attention to turning on the appropriate switches in configure.
The specific steps are as follows:
Add the shared library.so to the system configuration (assuming the shared library is named 'libhello.so')
cp libhello.so /usr/local/lib echo /usr/local/lib > /etc/ld.so.conf.d/local.conf /sbin/ldconfig
Create an extension header file in the php/ext directory and name it myfunctions.def
Just fill in the c function declaration in this file. One line per function.
string hello(int a) int hello_add(int a, int b)
Use ext_skel to build an extended skeleton
./ext_skel --extname=myfunctions --proto=myfunctions.def
Turn on the enable switch in config.m4
PHP_ARG_ENABLE(myfunctions, whether to enable myfunctions support, [ --enable-myfunctions Include myfunctions support])
The extension skeleton has been established above, and php is reconfigured below (the following is my personal configuration file, readers need to modify it based on their own circumstances)
./buildconf --force //生成新配置脚本 './configure' '--prefix=/usr/local/php' '--with-libdir=lib64' '--enable-fpm' '--with-fpm-user=php-fpm' '--with-fpm-group=www--enable-mysqlnd' '--with-mysql=mysqlnd' '--with-mysqli=mysqlnd' '--with-pdo-mysql=mysqlnd' '--enable-opcache' '--enable-pcntl' '--enable-mbstring' '--enable-soap' '--enable-zip' '--enable-calendar' '--enable-bcmath' '--enable-exif' '--enable-ftp' '--enable-intl' '--with-openssl' '--with-zlib' '--with-curl' '--with-gd' '--with-zlib-dir=/usr/lib' '--with-png-dir=/usr/lib' '--with-jpeg-dir=/usr/lib' '--with-gettext' '--with-mhash' '--with-ldap' '--disable-fileinfo' '--with-config-file-path=/usr/local/php/etc' '--with-apxs2=/usr/local/httpd/bin/apxs' '--enable-myfunctions' // 配置
Remember! Be sure to add —enable-myfunctions at the end. Only in this way will it be compiled into php.
After the extension is compiled, you can start to modify the myfunctions.c file in the extension. You can add the php->c transfer function in it, and you can call functions in .so in the transfer function.
For example, if you want to add a hello_add php function, you can call the c function add(int a, int b)
a. Add function declaration
PHP_FE(hello_add, NULL)
b. Add php function
PHP_FUNCTION(hello_add){ ... }
Note that in this function, if the interface function in the .so file is called, then when making, you must specify the .so shared library used. The shared library must be added to the .so file in step 1. System configuration operations.
If a .so file is called, add
to php/Makefile
Extra_LDFLAG = -lhello //对应前面的libhello.so Extra_libs = -lhello (make clean)
Every time you modify the c file above, you must make again
make make install
Restart apache server
httpd -k restart
You can see the new extension in phpinfo, and you can directly call the functions in the new extension in php.