Apa gunanya ini_set () di php?
Bab ini merinci bagaimana PHP bermain dengan konfigurasinya dan bagaimana ekstensi diharapkan terhubung ke langkah konfigurasi utama PHP, dengan mendaftar dan memanfaatkan pengaturan INI Show Validator dan jembatan memori globalSejauh ini bagus, mendaftar dan membaca kembali nilai pengaturan INI tidak terlalu sulit. Tapi cara kami menggunakannya di baris sebelumnya di atas jauh dari optimal Ada dua masalah yang akan diselesaikan pada saat yang sama dengan menggunakan API pengaturan INI 'lanjutan'
Solusinya adalah dengan menggunakan Dengan menggunakan API manajemen pengaturan INI lanjutan, kita dapat memberi tahu mesin untuk mendaftarkan pengaturan kita secara normal, tetapi kita juga dapat menginstruksikannya untuk memperbarui global selera kita setiap kali nilai pengaturan INI diubah. Karenanya, kapan pun kita ingin membaca kembali nilai kita, kita hanya perlu membaca global kita. Ini akan memberikan peningkatan kinerja jika kita perlu sering membaca nilai pengaturan INI, karena pencarian hashtable dan operasi pemeran tidak diperlukan lagi Catatan Anda harus merasa nyaman dengan global untuk melanjutkan membaca bab ini. Manajemen ruang global diperlakukan ke dalam babnya sendiri Untuk mendeklarasikan jembatan memori ke global, kita perlu membuat permintaan global, dan mengubah cara pengaturan INI dideklarasikan. Seperti ini ZEND_BEGIN_MODULE_GLOBALS(pib) zend_ulong max_rnd; ZEND_END_MODULE_GLOBALS(pib) ZEND_DECLARE_MODULE_GLOBALS(pib) PHP_INI_BEGIN() STD_PHP_INI_ENTRY("pib.rnd_max", "100", PHP_INI_ALL, OnUpdateLongGEZero, max_rnd, zend_pib_globals, pib_globals) PHP_INI_END() PHP_MINIT_FUNCTION(pib) { REGISTER_INI_ENTRIES(); return SUCCESS; } Kami mendeklarasikan nama global Empat parameter terakhir mewakili jembatan global. Kami memberi tahu bahwa kami ingin memperbarui php_printf("The value is : %lu", PIB_G(max_rnd));1 yang diwakili oleh simbol php_printf("The value is : %lu", PIB_G(max_rnd));2. Baca bab manajemen global jika tidak nyaman. Sebagai pengingat cepat, php_printf("The value is : %lu", PIB_G(max_rnd));3 menyatakan php_printf("The value is : %lu", PIB_G(max_rnd));1 struktur, dan php_printf("The value is : %lu", PIB_G(max_rnd));5 menyatakan php_printf("The value is : %lu", PIB_G(max_rnd));2 simbol dari jenis tersebut Catatan Secara internal, offsetof akan digunakan untuk menghitung potongan byte dari anggota php_printf("The value is : %lu", PIB_G(max_rnd));1, untuk dapat memperbarui bagian memori tersebut setiap kali 'pib. rnd_max' akan diubah Validator #define ZEND_INI_MH(name) int name(zend_ini_entry *entry, zend_string *new_value, void *mh_arg1, void *mh_arg2, void *mh_arg3, int stage) ZEND_API ZEND_INI_MH(OnUpdateLongGEZero) { zend_long *p, tmp; #ifndef ZTS char *base = (char *) mh_arg2; #else char *base; base = (char *) ts_resource(*((int *) mh_arg2)); #endif tmp = zend_atol(ZSTR_VAL(new_value), (int)ZSTR_LEN(new_value)); if (tmp < 0) { return FAILURE; } p = (zend_long *) (base+(size_t) mh_arg1); *p = tmp; return SUCCESS; }0, adalah validator default yang ada di PHP dan memvalidasi nilai dengan panjang lebih besar dari atau sama dengan nol. Validator diperlukan agar global diperbarui, karena pekerjaan seperti itu dilakukan ke validator Sekarang, untuk membaca kembali nilai pengaturan INI kita, kita hanya perlu membaca nilai php_printf("The value is : %lu", PIB_G(max_rnd));_ Dan kita selesai Mari kita lihat validator sekarang (
Validator hanya dipanggil saat pengaturan INI disetel atau diubah (ditulis ke), setiap kali langkah ini terjadi Peringatan Jika Anda ingin variabel global diperbarui dengan nilai pengaturan INI, Anda memerlukan validator. Mekanisme seperti itu tidak secara ajaib dilakukan oleh mesin, tetapi harus dilakukan secara eksplisit ke dalam validator Mari kita lihat kode sumber #define ZEND_INI_MH(name) int name(zend_ini_entry *entry, zend_string *new_value, void *mh_arg1, void *mh_arg2, void *mh_arg3, int stage) ZEND_API ZEND_INI_MH(OnUpdateLongGEZero) { zend_long *p, tmp; #ifndef ZTS char *base = (char *) mh_arg2; #else char *base; base = (char *) ts_resource(*((int *) mh_arg2)); #endif tmp = zend_atol(ZSTR_VAL(new_value), (int)ZSTR_LEN(new_value)); if (tmp < 0) { return FAILURE; } p = (zend_long *) (base+(size_t) mh_arg1); *p = tmp; return SUCCESS; }_0 #define ZEND_INI_MH(name) int name(zend_ini_entry *entry, zend_string *new_value, void *mh_arg1, void *mh_arg2, void *mh_arg3, int stage) ZEND_API ZEND_INI_MH(OnUpdateLongGEZero) { zend_long *p, tmp; #ifndef ZTS char *base = (char *) mh_arg2; #else char *base; base = (char *) ts_resource(*((int *) mh_arg2)); #endif tmp = zend_atol(ZSTR_VAL(new_value), (int)ZSTR_LEN(new_value)); if (tmp < 0) { return FAILURE; } p = (zend_long *) (base+(size_t) mh_arg1); *p = tmp; return SUCCESS; }_ Seperti yang Anda lihat, tidak ada yang rumit. Validator Anda diberi #define ZEND_INI_MH(name) int name(zend_ini_entry *entry, zend_string *new_value, void *mh_arg1, void *mh_arg2, void *mh_arg3, int stage) ZEND_API ZEND_INI_MH(OnUpdateLongGEZero) { zend_long *p, tmp; #ifndef ZTS char *base = (char *) mh_arg2; #else char *base; base = (char *) ts_resource(*((int *) mh_arg2)); #endif tmp = zend_atol(ZSTR_VAL(new_value), (int)ZSTR_LEN(new_value)); if (tmp < 0) { return FAILURE; } p = (zend_long *) (base+(size_t) mh_arg1); *p = tmp; return SUCCESS; }4 dan harus memvalidasinya. Ingatlah bahwa #define ZEND_INI_MH(name) int name(zend_ini_entry *entry, zend_string *new_value, void *mh_arg1, void *mh_arg2, void *mh_arg3, int stage) ZEND_API ZEND_INI_MH(OnUpdateLongGEZero) { zend_long *p, tmp; #ifndef ZTS char *base = (char *) mh_arg2; #else char *base; base = (char *) ts_resource(*((int *) mh_arg2)); #endif tmp = zend_atol(ZSTR_VAL(new_value), (int)ZSTR_LEN(new_value)); if (tmp < 0) { return FAILURE; } p = (zend_long *) (base+(size_t) mh_arg1); *p = tmp; return SUCCESS; }_4 bertipe zend_string *. #define ZEND_INI_MH(name) int name(zend_ini_entry *entry, zend_string *new_value, void *mh_arg1, void *mh_arg2, void *mh_arg3, int stage) ZEND_API ZEND_INI_MH(OnUpdateLongGEZero) { zend_long *p, tmp; #ifndef ZTS char *base = (char *) mh_arg2; #else char *base; base = (char *) ts_resource(*((int *) mh_arg2)); #endif tmp = zend_atol(ZSTR_VAL(new_value), (int)ZSTR_LEN(new_value)); if (tmp < 0) { return FAILURE; } p = (zend_long *) (base+(size_t) mh_arg1); *p = tmp; return SUCCESS; }0 mengambil nilai selama dan memeriksa apakah itu bilangan bulat positif. Seseorang harus mengembalikan #define ZEND_INI_MH(name) int name(zend_ini_entry *entry, zend_string *new_value, void *mh_arg1, void *mh_arg2, void *mh_arg3, int stage) ZEND_API ZEND_INI_MH(OnUpdateLongGEZero) { zend_long *p, tmp; #ifndef ZTS char *base = (char *) mh_arg2; #else char *base; base = (char *) ts_resource(*((int *) mh_arg2)); #endif tmp = zend_atol(ZSTR_VAL(new_value), (int)ZSTR_LEN(new_value)); if (tmp < 0) { return FAILURE; } p = (zend_long *) (base+(size_t) mh_arg1); *p = tmp; return SUCCESS; }_7 dari validator jika semuanya berjalan dengan baik dan #define ZEND_INI_MH(name) int name(zend_ini_entry *entry, zend_string *new_value, void *mh_arg1, void *mh_arg2, void *mh_arg3, int stage) ZEND_API ZEND_INI_MH(OnUpdateLongGEZero) { zend_long *p, tmp; #ifndef ZTS char *base = (char *) mh_arg2; #else char *base; base = (char *) ts_resource(*((int *) mh_arg2)); #endif tmp = zend_atol(ZSTR_VAL(new_value), (int)ZSTR_LEN(new_value)); if (tmp < 0) { return FAILURE; } p = (zend_long *) (base+(size_t) mh_arg1); *p = tmp; return SUCCESS; }8 jika tidak Kemudian muncul bagian untuk memperbarui global. #define ZEND_INI_MH(name) int name(zend_ini_entry *entry, zend_string *new_value, void *mh_arg1, void *mh_arg2, void *mh_arg3, int stage) ZEND_API ZEND_INI_MH(OnUpdateLongGEZero) { zend_long *p, tmp; #ifndef ZTS char *base = (char *) mh_arg2; #else char *base; base = (char *) ts_resource(*((int *) mh_arg2)); #endif tmp = zend_atol(ZSTR_VAL(new_value), (int)ZSTR_LEN(new_value)); if (tmp < 0) { return FAILURE; } p = (zend_long *) (base+(size_t) mh_arg1); *p = tmp; return SUCCESS; }_9 variabel digunakan untuk membawa semua jenis informasi ke validator Anda Catatan 'mh' adalah singkatan dari modif handler. Callback validator juga disebut callback handler modifikasi ZEND_INI_MH(onUpdateMaxRnd) { zend_long tmp; zend_long *p; #ifndef ZTS char *base = (char *) mh_arg2; #else char *base; base = (char *) ts_resource(*((int *) mh_arg2)); #endif p = (zend_long *) (base+(size_t) mh_arg1); tmp = zend_atol(ZSTR_VAL(new_value), (int)ZSTR_LEN(new_value)); if (tmp < 0 || tmp > 1000) { return FAILURE; } *p = tmp; return SUCCESS; } PHP_INI_BEGIN() STD_PHP_INI_ENTRY("pib.rnd_max", "100", PHP_INI_ALL, onUpdateMaxRnd, max_rnd, zend_pib_globals, pib_globals) PHP_INI_END()0 adalah pointer ke area memori yang mewakili awal memori struktur global Anda, dalam kasus kami, awal dari php_printf("The value is : %lu", PIB_G(max_rnd));2 memori yang dialokasikan. Perhatikan bahwa ketika kita berbicara tentang memori variabel global-permintaan, yang terakhir diakses secara berbeda jika Anda menggunakan mode ZTS atau tidak. Informasi lebih lanjut tentang ZTS dapat ditemukan di sini ZEND_INI_MH(onUpdateMaxRnd) { zend_long tmp; zend_long *p; #ifndef ZTS char *base = (char *) mh_arg2; #else char *base; base = (char *) ts_resource(*((int *) mh_arg2)); #endif p = (zend_long *) (base+(size_t) mh_arg1); tmp = zend_atol(ZSTR_VAL(new_value), (int)ZSTR_LEN(new_value)); if (tmp < 0 || tmp > 1000) { return FAILURE; } *p = tmp; return SUCCESS; } PHP_INI_BEGIN() STD_PHP_INI_ENTRY("pib.rnd_max", "100", PHP_INI_ALL, onUpdateMaxRnd, max_rnd, zend_pib_globals, pib_globals) PHP_INI_END()_2 diberikan offset yang dihitung dari anggota global Anda ( max_rnd untuk kami), dan Anda harus mengiris memori sendiri untuk mendapatkan pointer ke sana. Itu sebabnya kami menyimpan ZEND_INI_MH(onUpdateMaxRnd) { zend_long tmp; zend_long *p; #ifndef ZTS char *base = (char *) mh_arg2; #else char *base; base = (char *) ts_resource(*((int *) mh_arg2)); #endif p = (zend_long *) (base+(size_t) mh_arg1); tmp = zend_atol(ZSTR_VAL(new_value), (int)ZSTR_LEN(new_value)); if (tmp < 0 || tmp > 1000) { return FAILURE; } *p = tmp; return SUCCESS; } PHP_INI_BEGIN() STD_PHP_INI_ENTRY("pib.rnd_max", "100", PHP_INI_ALL, onUpdateMaxRnd, max_rnd, zend_pib_globals, pib_globals) PHP_INI_END()_0 sebagai pointer ZEND_INI_MH(onUpdateMaxRnd) { zend_long tmp; zend_long *p; #ifndef ZTS char *base = (char *) mh_arg2; #else char *base; base = (char *) ts_resource(*((int *) mh_arg2)); #endif p = (zend_long *) (base+(size_t) mh_arg1); tmp = zend_atol(ZSTR_VAL(new_value), (int)ZSTR_LEN(new_value)); if (tmp < 0 || tmp > 1000) { return FAILURE; } *p = tmp; return SUCCESS; } PHP_INI_BEGIN() STD_PHP_INI_ENTRY("pib.rnd_max", "100", PHP_INI_ALL, onUpdateMaxRnd, max_rnd, zend_pib_globals, pib_globals) PHP_INI_END()5 umum dan mentransmisikan ZEND_INI_MH(onUpdateMaxRnd) { zend_long tmp; zend_long *p; #ifndef ZTS char *base = (char *) mh_arg2; #else char *base; base = (char *) ts_resource(*((int *) mh_arg2)); #endif p = (zend_long *) (base+(size_t) mh_arg1); tmp = zend_atol(ZSTR_VAL(new_value), (int)ZSTR_LEN(new_value)); if (tmp < 0 || tmp > 1000) { return FAILURE; } *p = tmp; return SUCCESS; } PHP_INI_BEGIN() STD_PHP_INI_ENTRY("pib.rnd_max", "100", PHP_INI_ALL, onUpdateMaxRnd, max_rnd, zend_pib_globals, pib_globals) PHP_INI_END()2 ke ZEND_INI_MH(onUpdateMaxRnd) { zend_long tmp; zend_long *p; #ifndef ZTS char *base = (char *) mh_arg2; #else char *base; base = (char *) ts_resource(*((int *) mh_arg2)); #endif p = (zend_long *) (base+(size_t) mh_arg1); tmp = zend_atol(ZSTR_VAL(new_value), (int)ZSTR_LEN(new_value)); if (tmp < 0 || tmp > 1000) { return FAILURE; } *p = tmp; return SUCCESS; } PHP_INI_BEGIN() STD_PHP_INI_ENTRY("pib.rnd_max", "100", PHP_INI_ALL, onUpdateMaxRnd, max_rnd, zend_pib_globals, pib_globals) PHP_INI_END()7 Kemudian, Anda cukup memperbarui konten dengan nilai yang divalidasi dengan menulis ke penunjuk. ZEND_INI_MH(onUpdateMaxRnd) { zend_long tmp; zend_long *p; #ifndef ZTS char *base = (char *) mh_arg2; #else char *base; base = (char *) ts_resource(*((int *) mh_arg2)); #endif p = (zend_long *) (base+(size_t) mh_arg1); tmp = zend_atol(ZSTR_VAL(new_value), (int)ZSTR_LEN(new_value)); if (tmp < 0 || tmp > 1000) { return FAILURE; } *p = tmp; return SUCCESS; } PHP_INI_BEGIN() STD_PHP_INI_ENTRY("pib.rnd_max", "100", PHP_INI_ALL, onUpdateMaxRnd, max_rnd, zend_pib_globals, pib_globals) PHP_INI_END()_8 sebenarnya tidak digunakan Validator default dari PHP adalah ZEND_INI_MH(onUpdateMaxRnd) { zend_long tmp; zend_long *p; #ifndef ZTS char *base = (char *) mh_arg2; #else char *base; base = (char *) ts_resource(*((int *) mh_arg2)); #endif p = (zend_long *) (base+(size_t) mh_arg1); tmp = zend_atol(ZSTR_VAL(new_value), (int)ZSTR_LEN(new_value)); if (tmp < 0 || tmp > 1000) { return FAILURE; } *p = tmp; return SUCCESS; } PHP_INI_BEGIN() STD_PHP_INI_ENTRY("pib.rnd_max", "100", PHP_INI_ALL, onUpdateMaxRnd, max_rnd, zend_pib_globals, pib_globals) PHP_INI_END()9, ini_set('pib.rnd_max', 2048); /* returns false as 2048 is > 1000 */0, ini_set('pib.rnd_max', 2048); /* returns false as 2048 is > 1000 */1, ini_set('pib.rnd_max', 2048); /* returns false as 2048 is > 1000 */2, ini_set('pib.rnd_max', 2048); /* returns false as 2048 is > 1000 */3, dan ini_set('pib.rnd_max', 2048); /* returns false as 2048 is > 1000 */4. Nama mereka menggambarkan diri sendiri dan kode sumbernya juga (Anda dapat membacanya) Berdasarkan model seperti itu, kita dapat mengembangkan validator kita sendiri, yang memvalidasi terhadap bilangan bulat positif antara 0 dan 1000 misalnya ZEND_INI_MH(onUpdateMaxRnd) { zend_long tmp; zend_long *p; #ifndef ZTS char *base = (char *) mh_arg2; #else char *base; base = (char *) ts_resource(*((int *) mh_arg2)); #endif p = (zend_long *) (base+(size_t) mh_arg1); tmp = zend_atol(ZSTR_VAL(new_value), (int)ZSTR_LEN(new_value)); if (tmp < 0 || tmp > 1000) { return FAILURE; } *p = tmp; return SUCCESS; } PHP_INI_BEGIN() STD_PHP_INI_ENTRY("pib.rnd_max", "100", PHP_INI_ALL, onUpdateMaxRnd, max_rnd, zend_pib_globals, pib_globals) PHP_INI_END() Catatan Aman untuk menulis ke long yang tidak ditandatangani dari long, segera setelah rentang diperiksa, yang dilakukan oleh validator Sekarang, jika pengguna ingin mengubah pengaturan dan memberikan nilai yang salah yang tidak divalidasi, ini_set('pib.rnd_max', 2048); /* returns false as 2048 is > 1000 */5 hanya akan mengembalikan false ke tanah pengguna, dan tidak akan mengubah nilai ini_set('pib.rnd_max', 2048); /* returns false as 2048 is > 1000 */Dalam kasus sebaliknya, ini_set('pib.rnd_max', 2048); /* returns false as 2048 is > 1000 */_5 mengembalikan nilai lama dan mengubah nilai saat ini. Nilai baru yang diberikan menjadi nilai "lokal" saat ini sedangkan nilai default sebelumnya tetap sebagai "nilai master". ini_set('pib.rnd_max', 2048); /* returns false as 2048 is > 1000 */_7 atau ini_set('pib.rnd_max', 2048); /* returns false as 2048 is > 1000 */8 merinci nilai-nilai tersebut. Contoh ini_set('pib.rnd_max', 500); var_dump(ini_get_all('pib')); /* array(1) { ["pib.rnd_max"]=> array(3) { ["global_value"]=> string(3) "100" ["local_value"]=> string(3) "500" ["access"]=> int(7) } */ Harap diperhatikan bahwa panggilan balik validator Anda akan dipanggil setiap kali nilai diubah, dan diubah beberapa kali. Misalnya, untuk contoh kecil kami, validator yang kami rancang dipanggil tiga kali
Ingatlah juga bahwa pengakses nilai diperiksa oleh ini_set('pib.rnd_max', 2048); /* returns false as 2048 is > 1000 */5. Jika kami akan merancang pengaturan ini_set('pib.rnd_max', 500); var_dump(ini_get_all('pib')); /* array(1) { ["pib.rnd_max"]=> array(3) { ["global_value"]=> string(3) "100" ["local_value"]=> string(3) "500" ["access"]=> int(7) } */5, maka pengguna tidak akan dapat memodifikasinya menggunakan ini_set('pib.rnd_max', 2048); /* returns false as 2048 is > 1000 */5, karena ini_set('pib.rnd_max', 2048); /* returns false as 2048 is > 1000 */5 menggunakan ini_set('pib.rnd_max', 500); var_dump(ini_get_all('pib')); /* array(1) { ["pib.rnd_max"]=> array(3) { ["global_value"]=> string(3) "100" ["local_value"]=> string(3) "500" ["access"]=> int(7) } */8 sebagai pengakses. Ketidaksesuaian kemudian akan terdeteksi dan validator tidak akan dipanggil oleh mesin dalam kasus seperti itu Jika Anda perlu mengubah nilai pengaturan INI menjadi ekstensi Anda saat runtime, panggilan internal adalah ini_set('pib.rnd_max', 500); var_dump(ini_get_all('pib')); /* array(1) { ["pib.rnd_max"]=> array(3) { ["global_value"]=> string(3) "100" ["local_value"]=> string(3) "500" ["access"]=> int(7) } */9, inilah yang digunakan oleh userland ini_set('pib.rnd_max', 2048); /* returns false as 2048 is > 1000 */5 Apa yang dilakukan ini_set di PHP?Fungsi ini_set() memungkinkan Anda mengubah atribut sistem yang memengaruhi cara skrip Anda dieksekusi . Perubahan hanya memengaruhi skrip saat ini, dan akan kembali saat skrip berakhir. Untuk menggunakan ini_set() , berikan nilai yang ingin Anda ubah sebagai parameter pertama, dan nilai baru untuk digunakan sebagai parameter kedua.
Bagaimana cara menggunakan ini_set untuk email di PHP?Untuk menyetel parameter ini secara eksplisit dalam skrip, Anda harus menggunakan opsi ini_set(). ini_set("sendmail_from", "anda @ domain_host_anda. com"); Alamat email yang Anda tentukan harus merupakan domain yang dihosting di sistem kami. Harap perhatikan bahwa Anda harus menghapus spasi tambahan di antara tanda @.
Bagaimana cara mengatur batas memori di PHP?Untuk menggunakan fungsi ini untuk menambah batas memori, Anda cukup melakukannya. ini_set('memory_limit', '512MB'); Fungsi di atas akan menetapkan batas memori sebesar 512 MB.
Bagaimana cara mengatur batas memori tidak terbatas di PHP?Cara mengubah batas memori . Temukan php. Ini file yang digunakan oleh server web Anda. Anda dapat mengklik tautan "informasi lebih lanjut" di bagian PHP halaman status Drupal. . Edit parameter memory_limit di php. file ini (biasanya di bagian yang disebut Resource Limits). . Mulai ulang Apache |