Dynamisches Nginx-Array ngx_array_t
ngx_array_t ist ein dynamisches Array, das in Nginx entworfen wurde, ähnlich wie vector
1. Beispiel
<span style="font-size:18px;">#include <stdio.h> #include "ngx_config.h" #include "ngx_conf_file.h" #include "nginx.h" #include "ngx_core.h" #include "ngx_string.h" #include "ngx_palloc.h" #include "ngx_queue.h" volatile ngx_cycle_t *ngx_cycle; void ngx_log_error_core(ngx_uint_t level,ngx_log_t *log, ngx_err_t err, const char *fmt, ...) { } void dump_pool(ngx_pool_t* pool) { while (pool) { printf("pool = 0x%x\n", pool); printf(" .d\n"); printf(" .last =0x%x\n", pool->d.last); printf(" .end =0x%x\n", pool->d.end); printf(" .next =0x%x\n", pool->d.next); printf(" .failed =%d\n", pool->d.failed); printf(" .max = %d\n",pool->max); printf(" .current =0x%x\n", pool->current); printf(" .chain =0x%x\n", pool->chain); printf(" .large =0x%x\n", pool->large); printf(" .cleanup =0x%x\n", pool->cleanup); printf(" .log =0x%x\n", pool->log); printf("available pool memory = %d\n\n", pool->d.end -pool->d.last); ngx_pool_large_t*large = pool->large; printf("*****large_pool*******\n"); while(large) { printf("%p->",large); large= large->next; } printf("\n\n"); pool = pool->d.next; } } typedef struct { intarray[128]; // 128 * 4 = 512 }TestNode; int main() { ngx_pool_t *pool; printf("--------------------------------\n"); printf("create a new pool:\n"); printf("--------------------------------\n"); pool = ngx_create_pool(1024, NULL); dump_pool(pool); ngx_array_t*myArray = ngx_array_create(pool, 1, sizeof(TestNode)); printf("******ngx_array_create**********\n"); dump_pool(pool); TestNode*t1 = ngx_array_push(myArray); TestNode*t2 = ngx_array_push(myArray); printf("******ngx_array_push**********\n"); dump_pool(pool); ngx_array_destroy(myArray);// 这里什么也没做 dump_pool(pool); ngx_destroy_pool(pool); return 0; }</span>
Laufergebnis:
-------------------------------- create a new pool: -------------------------------- pool = 0x95ae020 .d .last = 0x95ae048 .end = 0x95ae420 .next = 0x0 .failed = 0 .max = 984 .current = 0x95ae020 .chain= 0x0 .large = 0x0 .cleanup = 0x0 .log = 0x0 available pool memory = 984 *****large_pool******* NULL ******ngx_array_create********** pool = 0x95ae020 .d .last = 0x95ae25c .end = 0x95ae420 .next = 0x0 .failed = 0 .max = 984 .current = 0x95ae020 .chain = 0x0 .large = 0x0 .cleanup = 0x0 .log = 0x0 available pool memory = 452 *****large_pool******* NULL ******ngx_array_push********** pool = 0x95ae020 .d .last = 0x95ae264 .end = 0x95ae420 .next = 0x0 .failed = 0 .max = 984 .current = 0x95ae020 .chain = 0x0 .large = 0x95ae25c .cleanup = 0x0 .log = 0x0 available pool memory = 444 *****large_pool******* 0x95ae25c->NULL ******ngx_array_destroy****** pool = 0x95ae020 .d .last = 0x95ae264 .end = 0x95ae420 .next = 0x0 .failed = 0 .max = 984 .current = 0x95ae020 .chain = 0x0 .large = 0x95ae25c .cleanup = 0x0 .log = 0x0 available pool memory = 444 *****large_pool******* 0x95ae25c->NULL
1. Anhand der Änderungen im verfügbaren Poolspeicher können wir erkennen, dass der von den Strukturen ngx_array_t und ngx_pool_large_t selbst belegte Speicher im Speicherpool zugewiesen ist.
Der Beweis kann aus dem Quellcode erhalten werden:
ngx_array_t *
ngx_array_create(ngx_pool_t *p , ngx_uint_t n, size_t size)
{
a = ngx_palloc(p, sizeof(ngx_array_t));
}
statische Leere *
ngx_palloc_large( ngx_pool_t* pool, size_t size)
{
large = ngx_palloc(pool,sizeof(ngx_pool_large_t));
}
2 Wenn ngx_array_push erweitert wird, wird der ursprünglich belegte Speicher nicht freigegeben. Sie können auf den Quellcode von ngx_array_push verweisen, der hier nicht veröffentlicht wird.
3. Wenn die Größe des zugewiesenen dynamischen Arrays die Kapazität eines Speicherpools (in diesem Fall 1024) überschreitet, wird ngx_palloc_large aufgerufen, um einen großen Speicherblock zuzuweisen.
4. Wenn der vom dynamischen Array belegte Speicher ein großer Speicherblock ist, führt ngx_array_destroy nichts aus und diese API wurde im Nginx-Kernel-Quellcode nicht aufgerufen.
Informationen zur Kompilierung finden Sie im vorherigen Artikel zur Analyse der ngx_queue_t-Struktur.
2. Referenzen:
"Vertiefendes Verständnis von Nginx" Tao Hui
http://blog.csdn.net/livelylittlefish/article/details/6586946
Das Obige stellt das dynamische Nginx-Array ngx_array_t vor, einschließlich des relevanten Inhalts. Ich hoffe, es wird für Freunde hilfreich sein, die sich für PHP-Tutorials interessieren.

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



