この記事の内容は、PHP 拡張機能の開発と独自の数学関数ライブラリの開発を共有することです。必要な友人はそれを参照できます。
PHP 拡張機能は高度なスキルの 1 つです。 PHP プログラマーは、まず、初心者の PHP 拡張機能開発者が、どのようにして成熟した拡張機能を開発し、PHP 開発の高度な分野に参入できるのかを理解する必要があります。この一連の開発チュートリアルでは、入門段階から上級段階まで段階的に説明します。
このチュートリアル シリーズは Linux (centos を推奨) で開発されており、PHP バージョンは 5.6 で、一定の Linux 操作経験と C/C++ の基礎があることを前提としています。
ご質問があり、連絡する必要がある場合は、QQ 技術交換グループ 32550793 に参加して私と連絡してください。
前の章では、Hello World 拡張機能について説明しました。PHP-CPP で開発された拡張 C++ ソース コードの基本的なスタイルについては、誰もが基本的に理解しています。さまざまなインターフェイス関数をエクスポートする方法に慣れるために、単純な数学演算ライブラリ (mymath) を開発しましょう。
mymath 数学ライブラリのコードは github に配置されています。git 経由で直接ダウンロードすることも、ブラウザで Web ページを開いてソース コードをダウンロードすることもできます。
git ダウンロードコマンドライン
git clone https://github.com/elvisszhang/phpcpp_mymath.git
ブラウザのダウンロード URL はウェアハウスの URL と同じです: https://github.com/elvisszhan...
1. パラメーターなし、戻り値なしの拡張関数の書き方
関数関数:100以内の素数を出力
関数名:mm_print_pn_100
拡張関数の登録方法
phpで直接呼び出せるように、関数mm_print_pn_100をget_module関数本体に登録する必要があります。
PHPCPP_EXPORT void *get_module() { // 必须是static类型,因为扩展对象需要在PHP进程内常驻内存 static Php::Extension extension("mymath", "1.0.0"); //这里可以添加你要暴露给PHP调用的函数 extension.add<mm_print_pn_100>("mm_print_pn_100"); // 返回扩展对象指针 return extension; }
関数の宣言とコードは以下の通りです。
関数にはパラメータは必要ありません。関数のパラメータリストに何も入れる必要はなく、空のままにしておきます。この関数は値を返す必要はなく、戻り値の型は void に設定されます。
//打印100以内的素数 void mm_print_pn_100() { int x = 2; int y = 1; int line = 0; while (x <= 100){ int z = x - y; //z随y递减1 int a = x%z; //取余数 if (a == 0) { //如果x被z整除 if (z == 1) {//如果z为1(x是质数) Php::out << x << " ";//输出x line ++;//每行输出的数的数量加1 } x ++; //x加1 y = 1;//y还原 } else {//如果没有被整除 y ++;//y加1,下一次循环中z减1 } if (line == 10) {//每输出10个数 Php::out << std::endl;//输出一个换行 line = 0;//还原line } } if (line != 0) //最后一行输出换行 Php::out << std::endl; Php::out.flush(); }
PHPテストコード
<?php //打印100以内的素数 mm_print_pn_100();
上記のPHPコードを実行すると、出力結果は
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
2になります。 パラメータと戻り値なしの拡張関数の書き方
Function関数: 1、2、3、...を計算します。 , 100 合計
関数名: mm_sum_1_100
関数mm_sum_1_100を登録、登録方法は前項と同じです
extension.add<mm_sum_1_100>("mm_sum_1_100");</mm_sum_1_100>
関数の宣言とコードは以下の通りです。
関数にはパラメータは必要ありません。関数パラメータリストを空に設定するだけです。
関数には戻り値があり、戻り値の型は Php::Value に設定されます。 Php::value はコンストラクターと演算子 = 演算子をオーバーロードするため、一般的なデータ型 (整数、文字列、浮動小数点数、配列など) を直接返すことができます。
//获取1-100的和 Php::Value mm_sum_1_100() { int sum = 0; int i; for(i=1;i<=100;i++){ sum += i; } return sum; //可以直接返回sum值,自动生成 Php::value 类型 }
PHP テストコード:
<?php $sum = mm_sum_1_100(); echo 'sum (1~100) = ' . $sum . PHP_EOL; ?>
上記の PHP コードを実行すると、出力結果は
sum (1~100) = 5050
3 になります。パラメーター付きで戻り値なしの拡張関数の書き方
関数関数: 指定された整数を計算し、値を出力します。整数内の全ての素数
関数名: mm_print_pn_any
関数mm_print_pn_anyを登録、登録方法は前項と同じです
extension.add<mm_print_pn_any>("mm_print_pn_any");</mm_print_pn_any>
関数の宣言とコードは以下の通りです。パラメータが必要なため、関数パラメータは Php::Parameters ¶ms として記述する必要があります。戻り値がないため、戻り値の型は void に設定されます。
さらに、パラメータが入力されているかどうかを確認する必要があり、パラメータの種類がプラスチックであるかどうかも確認する必要があります。検出せずに直接使用すると、コードで例外が発生する可能性があります。
//任意给定一个整数,打印出小于等于该整数的所有素数 void mm_print_pn_any(Php::Parameters ¶ms) { //检查必须输入一个参数 if(params.size() == 0){ Php::out << "error: need a parameter " << std::endl; return; } //检查参数必须是整形 if( params[0].type() != Php::Type::Numeric){ Php::out << "error: parameter must be numeric" << std::endl; return; } //检查数字必须大于1 int number = params[0]; if(number <= 1){ Php::out << "error: parameter must be larger than 1" << std::endl; return; } //检查参数必须大于0 int x = 2; int y = 1; int line = 0; while (x <= number){ int z = x - y; //z随y递减1 int a = x%z; //取余数 if (a == 0) { //如果x被z整除 if (z == 1) {//如果z为1(x是质数) Php::out << x << " ";//输出x line ++;//每行输出的数的数量加1 } x ++; //x加1 y = 1;//y还原 } else {//如果没有被整除 y ++;//y加1,下一次循环中z减1 } if (line == 10) {//每输出10个数 Php::out << std::endl;//输出一个换行 line = 0;//还原line } } if (line != 0) //最后一行输出换行 Php::out << std::endl; Php::out.flush(); }
PHPテストコード
<?php echo '---runing mm_print_pn_any()---' . PHP_EOL; mm_print_pn_any(); echo PHP_EOL . '---runing mm_print_pn_any(\'xyz\')---' . PHP_EOL; mm_print_pn_any('xyz'); echo PHP_EOL . '---runing mm_print_pn_any(200)---' . PHP_EOL; mm_print_pn_any(200); ?>
上記のPHPコードを実行すると、出力結果は
---runing mm_print_pn_any()--- error: need a parameter ---runing mm_print_pn_any('xyz')--- error: parameter must be numeric ---runing mm_print_pn_any(200)--- 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199
4になります。スカラーパラメータ、戻り値付きの拡張関数の記述
関数関数: 一連のパラメータを指定して、それらの合計を計算します
関数名前:mm_sum_all
拡張関数mm_sum_allを登録します。登録方法は前項と同じです
extension.add<mm_sum_all>("mm_sum_all");
関数の宣言とコードは以下の通りです。
//获取所有参数的和 Php::Value mm_sum_all(Php::Parameters ¶ms) { int sum = 0; for (auto ¶m : params){ //字符串类型可以自动转换成整形 sum += param; } return sum; }
PHPテストコード
<?php $sum = mm_sum_all(1,2,'3','5'); //字符串类型可以自动转换成整形 echo 'sum (1,2,\'3\',\'5\') = ' . $sum . PHP_EOL; ?>
テスト出力結果:
sum (1,2,'3','5') = 11
5.配列型パラメータ、戻り値付き拡張関数の書き込み
関数関数:配列型パラメータを与えて、配列の全要素の合計を計算します
関数名: mm_sum_array
関数 mm_sum_array を登録します、登録方法は最初のセクションと同じです
関数の宣言とコードは次のとおりです。
//获取所有数组各元素的和 Php::Value mm_sum_array(Php::Parameters ¶ms) { //没有给定参数,返回0 if(params.size() == 0){ return 0; } //参数类型不是数组,转成整形返回 if( params[0].type() != Php::Type::Array){ return (int)params[0]; } //数组中的元素逐个相加 int sum = 0; Php::Value array = params[0]; int size = array.size(); int i; for(i=0;i<size;i++){ sum += array.get(i); } return sum; }
PHPテストコード
<?php $nums = array(1,3,5,7); $sum = mm_sum_array($nums); echo 'sum (array(1,3,5,7)) = ' . $sum . PHP_EOL; ?>
テスト出力結果:
sum (array(1,3,5,7)) = 16
6.戻り値の型は配列の拡張関数です
上記関数の戻り値はスカラー型で、配列は特に一般的なものですPHP で使用される型を返したい場合は、C++ の std::vector を使用できます。PHP-CPP は、それを PHP が認識する配列型に変換します。
現在のデモ関数の機能は、「30 以内のすべての素数の配列を返す」です。拡張機能に関数を登録する方法は最初のセクションと同じです。
関数の宣言とコードは以下の通りです。
//获取30以内的所有素数 Php::Value mm_get_pn_30() { std::vector<int> pn; int x = 2; int y = 1; while (x <= 30){ int z = x - y; //z随y递减1 int a = x%z; //取余数 if (a == 0) { //如果x被z整除 if (z == 1) {//如果z为1(x是质数) pn.push_back(x); //放数组中去 } x ++; //x加1 y = 1;//y还原 } else {//如果没有被整除 y ++;//y加1,下一次循环中z减1 } } return pn; }
PHP テストコード
<?php $pn = mm_get_pn_30(); var_dump($pn); ?>
テスト出力結果:
array(10) { [0]=> int(2) [1]=> int(3) [2]=> int(5) [3]=> int(7) [4]=> int(11) [5]=> int(13) [6]=> int(17) [7]=> int(19) [8]=> int(23) [9]=> int(29) }
VII.参考資料
C++ 素数決定と出力素数テーブル
PHP-CPP 関数開発ヘルプ
関連する推奨事項:
PHP 拡張機能の開発: 最初の拡張機能 hello world の作成
以上がPHP 拡張機能の開発: 独自の数学関数ライブラリの開発の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

tomodifydatainaphpsession、starthessession withsession_start()、$ _sessiontoset、modify、orremovevariables.1)startthessession.2)

