検索
ホームページバックエンド開発PHPチュートリアルキープアライブとパイプラインリクエスト処理のnginx分析

元の記事、転載の際は明記してください:pagefaultから転載

この記事のリンクアドレス:キープアライブとパイプラインリクエスト処理のnginx分析

今回は主にnginxにおけるキープアライブとパイプラインの処理について見ていきます。ここで概念を紹介する必要はありません。 nginx がどのように行うかを直接見てみましょう。 まずキープアライブの処理を見てみましょう。クライアントが明示的に接続ヘッダーを close として指定しない限り、http 1.1 ではキープアライブがデフォルトであることがわかっています。以下は、キープアライブが必要かどうかを判断する nginx のコードです。

{コード>................................................ .. ...

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

voidvoid

ngx_http_handler(ngx_http_request_t *r)

{

.........................................

        switch(r->headers_in.connection_type) {

        case0:

//如果版本大于1.0则默认是keepalive

            r->keepalive = (r->http_version > NGX_HTTP_VERSION_10);

            break;

        caseNGX_HTTP_CONNECTION_CLOSE:

//如果指定connection头为close则不需要keepalive

            r->keepalive = 0;

            break;

        caseNGX_HTTP_CONNECTION_KEEP_ALIVE:

            r->keepalive = 1;

            break;

        }

..................................

}

ngx_http_handler(ngx_http_request_t *r) code >
🎜 switch(r->headers_in.connection_type) {🎜🎜 code> <code>case0:🎜🎜//バージョンが 1.0 より大きい場合、デフォルトはキープアライブです🎜🎜 r- >keepalive = (r->http_version > NGX_HTTP_VERSION_10);🎜🎜 break; 🎜🎜 /code><code>caseNGX_HTTP_CONNECTION_CLOSE:​​ode>🎜🎜<code>//接続ヘッダーが close として指定されている場合、キープアライブは必要ありません🎜 🎜 <code>r->keeper code>caseNGX_HTTP_CONNECTION_KEEP_ALIVE:​​ode>🎜🎜<code>コード>break;🎜🎜 コード>}コード>🎜🎜................................ ....🎜🎜}🎜🎜🎜🎜🎜🎜
すると、キープアライブは、現在の http リクエストが実行された直後に現在の接続が閉じられないことを意味することがわかります。そのため、nginx のキープアライブの関連処理は、リクエストをクリーンアップする機能でもあります。 nginx のリクエストをクリーンアップする関数は ngx_http_finalize_request です。この関数では、接続を解放するために ngx_http_finalize_connection が呼び出され、キープアライブの関連する判断がこの関数内にあります。

ngx_http_finalize_connection(ngx_http_request_t *r)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

staticvoid

ngx_http_finalize_connection(ngx_http_request_t *r)

{

    ngx_http_core_loc_conf_t  *clcf;

    clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);

.....................................................................

//可以看到如果设置了keepalive,并且timeout大于0,就进入keepalive的处理。

    if(!ngx_terminate

         && !ngx_exiting

         && r->keepalive

         && clcf->keepalive_timeout > 0)

    {

        ngx_http_set_keepalive(r);

        return;

    静的void elseif(r->lingering_close && clcf->lingering_timeout > 0) {

        ngx_http_set_lingering_close(r);

        return;

    }

    ngx_http_close_request(r, 0);

}

🎜{ 🎜🎜🎜🎜 🎜🎜ngx_http_core_loc_conf_t *clcf;🎜🎜🎜🎜 🎜🎜clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);🎜🎜🎜🎜. .................................................................🎜 🎜 🎜🎜//キープアライブが設定されており、タイムアウトが0より大きい場合、キープアライブ処理に入ることがわかります。 🎜🎜🎜🎜 r->キープアライブ🎜🎜🎜 🎜 🎜🎜&& clcf->keepalive_timeout > 🎜 🎜🎜🎜 🎜🎜{🎜🎜🎜🎜 🎜🎜ngx_http_set_keepalive(r);🎜🎜🎜 🎜🎜🎜🎜 🎜🎜} 🎜🎜else🎜🎜if🎜🎜(r->lingering_close && clcf->lingering_timeout > 0) {🎜🎜🎜 🎜 🎜🎜}🎜🎜🎜🎜 🎜🎜ngx_http_close_request(r, 0);🎜🎜🎜🎜 }🎜🎜🎜🎜🎜🎜🎜上記から、キープアライブが ngx_http_set_keepalive を通じて設定されていることがわかります。次に、この関数を詳しく見ていきます。 この関数ではパイプラインリクエストもついでに処理しますので、まずnginxがクライアントから読み込んだデータにさらに多くのデータが含まれている場合、つまりAfterを解析する際にどのようにパイプラインリクエストを区別するのかを一緒に見ていきましょう。現在のリクエストが完了しても、まだデータがいくつかあります。これはパイプライン リクエストとみなされます。 もう 1 つの非常に重要な点は http_connection です。前のブログから、大きなヘッダーを割り当てる必要がある場合は、最初に hc->free から取得され、そうでない場合は作成されてから hc に渡されることがわかります。 -> ;管理が忙しいです。そして、この buf はここで再利用されます。これは、大きな buf が大きい場合、2 回目の再割り当てが必要になるためです。ここで buf を再利用すると、1 つの割り当てが減ります。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

2 7

28

29

30

31

32

33

34

35

36

37

38

39

40

41

    hc = r->http_connection;

    b = r->header_in;

//一般情况下,当解析完header_in之后,pos会设置为last。也就是读取到的数据刚好是一个完整的http请求.当pos小于last,则说明可能是一个pipeline请求。

    if(b->pos last) {

        /* the pipelined request */

        if(b != c->buffer) {

            /*

             * If the large header buffers were allocated while the previous

             * request processing then we do not use c->buffer for

             * the pipelined request (see ngx_http_init_request()).

             *

             * Now we would move the large header buffers to the free list.

             */

            cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module);

//如果free为空,则新建

            if(hc->free== NULL) {

//可以看到是large_client_headers的个数

                hc->free= ngx_palloc(c->pool,

                   hc = r->http_connection;sizeof(ngx_buf_t *));

                if(hc->free== NULL) {

                    ngx_http_close_request(r, 0);

                    return;

                }

🎜🎜 🎜b = r->header_in;🎜🎜🎜🎜//通常、header_in を解析した後、pos は last に設定されます。つまり、読み取られたデータは完全な http リクエストであるということは、pos が最後よりも小さい場合、それがパイプライン リクエストである可能性があることを意味します。 🎜🎜🎜🎜 🎜🎜if🎜🎜(b->pos last) {🎜🎜🎜🎜 🎜🎜if🎜🎜(b != c->buffer) {🎜🎜🎜🎜 🎜🎜 *処理を要求します。その後、c-&gtを使用しません。 = NULL) {🎜🎜🎜🎜//large_client_headers の数がわかります 🎜🎜🎜🎜 🎜🎜🎜🎜 cscf->large_client_header_buffers.num * 🎜🎜sizeof🎜🎜(ngx_buf_t *)); 🎜🎜🎜🎜〜🎜🎜

            }

//然后清理当前的request的busy

            for(i = 0; i nbusy - 1; i++) {

                f = hc->busy[i];

                hc->free[hc->nfree++] = f;

                f->pos = f->start;

                f->last = f->start;

            }

//保存当前的header_in buf,以便与下次给free使用。

            hc->busy[0] = b;

            hc->nbusy = 1;

        }

    }

然后接下来这部分就是free request,并设置keepalive 定时器.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

    r->keepalive = 0;

    ngx_http_free_request(r, 0);

    c->data = hc;

//设置定时器

    ngx_add_timer(rev, clcf->keepalive_timeout);

//然后设置可读事件

    if(ngx_handle_read_event(rev, 0) != NGX_OK) {

        ngx_http_close_connection(c);

        return;

    }

    wev = c->write;

    wev->handler = ngx_http_empty_handler;

然后接下来这部分就是对pipeline的处理。

f = hc->busy[i];

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

    if(b->pos last) {

        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log }"pipelined request");

