


Artikel yang menerangkan secara terperinci cara membangunkan sambungan PHP dalam Rust (versi Liunx)
Seperti yang kita semua tahu, sebagai phper, saya malu dengan fungsi php yang terhad, seperti memanggil alat pemprosesan video ffmpeg. Tiada sambungan khas untuk mengendalikannya, apa? Menggunakan panggilan fungsi sistem php? Untuk skrip php sumber terbuka, ini terlalu tidak selamat!
Pada masa ini, sebagai phper kanan, anda akan mempertimbangkan untuk membangunkan sambungan php dan melaksanakan operasi ffmpeg dalam sambungan.
Pada masa ini, hampir tiada artikel tentang cara membangunkan sambungan PHP di Rust di tapak c. Malah artikel mengenai proses membangunkan sambungan PHP sangat sukar untuk ditangani. Saya sedang menulis artikel ini! ! !
Mengapa menggunakan sambungan php?
Kelebihan:
1. Sambungan php dibangunkan dalam C, jadi kelajuannya luar biasa.
2. Gandingan tinggi, penampilannya digunakan untuk meningkatkan PHP.
3 Keselamatan yang tinggi Lagipun, sambungan adalah program yang disusun dan kodnya bukan sumber terbuka.
Kelemahan:
1. Ia perlu dibangunkan untuk versi PHP dan persekitaran sistem, yang lebih menyusahkan. Dengan kata lain, versi 7.4 PHP, sambungan yang dibangunkan dalam persekitaran Linux, hanya menyokong versi dan sistem PHP ini.
2. Anda perlu tahu C dan C. Sudah tentu, artikel ini dibangunkan dalam karat Anda perlu memahami jenis data C dan mahir dalam operasi dan penukaran jenis data FFI karat.
3. Penyahpepijatan agak menyusahkan.
Mengapa menggunakan karat untuk membangunkan sambungan php?
Alasannya sangat mudah, dan ia juga bercakap tentang ciri bahasa karat.
1. Kerana ciri "pemilikan", program anda lebih selamat dan tidak akan mempunyai pelbagai "pepijat metafizik" seperti C.
2. Ia mempunyai prestasi yang sama seperti C.
3 Lagipun, ia adalah bahasa yang paling popular, dan saya sangat optimis tentang perkembangannya.
Proses untuk membangunkan sambungan PHP dalam Rust:
Sudah tentu, Rust pada masa ini tidak mempunyai rangka khusus untuk membangunkan sambungan PHP. Jadi logik saya juga sangat mudah. Saya menggunakan karat untuk membangunkan perpustakaan statik dan mendedahkannya kepada C [Melibatkan pengetahuan FFI]. Kami boleh terus memperkenalkan perpustakaan statik karat ke dalam rangka PHP rasmi dan memanggil kaedahnya.
Persekitaran pembangunan
Pagoda [CentOS 7.6], GCC [melibatkan kompilasi rangka sambungan PHP , saya telah membinanya ke dalam sistem di sini Jika sambungan kompilasi melaporkan ralat yang berkaitan, pasang sendiri], kod sumber versi PHP yang sepadan dan persekitaran web [pasang versi PHP yang sepadan, nginx, mysql, dll. dalam pagoda. ]
Proses pembangunan keseluruhan:
1 Proses pemasangan Pagoda:
Pembinaan pagoda CentOS ( Sangat terperinci)_One Code Superman's Blog-CSDN Blog_centos Pagoda
Di sini kami mengambil pembangunan sambungan php7.4 sebagai contoh.
2. Muat turun kod sumber versi php7.4 liunx
tapak web rasmi php:
PHP: Hypertext Preprocessor
Perhatian! Versi kod sumber mestilah betul-betul sama dengan versi PHP persekitaran anda! ! !
Muat turun selesai:
3. Muat naik sumber php kod Pergi ke Pagoda
untuk mencipta folder phper di bawah usr, dan kemudian muat naik pakej pemampatan kod sumber di sini.
/usr/phper
Nyahzip pakej termampat
4. Buat sambungan kami sendiri
Terdapat fail php sedemikian dalam direktori /usr/phper/php-7.4.30/ext, yang boleh mencipta sambungan!
Beri perhatian kepada menetapkan versi baris arahan, kerana arahan php yang berikutnya mestilah daripada versi yang sama!
在刚刚的目录下,点击终端,输入创建扩展命令。
php ext_skel.php --ext 扩展名称
这里就多出了一个新的扩展源码文件。
在该目录下点击终端,输入:
phpize
接着输入:
./configure --with-php-config=/www/server/php/74/bin/php-config
注意这个参数php路径,如果是别的版本,请自行在宝塔里安装找到对应版本路径,它们都是放一起的。
回车开始进行检查了
最后输入:
make
进行编译。
这个目录下便是编译出来的so扩展最终文件了!
让我们看下默认生成的扩展有哪些功能
查看主文件【需了解php扩展骨架,这里以它默认给的为例】
也就是说,刚刚编译出来的扩展,是有这两个函数的,咱们测试一下玩玩。
注意!每次修改主文件,都需要重新按上述命令跑一遍,否则不生效,很奇怪!
phpize ./configure --with-php-config=/www/server/php/74/bin/php-config make
5、使用扩展
复制刚刚生成的扩展文件到我们php环境的扩展里
配置php.ini加载hello.so扩展
extension = hello.so
保存后记得重新启动下php,否则不生效的!
在文件管理中点击终端,输入:
php -m
可以看到我们的扩展在列表中了。
创建一个站点,测试下扩展中两个函数。
看好,php版本是7.4
访问站点
没有问题哦!
当然也可以通过命令行运行php脚本查看结果【前提是网站那里php命令行版本设置的7.4】
php index.php
OK!从创建到生成到使用扩展的流程结束,接下来才进入正题,开始用rust开发扩展。
6、rust与php扩展的整合开发
开发工具:CLion
需要rust环境与CLion中rust插件的安装与配置,这个自行去百度,比我想象中的全!
创建一个hello命名的库项目
我们写两个导出函数,分别是加法功能和base64字符串解析功能。
lib.rs
#![crate_type = "staticlib"] extern crate libc; //使用C类型约束 use std::ffi::{CStr, CString}; use libc::{c_char, c_int}; //add_int【参数:两个c语言的int类型】:对两个int类型数值进行相加 #[no_mangle] pub extern "C" fn add_int(x:c_int, y:c_int) -> c_int{ //两个数相加 return x + y; } //base64_decode函数【参数:c语言的*char类型】:对字符串进行base64解码 #[no_mangle] pub extern "C" fn base64_decode(s:*const c_char) -> *mut c_char { //c char类型转&str let h = unsafe{CStr::from_ptr(s).to_str().unwrap()}; //base64 解码 let s = base64::decode(h.to_string()); if let Err(_s) = s { panic!("类型错误!"); } let n = String::from_utf8(s.unwrap().clone()).unwrap(); //String 转 C CString let a = CString::new(n.as_str()).unwrap(); //C CString 转 C char //这里实属无奈,因为rust ffi中阐述,对字符串返回只能是该字符串地址,所以需要该方法进行返回C才能接收到! let r = a.into_raw(); return r; }
Cargo.toml
[package] name = "hello" version = "0.1.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [lib] name = "hello" crate-type = ["staticlib"] [dependencies] libc = "*" base64 = "0.12.1"
注意在编译过程中涉及系统类型,不然在引入该静态库编译扩展可能报错,提示不支持。
编译64位静态库
rustup target add x86_64-unknown-linux-musl cargo build --target x86_64-unknown-linux-musl --release
编译32位静态库
rustup target add i686-unknown-linux-musl cargo build --target i686-unknown-linux-musl --release
这里我们是64位系统。
会生成一个.a文件,该文件便是liunx支持的静态库文件。
生成支持C语言的胶水头文件【用于C调用该库需要写的函数声明,很方便】
创建cbindgen.toml文件
内容:
language = "C"
安装cbindgen,创建头文件。
cargo install --force cbindgen cbindgen --config cbindgen.toml --crate 项目名称 --output 头文件名称.h
自动生成了C语言的函数声明hello.h文件,用于调用。
回到之前我们创建的hello扩展
创建lib文件夹
将刚刚编译出来的静态库.a文件上传到lib目录下
将刚刚创建的.h头文件上传到扩展目录下
配置.m4预编译文件【关键】
设置引入lib文件夹中的静态库文件
PHP_ADD_LIBRARY_WITH_PATH(hello, /usr/phper/php-7.4.30/ext/hello/lib, HELLO_SHARED_LIBADD) PHP_SUBST(HELLO_SHARED_LIBADD)
保存.m4
编写主文件
/* hello extension for PHP */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "php.h" #include "ext/standard/info.h" #include "php_hello.h" #include "hello.h"//引入头文件 /* For compatibility with older PHP versions */ #ifndef ZEND_PARSE_PARAMETERS_NONE #define ZEND_PARSE_PARAMETERS_NONE() \ ZEND_PARSE_PARAMETERS_START(0, 0) \ ZEND_PARSE_PARAMETERS_END() #endif /* {{{ void hello_test1() */ PHP_FUNCTION(hello_test1) { ZEND_PARSE_PARAMETERS_NONE(); int num = add_int(1,2);//rust中两个数相加函数并返回。 php_printf("The extension %d is loaded and working!\r\n", num); } /* }}} */ /* {{{ string hello_test2( [ string $var ] ) */ PHP_FUNCTION(hello_test2) { char *var = "World"; size_t var_len = sizeof("World") - 1; zend_string *retval; ZEND_PARSE_PARAMETERS_START(0, 1) Z_PARAM_OPTIONAL Z_PARAM_STRING(var, var_len) ZEND_PARSE_PARAMETERS_END(); char *newstr = base64_decode(var);//rust中解析base64字符串并返回。 retval = strpprintf(0, "Hello %s", newstr); RETURN_STR(retval); } /* }}}*/ /* {{{ PHP_RINIT_FUNCTION */ PHP_RINIT_FUNCTION(hello) { #if defined(ZTS) && defined(COMPILE_DL_HELLO) ZEND_TSRMLS_CACHE_UPDATE(); #endif return SUCCESS; } /* }}} */ /* {{{ PHP_MINFO_FUNCTION */ PHP_MINFO_FUNCTION(hello) { php_info_print_table_start(); php_info_print_table_header(2, "hello support", "enabled"); php_info_print_table_end(); } /* }}} */ /* {{{ arginfo */ ZEND_BEGIN_ARG_INFO(arginfo_hello_test1, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO(arginfo_hello_test2, 0) ZEND_ARG_INFO(0, str) ZEND_END_ARG_INFO() /* }}} */ /* {{{ hello_functions[] */ static const zend_function_entry hello_functions[] = { PHP_FE(hello_test1, arginfo_hello_test1) PHP_FE(hello_test2, arginfo_hello_test2) PHP_FE_END }; /* }}} */ /* {{{ hello_module_entry */ zend_module_entry hello_module_entry = { STANDARD_MODULE_HEADER, "hello", /* Extension name */ hello_functions, /* zend_function_entry */ NULL, /* PHP_MINIT - Module initialization */ NULL, /* PHP_MSHUTDOWN - Module shutdown */ PHP_RINIT(hello), /* PHP_RINIT - Request initialization */ NULL, /* PHP_RSHUTDOWN - Request shutdown */ PHP_MINFO(hello), /* PHP_MINFO - Module info */ PHP_HELLO_VERSION, /* Version */ STANDARD_MODULE_PROPERTIES }; /* }}} */ #ifdef COMPILE_DL_HELLO # ifdef ZTS ZEND_TSRMLS_CACHE_DEFINE() # endif ZEND_GET_MODULE(hello) #endif
删除之前生成的扩展文件
重新生成扩展
phpize ./configure --with-php-config=/www/server/php/74/bin/php-config make
大小都变了,说明我们的静态库在里面了哈哈。
按上述使用扩展流程替换扩展
注意!替换扩展文件后要重启PHP哦,不然不生效!
7、测试rust开发的php扩展
网页测试
命令行测试
也可以通过php扩展骨架直接进行测试
编写要执行测试的扩展函数
--TEST-- hello_test2() Basic test --SKIPIF-- <?php if (!extension_loaded('hello')) { echo 'skip'; } ?> --FILE-- <?php hello_test1(); var_dump(hello_test2('5LiA56CB6LaF5Lq6')); ?> --EXPECT-- string(11) "Hello World" string(9) "Hello PHP"
扩展目录下直接输入:
make test
执行后 tests目录下输出了一个.out文件
是不是这样更方便了呢?
以上就是整体的开发流程,需要经通过的话还是多少要了解C语言、php扩展骨架、rust精通。
推荐学习:《PHP视频教程》
Atas ialah kandungan terperinci Artikel yang menerangkan secara terperinci cara membangunkan sambungan PHP dalam Rust (versi Liunx). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



