PHP中调用C/C++制作的动态链接库的教程,php动态链接库
PHP中调用C/C++制作的动态链接库的教程,php动态链接库
一般而言,php速度已经比较快,但是,对于一些较高级开发者而言,如果想要追求更快的速度,那毫无疑问可以通过自己写c代码,并编译为动态链接库(常为.so文件),然后php通过创建一个新的扩展(extension),并在扩展里调用该.so文件,同时对外暴露出php函数接口。
在实际使用中,只要调用该函数接口,即可使用底层更快速的c函数服务。
一、动态链接库(shared)
动态链接库的文件名后缀通常是 ".so"。在Windows系统中,其文件名后缀是".dll"。
程序如果是和动态连接库进行链接(link),程序运行时需要能够找到相应的动态链接库文件。
使用动态链接库存编译的程序在运行时要求用户的机器上必需也安装了相应的动态链接库文件,这些库文件需要放置在特定的目录,以让程序能够加载这些库。
虽然这似乎没有使用静态链接库的程序使用方便,但却减少了程序的大小。对于那些会被很多程序使用到的库,使用动态链接的好处就更加明显了。
动态链接库的制作:
gcc -shared -fPIC -o libmylib.so mylib.c ; # 编译成为shared library
选项-fPIC在AMD64上是必须的,其它平台是则不是必要选项。
包含静态链接库到动态链接库中
编译动态链接库时,如果需要链接静态库,并把链接库的内容包含到要编译的动态库中,可以使用选项-Wl,--whole-archive。
例如:
gcc -shared -o libmylib.so -Wl,--whole-archive libmylib.a \ -Wl,--no-whole-archive libother.a
上面的-Wl表示传递给linker(链接器)。
二、调用动态C/C++链接库
下面,本文的开发环境背景是CentOS release 6.5 。为了能够调用c库,我们的php 5.6.9,apache 2.4均是下载源码并编译的,不可直接通过yum安装!请注意。至于php和apache的源码编译本文不提,只要注意在configure打开合适开关即可。
具体步骤如下:
将共享库.so添加入系统配置中(假设共享库名为 'libhello.so')
cp libhello.so /usr/local/lib echo /usr/local/lib > /etc/ld.so.conf.d/local.conf /sbin/ldconfig
在php/ext目录下创建扩展头文件,取名为myfunctions.def
在该文件里填写c函数声明即可。每个函数一行。
string hello(int a) int hello_add(int a, int b)
使用ext_skel搭建扩展骨架
./ext_skel --extname=myfunctions --proto=myfunctions.def
打开config.m4 中的enable开关
PHP_ARG_ENABLE(myfunctions, whether to enable myfunctions support, [ --enable-myfunctions Include myfunctions support])
上面把扩展骨架建立好了,下面重新配置php (下面是我个人配置文件,读者需要结合自己情况修改)
./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' // 配置
记住!一定在末尾加上 —enable-myfunctions 。这样子才会被编译进php中。
当扩展编译进去了之后,就可以开始修改扩展里的myfunctions.c文件,在里面可以添加php->c的转接函数,在转接函数里可以调用.so内的函数。
比如要添加一个hello_add的php函数,里面可以调用c函数add(int a, int b)
a. 添加函数声明
PHP_FE(hello_add, NULL)
b. 添加php函数
PHP_FUNCTION(hello_add){ ... }
注意,在该函数里,如果调用了.so文件里的接口函数,那么待会在make的时候,要指定所使用的.so共享库,该共享库必须完成第1步中添加到系统配置的操作。
如果调用了.so文件,那么要在php/Makefile中添加
Extra_LDFLAG = -lhello //对应前面的libhello.so Extra_libs = -lhello (make clean)
每次修改完上面的c文件,都要重新make
make make install
重启apache服务器
httpd -k restart
在phpinfo里可以看到新扩展,可以直接在php调用新扩展内的函数。
您可能感兴趣的文章:
- php调用c++的方法
- 用C/C++扩展你的PHP 为你的php增加功能
- windows服务器下IIS6/7下PHP 无法加载 php_curl.dll 等动态链接库