php提交表单通过后,弹出的对话框怎样在当前页弹出php提交表单通过后,弹出的对话框怎样在当前页弹出而不是在空白页弹出?想实现这样的效果:而不是空白页弹出:------解决方案--------------------如果你的验证用PHP在后端,那么就用Ajax;仅供参考:HTML code

Linux printf wird in der Befehlszeile verwendet. Dieser Befehl wird zum Formatieren von Druckdaten verwendet. Das Befehlsformat von printf ist „printf FORMAT [ARGUMENT]...printf OPTION“, wobei die Option „help“ die Anzeige von Hilfeinformationen bedeutet Die Option „Version“ bedeutet Versionsinformationen anzeigen.

Der Unterschied zwischen putchar und printf: 1. Der Parametertyp von putchar ist int und der Parametertyp von printf ist string; 2. putchar kann nur ein Zeichen ausgeben, und printf kann mehrere Zeichen ausgeben. 3. putchar kann die Ausgabe nicht formatieren printf kann es formatieren. 4. putchar hat keinen Rückgabewert, printf gibt die Anzahl der erfolgreich ausgegebenen Zeichen zurück, printf ist nicht auf die Ausgabe auf die Konsole beschränkt.

Der Unterschied zwischen fprintf und printf besteht darin, dass das Ausgabeziel unterschiedlich ist. printf gibt die Ausgabe an den Standardausgabestream aus, während fprintf an den angegebenen Dateistream ausgibt. Wählen Sie die entsprechende Funktion aus, um bei Bedarf Ausgabevorgänge durchzuführen. Es ist zu beachten, dass die Funktion fprintf die Datei zuerst über die Funktion fopen öffnen und die Datei nach der Verwendung über die Funktion fclose schließen muss. Darüber hinaus ist eine Fehlerbehandlung erforderlich, wenn das Öffnen der Datei fehlschlägt oder ein Betriebsfehler auftritt.

图片消失如何解决先是图片文件上传$file=$_FILES['userfile']; if(is_uploaded_file($file['tmp_name'])){$query=mysql_query("INSERT INTO gdb_banner(image_src ) VALUES ('images/{$file['name'

不用数据库来实现用户的简单的下载,代码如下,但是却不能下载,请高手找下原因,文件路劲什么的没问题。

图片消失如何解决先是图片文件上传$file=$_FILES['userfile']; if(is_uploaded_file($file['tmp_name'])){$query=mysql_query("INSERT INTO gdb_banner(image_src ) VALUES ('images/{$file['name'