PHP 8.4 membawa beberapa ciri baharu, peningkatan keselamatan dan peningkatan prestasi dengan jumlah penamatan dan penyingkiran ciri yang sihat. Panduan ini menerangkan cara memasang PHP 8.4 atau naik taraf kepada PHP 8.4 pada Ubuntu, Debian, atau terbitan mereka

Kod Visual Studio, juga dikenali sebagai Kod VS, ialah editor kod sumber percuma — atau persekitaran pembangunan bersepadu (IDE) — tersedia untuk semua sistem pengendalian utama. Dengan koleksi sambungan yang besar untuk banyak bahasa pengaturcaraan, Kod VS boleh menjadi c

Jika anda seorang pembangun PHP yang berpengalaman, anda mungkin merasakan bahawa anda telah berada di sana dan telah melakukannya. Anda telah membangunkan sejumlah besar aplikasi, menyahpenyahpepijat berjuta-juta baris kod dan mengubah suai sekumpulan skrip untuk mencapai op

Tutorial ini menunjukkan cara memproses dokumen XML dengan cekap menggunakan PHP. XML (bahasa markup extensible) adalah bahasa markup berasaskan teks yang serba boleh yang direka untuk pembacaan manusia dan parsing mesin. Ia biasanya digunakan untuk penyimpanan data