#if (NGX_STAT_STUB)

        (void

//その後、現在のリクエストのビジー状態をクリーンアップします

#endif

//设置标记。

        hc->pipeline = 1;

        c->log 1; i++) {"reading client pipelined request line";

//然后扔进post queue,继续进行处理.

        rev->handler = ngx_http_init_request;

        ngx_post_event(rev, &ngx_posted_events);

        return;

    }

🎜🎜 🎜🎜f->pos = f->start;🎜🎜🎜🎜 er_in buf を次回無料で使用します。 🎜🎜🎜🎜 🎜🎜}🎜🎜🎜🎜 🎜🎜}🎜🎜🎜🎜🎜 🎜🎜🎜🎜次の部分は無料リクエストを実行し、キープアライブ タイマーを設定します。🎜🎜
🎜1🎜🎜2🎜🎜3 🎜🎜4🎜🎜5🎜🎜6🎜🎜7🎜🎜8🎜🎜9🎜🎜10🎜🎜11🎜🎜12🎜 🎜13🎜🎜14 🎜🎜15🎜 🎜 🎜🎜🎜 🎜🎜r->keepalive = 0;🎜🎜🎜🎜 🎜🎜ngx_http_free_request(r, 0);🎜🎜🎜🎜 🎜🎜c ->data = hc;🎜🎜🎜🎜//タイマーを設定します🎜🎜 🎜🎜 🎜🎜ngx_add_timer(rev, clcf->keepalive_timeout);🎜🎜🎜🎜//次に読み取り可能なイベントを設定します🎜🎜🎜 🎜 🎜 🎜if🎜🎜(ngx_handle_read_event(rev, 0) != NGX_OK) {🎜🎜🎜🎜 🎜🎜ngx_http_close_connection(c); 🎜🎜 🎜🎜wev->handler = _ハンドラー;🎜🎜🎜🎜 🎜 🎜🎜🎜次の部分はパイプラインの処理です。🎜🎜
🎜1🎜🎜2🎜🎜3🎜🎜4 🎜5🎜🎜6🎜🎜7🎜🎜8🎜🎜9🎜🎜10🎜🎜11🎜🎜12🎜🎜13🎜🎜14🎜🎜15🎜🎜 🎜 🎜 🎜 🎜🎜if🎜🎜(b-> ; pos last) {🎜🎜🎜🎜 🎜🎜ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->🎜🎜ログ🎜🎜, 0、🎜🎜「パイプラインリクエスト」🎜🎜);🎜🎜🎜🎜#if (NGX_STAT_STUB)🎜🎜🎜🎜 _reading, 1);🎜🎜🎜🎜#endif🎜🎜🎜🎜//タグを設定します。 🎜🎜🎜🎜 🎜🎜「クライアントのパイプラインリクエストラインを読み取り中」🎜🎜;🎜🎜🎜🎜//その後、それを投稿キューにスローして処理を続行します 🎜🎜ngx_post_event(rev, &ngx_posted_events);一番下に達すると、パイプラインリクエストではないことを意味するため、リクエストと http_connection のクリーンアップを開始します。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

