1

ロギングには REST を使用します。単純なテキストログで提供できる情報よりも多くの情報が必要です。そこで、イベントに関するいくつかの基本的な情報を受け取り、イベントのソース Web から詳細を非同期に取得する REST サービスを実装しました。したがって、これは事実上、追加情報がほとんどない ping です。ロガー マシンは API キーを検証し、DB に接続して、より詳細な情報へのポインターと共に基本情報を書き込みます。

ただし、接続と応答の待機にかなりの時間がかかるため、ロギングによってアプリの速度が大幅に低下する可能性があるという問題があります (高速ですが、1 つの要求で 10 個以上のイベントをログに記録すると問題になります)。

質問は:

プレーンな PHP (5.3) で URL へのリクエストを実行し、応答を待たずに、または HTTP 200 ヘッダーが確実になるのを待つ方法ありますか?

ロギング サーバーがリクエストを受け取るとすぐに HTTP 200 ヘッダーを送信するようにできると思います。しかし、それにはもう少し作業を行う必要があります;)

4

2 に答える 2

1

役立つかもしれない2つのトリックを次に示します。

I. http 接続が閉じられた後、実行を続行します。つまり、メイン関数が終了したらすぐに接続を閉じてから、ログ プロセスを続行できます。

<?php
ignore_user_abort(true);//avoid apache to kill the php running
ob_start();//start buffer output
echo "show something to user";//do something you need -- your main function
session_write_close();//close session file on server side if needed
header("Content-Encoding: none");//send header to avoid the browser side to take content as gzip format
header("Content-Length: ".ob_get_length());//send length header
header("Connection: close");//or redirect to some url 
ob_end_flush();flush();//really send content, can't change the order:1.ob buffer to normal buffer, 2.normal buffer to output
//continue do something on server side
ob_start();
sleep(5);//the user won't wait for the 5 seconds
echo 'for log';//user can't see this
file_put_contents('/tmp/process.log', ob_get_contents());
// or call remote server like http://your.log.server/log.php?xxx=yyy&aaa=bbb
ob_end_clean();
?>

Ⅱ.関数 apache_note を使用してログを書き込むことは、DB に挿入するよりもかなり軽量な選択です。Apache はログ ファイルを開き、Apache の実行中にハンドルを保持するためです。安定していて本当に速いです。

アパッチ構成:

<VirtualHost *:80>
DocumentRoot /path/to/your/web
ServerName your.domain.com
ErrorLog /path/to/your/log/error_log
    <Directory /path/to/your/web>
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
    SetEnvIf Request_URI "/log\.php" mylog
    LogFormat "%{mylog}n" log1
    CustomLog "|/usr/sbin/cronolog /path/to/logs/mylog/%Y%m%d/mysite.%Y%m%d%H.log" log1 env=mylog
</VirtualHost>

PHP コード:

<?php
apache_note('mylog', session_id()); //you can log any data you need, see http://www.php.net/manual/en/function.apache-note.php

次に、I と II の両方のトリックを使用して、URL http://your.log.server/log.php?xxx=yyy&aaa=bbbを呼び出して、メイン ページの接続が閉じられた後に詳細データをログに記録します。余分な時間コストはまったく必要ありません。

于 2013-04-22T02:40:41.810 に答える