JWT adalah standard terbuka berdasarkan JSON, yang digunakan untuk menghantar maklumat secara selamat antara pihak, terutamanya untuk pengesahan identiti dan pertukaran maklumat. 1. JWT terdiri daripada tiga bahagian: header, muatan dan tandatangan. 2. Prinsip kerja JWT termasuk tiga langkah: menjana JWT, mengesahkan JWT dan muatan parsing. 3. Apabila menggunakan JWT untuk pengesahan di PHP, JWT boleh dijana dan disahkan, dan peranan pengguna dan maklumat kebenaran boleh dimasukkan dalam penggunaan lanjutan. 4. Kesilapan umum termasuk kegagalan pengesahan tandatangan, tamat tempoh, dan muatan besar. Kemahiran penyahpepijatan termasuk menggunakan alat debugging dan pembalakan. 5. Pengoptimuman prestasi dan amalan terbaik termasuk menggunakan algoritma tandatangan yang sesuai, menetapkan tempoh kesahihan dengan munasabah,

Rentetan adalah urutan aksara, termasuk huruf, nombor, dan simbol. Tutorial ini akan mempelajari cara mengira bilangan vokal dalam rentetan yang diberikan dalam PHP menggunakan kaedah yang berbeza. Vokal dalam bahasa Inggeris adalah a, e, i, o, u, dan mereka boleh menjadi huruf besar atau huruf kecil. Apa itu vokal? Vokal adalah watak abjad yang mewakili sebutan tertentu. Terdapat lima vokal dalam bahasa Inggeris, termasuk huruf besar dan huruf kecil: a, e, i, o, u Contoh 1 Input: String = "TutorialSpoint" Output: 6 menjelaskan Vokal dalam rentetan "TutorialSpoint" adalah u, o, i, a, o, i. Terdapat 6 yuan sebanyak 6

Mengikat statik (statik: :) Melaksanakan pengikatan statik lewat (LSB) dalam PHP, yang membolehkan kelas panggilan dirujuk dalam konteks statik dan bukannya menentukan kelas. 1) Proses parsing dilakukan pada masa runtime, 2) Cari kelas panggilan dalam hubungan warisan, 3) ia boleh membawa overhead prestasi.

Apakah kaedah sihir PHP? Kaedah sihir PHP termasuk: 1. \ _ \ _ Membina, digunakan untuk memulakan objek; 2. \ _ \ _ Destruct, digunakan untuk membersihkan sumber; 3. \ _ \ _ Call, mengendalikan panggilan kaedah yang tidak wujud; 4. \ _ \ _ Mendapatkan, melaksanakan akses atribut dinamik; 5. \ _ \ _ Set, melaksanakan tetapan atribut dinamik. Kaedah ini secara automatik dipanggil dalam situasi tertentu, meningkatkan fleksibiliti dan kecekapan kod.