2 7

28

29

30

    if(ngx_pfree(c->pool, r) == NGX_OK) {

        hc->request = NULL;

    }

    b = c->buffer;

    if(ngx_pfree(c->pool, b->start) == NGX_OK) {

        /*

         * the special note for ngx_http_keepalive_handler() that

         * c->buffer's memory was freed

         */

        b->pos = NULL;

    }else{

        b->pos = b->start;

        b->last = b->start;

    }

.....................................................................

    if(hc->busy) {

        for(i = 0; i nbusy; i++) {

            ngx_pfree(c->pool, hc->busy[i]->start);

            hc->busy[i] = NULL;

        }

        hc->nbusy = 0;

    }

设置keepalive的handler。

b = c->buffer;

1

2

3

4

5

6

7

8

9

//后面会详细分析这个函数

    rev->handler = ngx_http_keepalive_handler;

    if(wev->active && (ngx_event_flags & NGX_USE_LEVEL_EVENT)) {

        if(ngx_del_event(wev, NGX_WRITE_EVENT, 0) != NGX_OK) {

            ngx_http_close_connection(c);

            return;

        }

    }

🎜🎜 🎜🎜if🎜🎜(ngx_pfree(c->pool, b->start) == NGX_OK) {🎜 🎜🎜🎜🎜🎜🎜🎜* NGX_HTTP_KEEPALIVE_HANDLERの特別なメモ()that🎜🎜🎜🎜* c-&gt;バッファーのメモリは解放されました🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜} 「🎜🎜🎜🎜🎜}🎜🎜🎜🎜......................................」 ......................................🎜🎜🎜🎜 = 0; i busy[i] = NULL;🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜キープアライブハンドラを設定します。 🎜🎜🎜🎜🎜🎜🎜🎜1🎜🎜2🎜🎜3🎜🎜4🎜🎜5🎜🎜6🎜🎜7🎜🎜8🎜🎜9🎜🎜🎜🎜 🎜🎜//この関数は後で詳しく分析します🎜 🎜🎜0)!= ngx_ok){🎜🎜🎜🎜🎜最後は、ここでは紹介しませんが、次は nginx の tcp プッシュの動作を特別にブログで紹介します。 次に、ngx_http_keepalive_handler 関数を見てみましょう。この関数は、接続上に読み取り可能なイベントが再び存在すると、このハンドラーが呼び出されます。 このハンドラーは比較的単純で、新しい buf を作成し、http リクエストの実行を再開するだけです (ngx_http_init_request を呼び出します)。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