配列はPHPセッションに保存できます。 1。セッションを開始し、session_start()を使用します。 2。配列を作成し、$ _Sessionで保存します。 3. $ _Sessionを介して配列を取得します。 4.セッションデータを最適化してパフォーマンスを向上させます。

PHPセッションガベージコレクションは、有効期限が切れたセッションデータをクリーンアップするために確率メカニズムを通じてトリガーされます。 1)構成ファイルにトリガー確率とセッションのライフサイクルを設定します。 2)Cronタスクを使用して、高負荷アプリケーションを最適化できます。 3)データの損失を避けるために、ごみ収集の頻度とパフォーマンスのバランスを取る必要があります。

PHPでのユーザーセッションアクティビティの追跡は、セッション管理を通じて実装されます。 1)SESSION_START()を使用してセッションを開始します。 2)$ _Sessionアレイを介してデータを保存およびアクセスします。 3)セッションを終了するには、session_destroy()を呼び出します。セッショントラッキングは、ユーザーの動作分析、セキュリティ監視、パフォーマンスの最適化に使用されます。

データベースを使用してPHPセッションデータを保存すると、パフォーマンスとスケーラビリティが向上します。 1)MySQLを構成してセッションデータを保存します:PHP.iniまたはPHPコードでセッションプロセッサを設定します。 2)カスタムセッションプロセッサを実装します:データベースと対話するために、開いて、閉じ、読み取り、書き込み、その他の機能を定義します。 3)最適化とベストプラクティス:インデックス、キャッシュ、データ圧縮、分散ストレージを使用して、パフォーマンスを向上させます。

phpssionsStrackuserdataacrossmultiplepagerequestsusingauniqueidstoredinacookie.here'showtomanageetheemefectively:1)Startassession withsession_start()andstoredatain $ _ session.2)RegeneratesseSsessidafterloginwithsession_id(the topreventes_id)

PHPでは、次の手順を通じてセッションデータを繰り返すことができます。1。session_start()を使用してセッションを開始します。 2。$ _Sessionアレイのすべてのキー価値ペアを介してforeachループを反復します。 3.複雑なデータ構造を処理する場合、is_array()またはis_object()関数を使用し、print_r()を使用して詳細情報を出力します。 4.トラバーサルを最適化する場合、ページングを使用して、一度に大量のデータの処理を避けることができます。これにより、実際のプロジェクトでPHPセッションデータをより効率的に管理および使用するのに役立ちます。

このセッションは、サーバー側の状態管理メカニズムを介してユーザー認証を実現します。 1)セッションの作成と一意のIDの生成、2)IDはCookieを介して渡されます。3)サーバーストアとIDを介してセッションデータにアクセスします。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

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

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

WebStorm Mac版
便利なJavaScript開発ツール

ホットトピック









