役立つかもしれない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を呼び出して、メイン ページの接続が閉じられた後に詳細データをログに記録します。余分な時間コストはまったく必要ありません。