b = c->buffer;    b = c->buffer;

    size = b->end - b->start;

    if(b->pos == NULL) {

        /*

         * The c->buffer's memory was freed by ngx_http_set_keepalive().

         * However, the c->buffer->start and c->buffer->end were not changed

         * to keep the buffer size.

         */

//重新分配buf

        b->pos = ngx_palloc(c->pool, size);

        if(b->pos == NULL) {

            ngx_http_close_connection(c);

            return;

        }

        b->start = b->pos;

        b->last = b->pos;

        b->end = b->pos + size;

    }

然后尝试读取数据,如果没有可读数据,则会将句柄再次加入可读事件

1

2

3

4

5

6

7

8

9

n = c->recv(c, b->last, size);

c->log_error = NGX_ERROR_INFO;

if(n == NGX_AGAIN) {

    if(ngx_handle_read_event(rev, 0) != NGX_OK) {

        ngx_http_close_connection(c);

    }

    return;

}

最后如果读取了数据,则进入request的处理。

if(b-> ;pos == NULL) { /*

1

ngx_http_init_request(rev);

size = b->end - b->start;
🎜 * c->buffer のメモリはngx_http_set_keepalive() によって解放されました。🎜🎜 * ただし、c->buffer->start と c->buffer->end は変更されませんでした。🎜🎜 * code> code>🎜🎜<code> * バッファ サイズを維持します。🎜🎜 */🎜🎜 // buf を再割り当てします🎜🎜 b->pos = ngx_palloc(c->pool, size);🎜🎜 if(b->pos == NULL) {🎜🎜 ngx_http_close_connection(c);🎜🎜 b->start = b->pos;🎜🎜 b-> ;last = b->pos;🎜🎜 b->last = b->pos;🎜🎜 /code>b->end = b->pos + size;🎜🎜 }🎜🎜🎜🎜🎜🎜🎜🎜🎜 次に、データの読み取りを試みます。読み取り可能なデータがない場合は、ハンドルが読みやすいイベントまた🎜🎜🎜🎜🎜🎜🎜🎜1🎜🎜2🎜🎜3🎜🎜4🎜🎜5🎜🎜6🎜🎜7🎜🎜8🎜🎜9🎜🎜🎜 🎜🎜n = c-> recv(c, b->last, size);🎜🎜c->log_error = NGX_ERROR_INFO; code>🎜🎜if( n == NGX_AGAIN) {🎜🎜 if(ngx_handle_read_event(rev , 0) != NGX_OK) {🎜🎜 ngx_http_close_connection(c);🎜🎜 } 🎜🎜 return;🎜🎜}🎜🎜🎜🎜🎜🎜🎜🎜🎜最後にデータが読み取れたらリクエスト処理に入ります。 🎜🎜🎜🎜🎜🎜🎜🎜1🎜🎜🎜🎜🎜ngx_http_init_request(rev);🎜🎜🎜🎜🎜🎜最後に、ngx_http_init_request 関数を見てみましょう。今回は主に、パイプラインがリクエストされたときに nginx がリクエストをどのように再利用するかを見ていきます。
ここで hc->busy[0] に注意してください。これがパイプライン リクエストの場合、以前に解析されていないリクエスト header_in を保存することがわかっています。これは、その 2 番目のリクエストを読み取っている可能性があるためです。パイプラインリクエスト。

if(r) {

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

//取得request,这里我们知道,在pipeline请求中,我们会保存前一个request.

    r = hc->request;

    if(r) {

//如果存在,则我们重用前一个request.

        //リクエストを取得します。ここでパイプラインにあることがわかりますrequest 、前のリクエストを保存します。sizeof(ngx_http_request_t));

        r->pipeline = hc->pipeline;

//如果nbusy存在

        if(hc->nbusy) {

//则保存这个header_in,然后下面直接解析。

            r->header_in = hc->busy[0];

        }

     else{

        r = hc->request;sizeof(ngx_http_request_t));

        if(r == NULL) {

            ngx_http_close_connection(c);

            return;

        }

        hc->request = r;

    }

//保存请求

    c->data = r;

// 存在する場合は、前のリクエストを再利用しますリクエスト .

🎜sizeof🎜🎜(ngx_http_request_t));🎜🎜🎜 🎜🎜r->pipeline = hc->pipeline;🎜🎜🎜🎜// nbusy が存在する場合🎜🎜🎜 ️ ;n忙しい) {🎜🎜🎜🎜/ /この header_in を保存し、その直下で解析します。 GR-& gt; header_in = hc-& gt; ビジー 🎜🎜🎜🎜} 🎜🎜else🎜🎜{🎜🎜🎜🎜 🎜🎜r = ngx_pcalloc(c->pool, 🎜🎜sizeof🎜🎜(ngx_http_request_t)); 🎜🎜🎜🎜 _connection(c);🎜🎜🎜🎜 🎜 🎜🎜🎜🎜c-> data = r;🎜🎜🎜 🎜🎜🎜🎜🎜🎜🎜上記のコードより前回のブログと組み合わせると、大きなヘッダーは主にパイプライン用であることがわかります。パイプラインでは、前のリクエストが次のリクエスト ヘッダーをさらに読み込むと、次回解析されるときに最初に割り当てられた client_header_buffer_size を超える可能性があるためです。今回は、大きなヘッダーであるヘッダーを再割り当てする必要があるため、ここでの httpconnection は主にパイプライン状況用であり、キープアライブです。接続がパイプライン リクエストではない場合、メモリを節約するために、前のリクエストは次のようになります。リリースされました。🎜 🎜 上記では、プロセスの側面を含め、nginx のキープアライブおよびパイプライン リクエスト処理の分析を紹介しました。これが、PHP チュートリアルに興味のある友人に役立つことを願っています。 🎜 🎜 🎜
声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
PHPの現在のステータス:Web開発動向を見てくださいPHPの現在のステータス:Web開発動向を見てくださいApr 13, 2025 am 12:20 AM

PHPは、現代のWeb開発、特にコンテンツ管理とeコマースプラットフォームで依然として重要です。 1)PHPには、LaravelやSymfonyなどの豊富なエコシステムと強力なフレームワークサポートがあります。 2)パフォーマンスの最適化は、Opcacheとnginxを通じて達成できます。 3)PHP8.0は、パフォーマンスを改善するためにJITコンパイラを導入します。 4)クラウドネイティブアプリケーションは、DockerおよびKubernetesを介して展開され、柔軟性とスケーラビリティを向上させます。