Hot AI Tools

Undress AI Tool
Undress images for free

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

PHPisstillrelevantinmodernenterpriseenvironments.1.ModernPHP(7.xand8.x)offersperformancegains,stricttyping,JITcompilation,andmodernsyntax,makingitsuitableforlarge-scaleapplications.2.PHPintegrateseffectivelyinhybridarchitectures,servingasanAPIgateway

Avoid N 1 query problems, reduce the number of database queries by loading associated data in advance; 2. Select only the required fields to avoid loading complete entities to save memory and bandwidth; 3. Use cache strategies reasonably, such as Doctrine's secondary cache or Redis cache high-frequency query results; 4. Optimize the entity life cycle and call clear() regularly to free up memory to prevent memory overflow; 5. Ensure that the database index exists and analyze the generated SQL statements to avoid inefficient queries; 6. Disable automatic change tracking in scenarios where changes are not required, and use arrays or lightweight modes to improve performance. Correct use of ORM requires combining SQL monitoring, caching, batch processing and appropriate optimization to ensure application performance while maintaining development efficiency.

To build a flexible PHP microservice, you need to use RabbitMQ to achieve asynchronous communication, 1. Decouple the service through message queues to avoid cascade failures; 2. Configure persistent queues, persistent messages, release confirmation and manual ACK to ensure reliability; 3. Use exponential backoff retry, TTL and dead letter queue security processing failures; 4. Use tools such as supervisord to protect consumer processes and enable heartbeat mechanisms to ensure service health; and ultimately realize the ability of the system to continuously operate in failures.

Use subprocess.run() to safely execute shell commands and capture output. It is recommended to pass parameters in lists to avoid injection risks; 2. When shell characteristics are required, you can set shell=True, but beware of command injection; 3. Use subprocess.Popen to realize real-time output processing; 4. Set check=True to throw exceptions when the command fails; 5. You can directly call chains to obtain output in a simple scenario; you should give priority to subprocess.run() in daily life to avoid using os.system() or deprecated modules. The above methods override the core usage of executing shell commands in Python.

ReadonlypropertiesinPHP8.2canonlybeassignedonceintheconstructororatdeclarationandcannotbemodifiedafterward,enforcingimmutabilityatthelanguagelevel.2.Toachievedeepimmutability,wrapmutabletypeslikearraysinArrayObjectorusecustomimmutablecollectionssucha

Using the correct PHP basic image and configuring a secure, performance-optimized Docker environment is the key to achieving production ready. 1. Select php:8.3-fpm-alpine as the basic image to reduce the attack surface and improve performance; 2. Disable dangerous functions through custom php.ini, turn off error display, and enable Opcache and JIT to enhance security and performance; 3. Use Nginx as the reverse proxy to restrict access to sensitive files and correctly forward PHP requests to PHP-FPM; 4. Use multi-stage optimization images to remove development dependencies, and set up non-root users to run containers; 5. Optional Supervisord to manage multiple processes such as cron; 6. Verify that no sensitive information leakage before deployment

The settings.json file is located in the user-level or workspace-level path and is used to customize VSCode settings. 1. User-level path: Windows is C:\Users\\AppData\Roaming\Code\User\settings.json, macOS is /Users//Library/ApplicationSupport/Code/User/settings.json, Linux is /home//.config/Code/User/settings.json; 2. Workspace-level path: .vscode/settings in the project root directory

Bref enables PHP developers to build scalable, cost-effective applications without managing servers. 1.Bref brings PHP to AWSLambda by providing an optimized PHP runtime layer, supports PHP8.3 and other versions, and seamlessly integrates with frameworks such as Laravel and Symfony; 2. The deployment steps include: installing Bref using Composer, configuring serverless.yml to define functions and events, such as HTTP endpoints and Artisan commands; 3. Execute serverlessdeploy command to complete the deployment, automatically configure APIGateway and generate access URLs; 4. For Lambda restrictions, Bref provides solutions.
