C コードは php プログラムで使用する必要があり、次の 2 つの状況で使用する必要があります:
1 すでに C コードがあり、それを PHP プログラムで直接使用したいです
2 PHP のパフォーマンスの問題により、一部の関数を実装するには C を使用する必要があります
最初のケースでは、システム コールを使用して既存の C コードを独立したプログラムに書き込むのが最も適切な方法です。パラメーターはコマンド ラインまたは標準入力を通じて渡され、結果は標準出力から読み取られます。次に、少し面倒な方法は、C コードをデーモンとして記述し、PHP プログラムがソケットを使用してデーモンと通信することです。
2 番目のケースに注目してください。システム コール方式を使用することもできますが、多くのプロセスを頻繁に起動すると、当然ながらパフォーマンスが低下することを考慮してください。デーモンを作成する方法は確かに実行可能ですが、はるかに複雑です。
私の簡単なテストでは、同じアルゴリズムが PHP よりも C で書かれた方が 500 倍効率的であることがわかりました。また、PHP 拡張機能を使用すると、90 倍以上改善することもできます (パフォーマンスの低下はパラメーターの受け渡しにあると思います)。
そのため、php 拡張機能が最良の選択となる場合もあります。
ここでは、PHP を再コンパイルせずに C で PHP 拡張機能を記述する方法に焦点を当てます。
まず、PHP ソース コードを見つけます。これは、ターゲット プラットフォームの PHP バージョンとは関係ありません。
ソースコードの ext ディレクトリに ext_skel という名前のスクリプトがあります (Windows プラットフォームでは ext_skel_win32.php を使用します)
このディレクトリで ./ext_skel --extname=hello を実行します (例として hello を使用します)
ディレクトリが生成されます現時点では、ディレクトリ内にいくつかのファイルがあります。config.m4 hello.c php_hello.h
このディレクトリを任意の場所にコピーし、そこに cd して、
phpize
/configure
make
を実行しても何も起こりませんよね?
これは手順を見逃したためです。config.m4 を開いて次の
dnl を見つけます。拡張機能が外部のものを参照している場合は、with:
..
dnl を使用します。それ以外の場合は、enable:
..
を使用します。これは拡張機能を選択するためのものです。で使用する または有効にして、使用しましょう。 with 部分のコメントを解除します。
私と同じように vim エディターを使用している場合は、3 文字の dnl が元々コメントを表していることが簡単にわかるでしょう (これは、vim にはデフォルトでさまざまなファイル形式用の構文カラーリング パッケージが付属しているためです)
config.m4 を変更したら、
phpize
/configure
make
を続けます。このとき、モジュールの下に hello.so および hello.la ファイルが生成されます。 1 つは動的ライブラリで、もう 1 つは静的ライブラリです。
php 拡張機能は準備ができていますが、まだ必要な機能を実現していません。まず、この拡張機能の使用方法について説明します。 ext_skel は呼び出し例を使用して hello.php を生成しましたが、その例では hello.so を PHP の拡張ディレクトリにコピーする必要があります。私たちは独自の関数を実装したいだけであり、PHP のコピーバージョンを作成したくありません。代わりに、次を使用してロードします:
if(!extension_loaded("hello")) {
dl_local("hello.so");
}
function dl_local( $extensionFile ) {
//ライブラリをロードできることを確認します06。 if( !(bool)ini_get( "enable_dl" ) || (bool)ini_get( "safe_mode" ) ) {
die( "dh_local(): 拡張機能の読み込みは許可されていません。/n" );
}
//checkファイルが存在することを確認します11。 if( !file_exists(dirname(__FILE__) . "/". $extensionFile ) ) {
die( "dl_local(): ファイル '$extensionFile' が存在しません。/n" );
}
// ファイルのアクセス許可を確認します16 。 if( !is_executable(dirname(__FILE__) . "/". $extensionFile ) ) {
die( "dl_local(): ファイル '$extensionFile' は実行可能ではありません。/n" );
}
//パス21。 $currentDir = ディレクトリ名(__FILE__) 。 "/";
$currentExtPath = ini_get( "extension_dir" );
$subDirs = preg_match_all( "////" , $currentExtPath , $matches );
unset( $matches );
// 抽出したことを確認しましょう有効な拡張パス27。 if( !(bool)$subDirs ) {
die( "dl_local(): 有効な拡張パス [extension_dir] を決定できませんでした。/n" );
}
$extPathLastChar = strlen( $currentExtPath ) - 1;
もし( $extPathLastChar == strrpos( $currentExtPath , "/" ) ) {
$subDirs--;
}
$backDirStr = "";
for( $i = 1; $i $backDirStr .= "..";
if( $i != $subDirs ) {
$backDirStr .= "/";
}
}
//load46 への最終パスを構築します。 $finalExtPath = $backDirStr 。 $currentDir 。 $extensionFile;
//次に、dl() を実行して実際にモジュールをロードします49。 if( !dl( $finalExtPath ) ) {
die();
}
//モジュールが正しくロードされた場合は、モジュール名を取得する必要があります54。 $loadedExtensions = get_loaded_extensions();
$thisExtName = $loadedExtensions[ sizeof( $loadedExtensions ) - 1 ];
// 最後に、拡張機能名 58 を返します。 return $thisExtName;
}//end dl_local()
これの利点は、php 拡張機能が php コードに従うことができ、環境に優しい拡張機能であることです。
人々が次に懸念しているのは、関数を追加し、パラメーターの転送と戻り値を実装する方法です
関数を追加する手順は次のとおりです:
php_hello.h:
PHP_FUNCTION(confirm_hello_compiled) // 括弧内に関数名を入力します
hello.c
zend_function_entry hello_functions[] = {
PHP_FE(confirm_hello_compiled, NULL) /* ここに行を追加します*/
{NULL, NULL, NULL} /* hello_functions[] の最後の行である必要があります */
};
PHP_FUNCTION(confirm_hello_compiled)
{//ここに関数本体を記述します
}
実装される関数のプロトタイプは実際には同じです。さらに、hello_functions に次のことを示す情報が 1 行追加されます。この機能があります。
つまり、それらはすべて同じ関数プロトタイプを持っていますが、戻り値とパラメーターをどのように区別するのでしょうか?
例を示します:
PHP_FUNCTION(hello_strdiff)
{
char *r1 = NULL, *r2 = NULL;
int n = 0, m = 0; (i = 0; i for(j = 0; j for (i = 1; i for(j = 1; j if(r1[ i-1] == r2[j-1]) コスト = 0;
その他のコスト = 1; +1);
a = MIN(a, d[i-1][j-1]+コスト);
}
这是一个求两个字符串差异度的算法,输入参数两个字符串,返回整型。
参数的传递看这里
zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &r1, &n, &r2, &m)
把这个当成是scanf来理解好了。
类型说明见下表:
Boolean | b |
zend_bool |
Long | l |
long |
Double | d |
double |
String | s |
char*, int |
Resource | r |
zval* |
Array | a |
zval* |
Object | o |
zval* |
zval | z |
zval* |
如果想实现可选参数的话,例如一个字符串,一个浮点,再加一个可选的bool型,可以用"sd|b"来表示。
和scanf有一点不同的是,对于字符串,你要提供两个变量来存储,一个是char *,存字符串的地址,一个int,来存字符串的长度。这样有必要的时候,你可以安全的处理二进制数据。
那么返回值怎么办呢?
使用下面一组宏来表示:
RETURN_STRING
RETURN_LONG
RETURN_DOUBLE
RETURN_BOOL
RETURN_NULL
注意RETURN_STRING有两个参数
当你需要复制一份字符串时使用
RETURN_STRING("Hello World", 1);
否则使用
RETURN_STRING(str, 0);
这里涉及到了模块中内存的分配,当你申请的内存需要php程序中去释放的话,请参照如下表
Traditional | Non-Persistent | Persistent |
---|---|---|
malloc(count) calloc(count, num)
|
emalloc(count) ecalloc(count, num)
|
pemalloc(count, 1) *pecalloc(count, num, 1)
|
strdup(str) strndup(str, len)
|
estrdup(str) estrndup(str, len)
|
pestrdup(str, 1) pemalloc() & memcpy()
|
無料(ポイント) |
efree(ptr) |
pefree(ptr, 1) |
realloc(ptr, newsize) |
errealloc(ptr, newsize) |
perrealloc(ptr, newsize, 1) |
malloc(count * num + extr) **
|
safe_emalloc(カウント、数値、拡張子) |
safe_pemalloc(count, num, extr) |
通常は、「非永続的」にリストされているものを使用します。
基本的にはこれで、php 拡張機能の作成を開始できます。
今のアプリからは文字列操作ができれば十分なので、これくらいしか紹介できません。

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\ \;||\xc2\xa0)/","其他字符",$str)”语句。

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

MinGW - Minimalist GNU for Windows
このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

SublimeText3 中国語版
中国語版、とても使いやすい

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

ホットトピック