PHP対その他の言語:比較PHP対その他の言語:比較Apr 13, 2025 am 12:19 AM

PHPは、特に迅速な開発や動的なコンテンツの処理に適していますが、データサイエンスとエンタープライズレベルのアプリケーションには良くありません。 Pythonと比較して、PHPはWeb開発においてより多くの利点がありますが、データサイエンスの分野ではPythonほど良くありません。 Javaと比較して、PHPはエンタープライズレベルのアプリケーションでより悪化しますが、Web開発により柔軟性があります。 JavaScriptと比較して、PHPはバックエンド開発により簡潔ですが、フロントエンド開発のJavaScriptほど良くありません。

PHP対Python:コア機能と機能PHP対Python:コア機能と機能Apr 13, 2025 am 12:16 AM

PHPとPythonにはそれぞれ独自の利点があり、さまざまなシナリオに適しています。 1.PHPはWeb開発に適しており、組み込みのWebサーバーとRich Functionライブラリを提供します。 2。Pythonは、簡潔な構文と強力な標準ライブラリを備えたデータサイエンスと機械学習に適しています。選択するときは、プロジェクトの要件に基づいて決定する必要があります。

PHP:Web開発の重要な言語PHP:Web開発の重要な言語Apr 13, 2025 am 12:08 AM

