INI 設(shè)定
前の章で見たスーパーグローバル変數(shù)と永続定數(shù)と同様に、php.ini 値は拡張 MINIT コード ブロックで定義する必要があります。他の機(jī)能では、INI オプションの定義は単純な開始/停止行のみで構(gòu)成されます
PHP_MINIT_FUNCTION(sample4) { REGISTER_INI_ENTRIES(); return SUCCESS; } PHP_MSHUTDOWN_FUNCTION(sample4) { UNREGISTER_INI_ENTRIES(); return SUCCESS; }
INI 設(shè)定を定義してアクセスします
INI コマンド自體は、ソース コード ファイルの MINIT 関數(shù)の上にあります。次のマクロは完全に獨(dú)立して定義できます。これら 2 つのマクロの間に 1 つ以上の INI 命令を定義できます:
PHP_INI_BEIGN() PHP_INI_END()
これら 2 つのマクロ関數(shù)は、ZEND_BEGIN_MODULE_GLOBALS()/ZEND_END_MODULE_GLOBALS() と同じ効果があります。これは typdef 構(gòu)造體ではありませんが、靜的データ インスタンスを定義するためのフレームワーク組織です:
static zend_ini_entry ini_entries[] = { {0,0,NULL,0,NULL,NULL,NULL,NULL,NULL,0,NULL,0,0,NULL} };
ご覧のとおり、空のレコードで終わる zend_ini_entry 値のベクトルを定義します。前に見た靜的ベクトル function_entry の定義と一致します
簡単な INI セットアップ
これで、INI 命令とエンジンの登録/アンインストール INI 設(shè)定メカニズムを定義するために使用される INI 構(gòu)造體が完成しました。実際には、拡張機(jī)能の INI 命令をいくつか定義できます。ただし、第 5 章「最初の拡張機(jī)能」と同じように、拡張機(jī)能が挨拶関數(shù)を公開しているとします。挨拶したい場合は、次のようにカスタマイズできます。最も直接的な方法は、INI コマンドを定義してデフォルト値「Hello world!」を與えることです:
PHP_FUNCTION(sample4_hello_world) { php_printf("Hello World!\n"); }
You ご想像のとおり、このマクロの最初の 2 つのパラメータは、 INI 命令の名前とそのデフォルト値。3 番目のパラメータは、エンジンがこの INI 命令の変更を許可するかどうかを決定するために使用されます (これには、この章の後半で説明するアクセス レベルが関係します)。 INI 命令の値が変更されるたびにこのパラメータが呼び出されます。このパラメータの詳細(xì)については、「イベントの変更」セクションを參照してください。テストするときは、MINIT() 関數(shù)に「REGISTER_INI_ENTRIES();」呼び出しを追加し、MINIT にグローバル領(lǐng)域を割り當(dāng)てた後に呼び出しが実行されるようにしてください。
これで INI 設(shè)定が完了しました。が定義されているため、挨拶関數(shù)で使用するだけで済みます。
#include "php_ini.h" PHP_INI_BEGIN() PHP_INI_ENTRY("sample4.greeting", "Hello World", PHP_INI_ALL, NULL) PHP_INI_END()
char * の値はエンジンによって所有されており、変更できないことに注意してください。このため、ローカル変數(shù)を定義してください。もちろん、すべての INI 値が文字列であるわけではありません。整數(shù)、浮動小數(shù)點(diǎn)、およびブール値を取得するためのマクロもあります:
PHP_FUNCTION(sample4_hello_world)
{
const char *greeting = INI_STR("sample4.greeting");
php_printf("%s\n", greeting);
}
。 通常、知りたいのは INI 設(shè)定の現(xiàn)在の値ですが、補(bǔ)足として、未変更の INI 設(shè)定値を読み取るために使用できるいくつかのマクロが存在します。 この例では、INI 命令「sample4.greeting」の名前には、他の拡張機(jī)能によって公開される INI 命令名と競合しないように、拡張子が接頭辭として付けられています。必要ですが、商用またはオープンソース リリースの公開拡張ではこれが推奨されます INI 命令の場合、最初は常にデフォルト値があります。デフォルトを維持する場合、値は変更されません。ただし、一部の特殊な環(huán)境またはスクリプト內(nèi)の特定のアクションでは、これらの値を変更する必要がある場合があります。以下の表に示すように、INI 命令の値を変更する必要があります。次の 3 つのポイント: アクセスレベル 、 は、httpd.conf 設(shè)定ファイル 、 INIset.を変更できます 某些設(shè)置如果可以在任何地方被修改就沒有多大意義了, 比如safe_mode, 如果可以在任何地方去修改, 那么惡意腳本的作者就可以很簡單的去禁用safe_mode, 接著去讀或修改本不允許操作的文件. 類似的, 某些非安全相關(guān)的指令比如register_globals或magic_quotes_gpc, 在腳本中不能被修改, 因?yàn)? 在腳本執(zhí)行時, 它所影響的事情已經(jīng)發(fā)生過了. 這些指令的訪問控制是通過PHP_INI_ENTRY()的第三個參數(shù)完成的. 在你前面例子中, 使用了PHP_INI_ALL, 它的定義是一個位域操作: PHP_INI_SYSTEM | PHP_INI_PERDIR | PHP_INI_USER. 對于register_globals和magic_quotes_gpc這樣的指令, 定義的訪問級別為PHP_INI_SYSTEM | PHP_INI_PERDIR. 排除了PHP_INI_USER將導(dǎo)致以這個名字調(diào)用ini_set()時最終會失敗. 現(xiàn)在, 你可能已經(jīng)猜到, safe_mode和open_basedir這樣的指令應(yīng)該僅被定義為PHP_INI_SYSTEM. 這樣的設(shè)置就確保了只有系統(tǒng)管理員可以修改這些值, 因?yàn)橹挥兴鼈兛梢栽L問修改php.ini或httpd.conf文件中的配置. 修改事件 當(dāng)INI指令被修改時, 無論是通過ini_set()函數(shù)還是某個perdir指令的處理, 引擎都會為其測試OnModify回調(diào). 修改處理器可以使用ZEND_INI_MH()宏定義, 并通過在OnModify參數(shù)上傳遞函數(shù)名附加到INI指令上: 通過在new_value_length為0時返回FAILURE, 這個修改處理器禁止將greeting設(shè)置為空字符串. ZEND_INI_MH()宏產(chǎn)生的整個原型如下: 各個參數(shù)的含義見下表: 參數(shù)名 含義 entry は、エンジンに実際に保存されているINIコマンド項(xiàng)目を指します。この構(gòu)造體は、現(xiàn)在の値、元の値、をどのモジュールに提供しますかといくつかその他 次のコード(zend_ini_entry Structure Structure)は情報(bào)をリストします new_value 設(shè)定される値 プロセッサーが戻ったら SUCCESS,この値はentry->value,に設(shè)定されます。同時に、entry->orig_valueが現(xiàn)在設(shè)定されていない場合、,は現(xiàn)在の値を設(shè)定しますvalue を , の entry->orig_value に設(shè)定し、entry->modified タグ . を設(shè)定します。この文字列の長さは、. 経由で渡されます。 new_value_length mh_arg1、2、3 これらの3ポインタは、INI命令が定義されるときに與えられるデータポインタに対応します(zend_ini_entry內(nèi)の同じ名前のメンバー3) 構(gòu)造)。 実際、これらの値、は、內(nèi)部処理、によって使用されます。これらを気にする必要はありません _ これらの定數(shù)は、 に対応します。 核心結(jié)構(gòu)體: zend_ini_entry 展示INI設(shè)置 在上一章, 你看到了MINFO函數(shù)以及相關(guān)的指令用于展示擴(kuò)展的信息. 由于擴(kuò)展暴露INI指令是很常見的, 因此引擎提供了一個公共的宏可以放置到PHP_MINFO_FUNCTION()中用于展示INI指令信息. 這個宏將迭代PHP_INI_BEGIN()和PHP_INI_END()宏之間定義的INI指令集和, 在一個3列的表格中展示它們的INI指令名, 原始值(全局的), 以及當(dāng)前值(經(jīng)過PERDIR指令或ini_set()調(diào)用修改后) 默認(rèn)情況下, 所有的指令都直接以其字符串形式輸出. 對于某些指令, 比如布爾值以及用于語法高亮的顏色值, 則在展示處理時應(yīng)用了其他格式. 這些格式是通過每個INI設(shè)置的顯示處理器處理的, 它和你看到的OnModify一樣是一個動態(tài)的回調(diào)函數(shù)指針. 顯示處理器可以使用PHP_INI_ENTRY()宏的擴(kuò)展版指定, 它接受一個額外的參數(shù). 如果設(shè)置為NULL, 則使用展示字符串值的處理器作為默認(rèn)處理器: 顯然, 需要在INI設(shè)置定義之前聲明這個函數(shù). 和OnModify回調(diào)函數(shù)一樣, 這可以通過一個包裝宏以及少量編碼完成: 綁定到擴(kuò)展的全局空間 所有的INI指令都在Zend引擎內(nèi)有一塊存儲空間, 可以用以跟蹤腳本內(nèi)的變更并進(jìn)行請求外部的全局設(shè)置維護(hù). 在這塊存儲空間中, 所有的INI指令都以字符串值存儲. 你已經(jīng)知道了, 這些值可以使用INI_INT(), INI_FLT(), INI_BOOL()等宏函數(shù), 很簡單的翻譯成其他的標(biāo)量類型. 這個查找和轉(zhuǎn)換過程由于兩個原因非常低效: 首先, 每次一個INI的值在獲取時, 它必須通過名字在一個HashTable中進(jìn)行定位. 這種查找方式對于僅在運(yùn)行時編譯的用戶空間腳本而言是沒有問題的, 但是對于已編譯的機(jī)器代碼源, 運(yùn)行時做這個工作就毫無意義. 每次請求標(biāo)量值的時候都需要將底層的字符串值轉(zhuǎn)換到標(biāo)量值是非常低效的. 因此我們使用你已經(jīng)學(xué)習(xí)過的線程安全全局空間作為存儲媒介, 每次INI指令值變更時更新它即可. 這樣, 所有訪問INI指令的代碼都只需要查找你的線程安全全局空間結(jié)構(gòu)體中的某個指針即可, 這樣就獲得了編譯期優(yōu)化的優(yōu)點(diǎn). 在你的php_sample4.h文件MODULE_GLOBALS結(jié)構(gòu)體中增加const char *greeting; 接著更新sample4.c中的下面兩個方法: 由于這是對INI訪問的一種非常常見的優(yōu)化方式, 因此引擎暴露了一組專門處理INI指令到全局變量的綁定宏: 這個宏執(zhí)行和上面你自己的php_sample4_modify_greeting相同的工作, 但它不需要OnModify回調(diào). 取而代之的是, 它使用了一個泛化的修改回調(diào)OnUpdateStringUnempty, 以及信息應(yīng)該存儲的空間. 如果要允許空的greeting指令值, 你可以直接指定OnUpdateString替代OnUpdateStringUnempty. 類似的, INI指令也可以綁定long, double, zend_bool的標(biāo)量值. 在你的php_sample4.h中MODULE_GLOBALS結(jié)構(gòu)體上增加幾個字段: 現(xiàn)在在你的PHP_INI_BEGIN()/PHP_INI_END()代碼塊中使用STD_PHP_INI_ENTRY()宏創(chuàng)建新的INI指令, 它和對應(yīng)的_EX版本的宏的區(qū)別只是顯示處理器以及綁定到的值不同. 這里要注意, 如果調(diào)用了DISPLAY_INI_ENTRIES(), 布爾類型的INI指令"sample4.boolval"將和其他設(shè)置一樣, 被顯示為它的字符串值; 然而, 首選的布爾值指令應(yīng)該被顯示為"on"或"off". 要使用這些更加表意的顯示, 你可以使用STD_PHP_INI_ENTRY_EX()宏并創(chuàng)建顯示處理器, 或者使用另外一個宏: 這個特定類型的宏是布爾類型特有的, 它提供的是將布爾值轉(zhuǎn)換為"on"/"off"值的顯示處理器. 小結(jié) 在本章, 你了解了php語言中最古老的特性之一的實(shí)現(xiàn), 它也是阻礙php可移植的罪魁. 對于每個新的INI設(shè)置, 都會使得編寫可移植代碼變得更加復(fù)雜. 使用這些特性要非常慎重, 因?yàn)閿U(kuò)展以后時鐘都要使用它了. 并且, 在使用時要注意不同系統(tǒng)間的行為一致性, 以免在維護(hù)時出現(xiàn)不可預(yù)期的狀況. 接下來的三張, 我們將深入到流API, 開始使用流的實(shí)現(xiàn)層和包裝操作, 上下文, 過濾器等.
以上就是[翻譯][php擴(kuò)展開發(fā)和嵌入式]第13章-php的INI設(shè)置?的內(nèi)容,更多相關(guān)內(nèi)容請關(guān)注PHP中文網(wǎng)(miracleart.cn)! 脫衣畫像を無料で リアルなヌード寫真を作成する AI 搭載アプリ 寫真から衣服を削除するオンライン AI ツール。 AI衣類リムーバー 完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。 使いやすく無料のコードエディター 中國語版、とても使いやすい 強(qiáng)力な PHP 統(tǒng)合開発環(huán)境 ビジュアル Web 開発ツール 神レベルのコード編集ソフト(SublimeText3) postaycurrentwithpdevellyments andbest practices、follow keynewsourceslikephp.netandphpweekly、egagewithcommunitiessonforums andconferences、keeptooling and gradivallyadoptnewfeatures、andreadorcontributeTopensourceprijeprijeprijeptrijeprijeprests. PhpBecamepopularforwebdevelopmentduetoitseaseaseaseaseasease、SeamlessintegrationWithhtml、widespreadhostingsupport、andalargeecosystemincludingframeworkelavelandcmsplatformslikewordspresspressinsinsionsisionsisionsisionsisionsionsionsisionsionsionsisionsisions tosettherighttimezoneInphp、usedate_default_timezone_set()functionthestthestofyourscriptwithavalididentifiersiersuchas'america/new_york'.1.usedate_default_timezone_set()beforeanydate/timefunctions.2.2.Altertentally、confuturethephp.inifilebyset. tovalidateuserinputinphp、usebuilt-validationfunctionslikefilter_var()andfilter_input()、applyRegularexpressionsforcustomformatsusususussusorphoneNumbers、checkdatatypesfornumerueSlikeageorpricepriceprice thephpfunctionSerialize()andunserialize()areusedtoconvertcomplexdatastructostorestorestorustorasandabackagain.1.serialize()c onvertsdatalikecarraysorobjectsraystringcontainingtainingtainingepeandStructureinformation.2。 PHPコードをHTMLファイルに埋め込むことができますが、ファイルに.phpの拡張機(jī)能があることを確認(rèn)して、サーバーが正しく解析できるようにします。標(biāo)準(zhǔn)タグを使用してPHPコードをラップし、HTMLのどこにでも動的コンテンツを挿入します。さらに、同じファイルでPHPとHTMLを複數(shù)回切り替えて、條件付きレンダリングなどの動的関數(shù)を?qū)g現(xiàn)できます。短いラベル、引用マークエラー、または省略されたエンドラベルによって引き起こされる問題を回避するために、サーバーの構(gòu)成と構(gòu)文の正確性に注意してください。 清潔で維持しやすいPHPコードを書くための鍵は、標(biāo)準(zhǔn)、合理的な構(gòu)造に従って、コメント、テスト能力を適切に利用する明確な命名にあります。 1。$ userDataやcalculatetotalprice()などの明確な変數(shù)、関數(shù)、クラス名を使用します。 2。PSR-12標(biāo)準(zhǔn)統(tǒng)一コードスタイルに従ってください。 3.責(zé)任に従ってコード構(gòu)造を分割し、MVCまたはLaravelスタイルのカタログを使用して整理します。 4.麺スタイルのコードを避け、単一の責(zé)任でロジックを小さな関數(shù)に分割します。 5.キーポイントにコメントを追加し、インターフェイスドキュメントを書き込み、パラメーター、返品値、例外を明確にします。 6.テスト可能性を改善し、依存関係を採用し、グローバルな狀態(tài)と靜的な方法を減らします。これらのプラクティスは、コードの品質(zhì)、コラボレーション効率、メンテナンス後の容易さを改善します。意味 phpにあります.iniシステム Apache 1回スクリプトの実行が開始されます ini_set()を呼び出すことによってのみ ZEND_INI_MH(php_sample4_modify_greeting)
{
if (new_value_length == 0) {
return FAILURE;
}
return SUCCESS;
}
PHP_INI_BEGIN()
PHP_INI_ENTRY("sample4.greeting", "Hello World",
PHP_INI_ALL, php_sample4_modify_greeting)
PHP_INI_END()
int php_sample4_modify_greeting(zend_ini_entry *entry,
char *new_value, uint new_value_length,
void *mh_arg1, void *mh_arg2, void *mh_arg3,
int stage TSRMLS_DC);
価値 :
STARTUP、SHUTDOWN、ACTIVATE、DEACTIVATE、RUNTIME 、およびアクティブなスクリプト実行 struct _zend_ini_entry {
int module_number;
int modifiable;
char *name;
uint name_length;
ZEND_INI_MH((*on_modify));
void *mh_arg1;
void *mh_arg2;
void *mh_arg3;
char *value;
uint value_length;
char *orig_value;
uint orig_value_length;
int modified;
void ZEND_INI_DISP(*displayer);
};
PHP_MINFO_FUNCTION(sample4)
{
DISPLAY_INI_ENTRIES();
}
PHP_INI_ENTRY_EX("sample4.greeting", "Hello World", PHP_INI_ALL,
php_sample4_modify_greeting, php_sample4_display_greeting)
#include "SAPI.h" /* needed for sapi_module */
PHP_INI_DISP(php_sample4_display_greeting)
{
const char *value = ini_entry->value;
/* 選擇合適的當(dāng)前值或原始值 */
if (type == ZEND_INI_DISPLAY_ORIG &&
ini_entry->modified) {
value = ini_entry->orig_value;
}
/* 使得打招呼的字符串粗體顯示(當(dāng)以HTML方式輸出時) */
if (sapi_module.phpinfo_as_text) {
php_printf("%s", value);
} else {
php_printf("<b>%s</b>", value);
}
}
ZEND_INI_MH(php_sample4_modify_greeting)
{
/* Disallow empty greetings */
if (new_value_length == 0) {
return FAILURE;
}
SAMPLE4_G(greeting) = new_value;
return SUCCESS;
}
PHP_FUNCTION(sample4_hello_world)
{
php_printf("%s\n", SAMPLE4_G(greeting));
}
STD_PHP_INI_ENTRY_EX("sample4.greeting", "Hello World",
PHP_INI_ALL, OnUpdateStringUnempty, greeting,
zend_sample4_globals, sample4_globals,
php_sample4_display_greeting)
long mylong;
double mydouble;
zend_bool mybool;
STD_PHP_INI_ENTRY("sample4.longval", "123",
PHP_INI_ALL, OnUpdateLong, mylong,
zend_sample4_globals, sample4_globals)
STD_PHP_INI_ENTRY("sample4.doubleval", "123.456",
PHP_INI_ALL, OnUpdateDouble, mydouble,
zend_sample4_globals, sample4_globals)
STD_PHP_INI_ENTRY("sample4.boolval", "1",
PHP_INI_ALL, OnUpdateBool, mybool,
zend_sample4_globals, sample4_globals)
STD_PHP_INI_BOOLEAN("sample4.boolval", "1",
PHP_INI_ALL, OnUpdateBool, mybool,
zend_sample4_globals *, sample4_globals)
ホットAIツール
Undress AI Tool
Undresser.AI Undress
AI Clothes Remover
Clothoff.io
Video Face Swap
人気の記事
ホットツール
メモ帳++7.3.1
SublimeText3 中國語版
ゼンドスタジオ 13.0.1
ドリームウィーバー CS6
SublimeText3 Mac版
ホットトピック
8517
17
1744
16
1596
56
1537
28
1396
31
最新のPHP開発とベストプラクティスを最新の狀態(tài)に保つにはどうすればよいですか?
Jun 23, 2025 am 12:56 AM
PHPとは何ですか、そしてなぜそれがWeb開発に使用されるのですか?
Jun 23, 2025 am 12:55 AM
PHPタイムゾーンを設(shè)定する方法は?
Jun 25, 2025 am 01:00 AM
PHPでのユーザー入力を検証して、特定の基準(zhǔn)を満たすことを確認(rèn)するにはどうすればよいですか?
Jun 22, 2025 am 01:00 AM
PHP(serialize()、unserialize())のデータシリアル化とは何ですか?
Jun 22, 2025 am 01:03 AM
HTMLファイルにPHPコードを埋め込むにはどうすればよいですか?
Jun 22, 2025 am 01:00 AM
クリーンで保守可能なPHPコードを書くためのベストプラクティスは何ですか?
Jun 24, 2025 am 12:53 AM