PHPは、サーバー側で広く使用されているスクリプト言語で、特にWeb開発に適しています。 1.PHPは、HTMLを埋め込み、HTTP要求と応答を処理し、さまざまなデータベースをサポートできます。 2.PHPは、ダイナミックWebコンテンツ、プロセスフォームデータ、アクセスデータベースなどを生成するために使用され、強力なコミュニティサポートとオープンソースリソースを備えています。 3。PHPは解釈された言語であり、実行プロセスには語彙分析、文法分析、編集、実行が含まれます。 4.PHPは、ユーザー登録システムなどの高度なアプリケーションについてMySQLと組み合わせることができます。 5。PHPをデバッグするときは、error_reporting()やvar_dump()などの関数を使用できます。 6. PHPコードを最適化して、キャッシュメカニズムを使用し、データベースクエリを最適化し、組み込み関数を使用します。 7

PHP:多くのウェブサイトの基礎PHP:多くのウェブサイトの基礎Apr 13, 2025 am 12:07 AM

PHPが多くのWebサイトよりも優先テクノロジースタックである理由には、その使いやすさ、強力なコミュニティサポート、広範な使用が含まれます。 1)初心者に適した学習と使用が簡単です。 2)巨大な開発者コミュニティと豊富なリソースを持っています。 3)WordPress、Drupal、その他のプラットフォームで広く使用されています。 4)Webサーバーとしっかりと統合して、開発の展開を簡素化します。

誇大広告を超えて:今日のPHPの役割の評価誇大広告を超えて:今日のPHPの役割の評価Apr 12, 2025 am 12:17 AM

PHPは、特にWeb開発の分野で、最新のプログラミングで強力で広く使用されているツールのままです。 1)PHPは使いやすく、データベースとシームレスに統合されており、多くの開発者にとって最初の選択肢です。 2)動的コンテンツ生成とオブジェクト指向プログラミングをサポートし、Webサイトを迅速に作成および保守するのに適しています。 3)PHPのパフォーマンスは、データベースクエリをキャッシュおよび最適化することで改善でき、その広範なコミュニティと豊富なエコシステムにより、今日のテクノロジースタックでは依然として重要になります。

PHPの弱い参照は何ですか、そしていつ有用ですか?PHPの弱い参照は何ですか、そしていつ有用ですか?Apr 12, 2025 am 12:13 AM

PHPでは、弱い参照クラスを通じて弱い参照が実装され、ガベージコレクターがオブジェクトの回収を妨げません。弱い参照は、キャッシュシステムやイベントリスナーなどのシナリオに適しています。オブジェクトの生存を保証することはできず、ごみ収集が遅れる可能性があることに注意する必要があります。

PHPで__invoke Magicメソッドを説明してください。PHPで__invoke Magicメソッドを説明してください。Apr 12, 2025 am 12:07 AM

\ _ \ _ Invokeメソッドを使用すると、オブジェクトを関数のように呼び出すことができます。 1。オブジェクトを呼び出すことができるように\ _ \ _呼び出しメソッドを定義します。 2。$ obj(...)構文を使用すると、PHPは\ _ \ _ Invokeメソッドを実行します。 3。ロギングや計算機、コードの柔軟性の向上、読みやすさなどのシナリオに適しています。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

SecLists

SecLists

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

EditPlus 中国語クラック版

EditPlus 中国語クラック版

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

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール