hypweb.net
XOOPSマニア  最新情報のRSS(サイト全体)
[ 自宅サーバーWebRing |ID=54 前後5表示乱移動サイト一覧 ]

17年10月23日(Mon) 2時23分
TOP » フォーラム » XOOPS » XOOPS一般 » アクション時のイベント通知を遅延実行してみたらどうだろうか

アクション時のイベント通知を遅延実行してみたらどうだろうか


投稿ツリー


前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2015-3-31 23:48
nao-pon  Webmaster 居住地: 愛知県  投稿数: 5752

投稿時などにモジュールによってはイベント通知の処理が入ります。

E-mail 通知などの件数が多いと、処理に時間が掛かりプチフリーズしたような感じになり、送信されていないと思ったユーザーが投稿ボタンを2度押ししたり、なによりレスポンスが悪くてイケてません。

そこで、イベント通知の処理をブラウザにデータ送信後、コネクションが切れてから遅延実行する仕組みを考えてみました。

サーバーへの投稿時には、XOOPS のリダイレクト関数 redirect_header() を利用することが多いので、まずはこの関数の出力で、ブラウザに Content-Length ヘッダを通知します。

include/functions.php の redirect_header()

403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
function redirect_header($url, $time = 3, $message = '', $addredirect = true)
{
    global $xoopsConfig, $xoopsRequestUri;
    if (preg_match('/[\\0-\\31]/', $url) || preg_match('/^(javascript|vbscript|about):/i', $url)) {
        $url = XOOPS_URL;
    }
    if (!defined('XOOPS_CPFUNC_LOADED')) {
        require_once XOOPS_ROOT_PATH.'/class/template.php';
        $xoopsTpl = new XoopsTpl();
        $xoopsTpl->assign('xoops_sitename', htmlspecialchars($xoopsConfig['sitename'], ENT_QUOTES));
        $xoopsTpl->assign('sitename', htmlspecialchars($xoopsConfig['sitename'], ENT_QUOTES));
        $xoopsTpl->assign('langcode', _LANGCODE);
        $xoopsTpl->assign('charset', _CHARSET);
        $xoopsTpl->assign('time', $time);
        if ($addredirect && strstr($url, 'user.php')) {
            if (!strstr($url, '?')) {
                $url .= '?xoops_redirect='.urlencode($xoopsRequestUri);
            } else {
                $url .= '&xoops_redirect='.urlencode($xoopsRequestUri);
            }
        }
        if (defined('SID') && (! isset($_COOKIE[session_name()]) || ($xoopsConfig['use_mysession'] && $xoopsConfig['session_name'] != '' && !isset($_COOKIE[$xoopsConfig['session_name']])))) {
            if ( strpos($url, XOOPS_URL) === 0 ) {
                if (!strstr($url, '?')) {
                    $connector = '?';
                }
                else {
                    $connector = '&';
                }
                if (strstr($url, '#')) {
                    $urlArray = explode( '#', $url );
                    $url = $urlArray[0] . $connector . SID;
                    if ( ! empty($urlArray[1]) ) {
                        $url .= '#' . $urlArray[1];
                    }
                }
                else {
                    $url .= $connector . SID;
                }
            }
        }
        $url = preg_replace("/&/i", '&', htmlspecialchars($url, ENT_QUOTES));
        $xoopsTpl->assign('url', $url);
        $message = trim($message) != '' ? $message : _TAKINGBACK;
        $xoopsTpl->assign('message', $message);
        $xoopsTpl->assign('lang_ifnotreload', sprintf(_IFNOTRELOAD, $url));
        $GLOBALS['xoopsModuleUpdate'] = 1;
        $xoopsTpl->display('db:system_redirect.html');
        exit();
    } else {
        $url = preg_replace("/&/i", '&', htmlspecialchars($url, ENT_QUOTES));
        echo '
        <html>
        <head>
        <title>'.htmlspecialchars($xoopsConfig['sitename']).'</title>
        <meta http-equiv="Content-Type" content="text/html; charset='._CHARSET.'" />
        <meta http-equiv="Refresh" content="'.$time.'; url='.$url.'" />
        <style type="text/css">
                body {background-color : #fcfcfc; font-size: 12px; font-family: Trebuchet MS,Verdana, Arial, Helvetica, sans-serif; margin: 0px;}
                .redirect {width: 70%; margin: 110px; text-align: center; padding: 15px; border: #e0e0e0 1px solid; color: #666666; background-color: #f6f6f6;}
                .redirect a:link {color: #666666; text-decoration: none; font-weight: bold;}
                .redirect a:visited {color: #666666; text-decoration: none; font-weight: bold;}
                .redirect a:hover {color: #999999; text-decoration: underline; font-weight: bold;}
        </style>
        </head>
        <body>
        <div align="center">
        <div class="redirect">
          <span style="font-size: 16px; font-weight: bold;">'.$message.'</span>
          <hr style="height: 3px; border: 3px #E18A00 solid; width: 95%;" />
          <p>'.sprintf(_IFNOTRELOAD, $url).'</p>
        </div>
        </div>
        </body>
        </html>';
    }
    exit();
}

403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
function redirect_header($url, $time = 3, $message = '', $addredirect = true)
{
    global $xoopsConfig, $xoopsRequestUri;
    if (preg_match('/[\\0-\\31]/', $url) || preg_match('/^(javascript|vbscript|about):/i', $url)) {
        $url = XOOPS_URL;
    }
    $out = '';
    if (!defined('XOOPS_CPFUNC_LOADED')) {
        require_once XOOPS_ROOT_PATH.'/class/template.php';
        $xoopsTpl = new XoopsTpl();
        $xoopsTpl->assign('xoops_sitename', htmlspecialchars($xoopsConfig['sitename'], ENT_QUOTES));
        $xoopsTpl->assign('sitename', htmlspecialchars($xoopsConfig['sitename'], ENT_QUOTES));
        $xoopsTpl->assign('langcode', _LANGCODE);
        $xoopsTpl->assign('charset', _CHARSET);
        $xoopsTpl->assign('time', $time);
        if ($addredirect && strstr($url, 'user.php')) {
            if (!strstr($url, '?')) {
                $url .= '?xoops_redirect='.urlencode($xoopsRequestUri);
            } else {
                $url .= '&amp;xoops_redirect='.urlencode($xoopsRequestUri);
            }
        }
        if (defined('SID') && (! isset($_COOKIE[session_name()]) || ($xoopsConfig['use_mysession'] && $xoopsConfig['session_name'] != '' && !isset($_COOKIE[$xoopsConfig['session_name']])))) {
            if ( strpos($url, XOOPS_URL) === 0 ) {
                if (!strstr($url, '?')) {
                    $connector = '?';
                }
                else {
                    $connector = '&amp;';
                }
                if (strstr($url, '#')) {
                    $urlArray = explode( '#', $url );
                    $url = $urlArray[0] . $connector . SID;
                    if ( ! empty($urlArray[1]) ) {
                        $url .= '#' . $urlArray[1];
                    }
                }
                else {
                    $url .= $connector . SID;
                }
            }
        }
        $url = preg_replace("/&amp;/i", '&', htmlspecialchars($url, ENT_QUOTES));
        $xoopsTpl->assign('url', $url);
        $message = trim($message) != '' ? $message : _TAKINGBACK;
        $xoopsTpl->assign('message', $message);
        $xoopsTpl->assign('lang_ifnotreload', sprintf(_IFNOTRELOAD, $url));
        $GLOBALS['xoopsModuleUpdate'] = 1;
        $out = $xoopsTpl->fetch('db:system_redirect.html');
    } else {
        $url = preg_replace("/&amp;/i", '&', htmlspecialchars($url, ENT_QUOTES));
        $out = '
        <html>
        <head>
        <title>'.htmlspecialchars($xoopsConfig['sitename']).'</title>
        <meta http-equiv="Content-Type" content="text/html; charset='._CHARSET.'" />
        <meta http-equiv="Refresh" content="'.$time.'; url='.$url.'" />
        <style type="text/css">
                body {background-color : #fcfcfc; font-size: 12px; font-family: Trebuchet MS,Verdana, Arial, Helvetica, sans-serif; margin: 0px;}
                .redirect {width: 70%; margin: 110px; text-align: center; padding: 15px; border: #e0e0e0 1px solid; color: #666666; background-color: #f6f6f6;}
                .redirect a:link {color: #666666; text-decoration: none; font-weight: bold;}
                .redirect a:visited {color: #666666; text-decoration: none; font-weight: bold;}
                .redirect a:hover {color: #999999; text-decoration: underline; font-weight: bold;}
        </style>
        </head>
        <body>
        <div align="center">
        <div class="redirect">
          <span style="font-size: 16px; font-weight: bold;">'.$message.'</span>
          <hr style="height: 3px; border: 3px #E18A00 solid; width: 95%;" />
          <p>'.sprintf(_IFNOTRELOAD, $url).'</p>
        </div>
        </div>
        </body>
        </html>';
    }
    header('Connection: close');
    header('Content-Length: ' . strlen($out));
    echo $out;
    exit;
}

こんな感じ。

kernel/notification.php の notifyUser()

冒頭

93
94
95
96
97
    function notifyUser($template_dir, $template, $subject, $tags)
    {
        // Check the user's notification preference.
 
        $member_handler = xoops_gethandler('member');

 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
    function notifyUser($template_dir, $template, $subject, $tags, $onshutdown = false)
    {
        if (! $onshutdown) {
            ignore_user_abort(true);
            register_shutdown_function(array($this, 'notifyUser'), $template_dir, $template, $subject, $tags, true);
            return true;
        }
 
        while (@ob_get_length() && @ob_end_flush());
        flush();
 
        // Check the user's notification preference.
 
        $member_handler =& xoops_gethandler('member');

こんな感じにすると、サックサクに動作するようになります。

しばらくテストをして、問題なければ XoopsX の pilot ブランチにコミットしようと思っています。

投票数:0 平均点:0.00
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2015-4-1 20:31
nao-pon  Webmaster 居住地: 愛知県  投稿数: 5752

試行錯誤して、

include/functions.php の redirect_header()

は変更せず

kernel/notification.php の notifyUser()

のみ次のように変更してみた。

 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
    function notifyUser($template_dir, $template, $subject, $tags, $onshutdown = false)
    {
        if (! $onshutdown) {
            // regist as shutdown function
            ignore_user_abort(true);
            register_shutdown_function(array($this, 'notifyUser'), $template_dir, $template, $subject, $tags, true);
            return true;
        }
 
        // execution at onshutdown
        
        // push current output all the way to the browser
        header('Connection: close', true);
        while (ob_get_level()){
            $len = ob_get_length();
            if ($len !== false) {
                header('Content-Length: '.$len, true);
            }
            @ob_end_flush();
        }
        flush();
 
        // Check the user's notification preference.
 
        $member_handler =& xoops_gethandler('member');
投票数:1 平均点:10.00
返信する

このトピックに投稿する

題名
ゲスト名
投稿本文

  条件検索へ

このページのTopへ
ログイン
ユーザ名:

パスワード:

オートログイン

Basic 認証 | SSLログイン

新規登録 | パスワード紛失



メインメニュー
ブックマーク
オンサイトブックマークは
ログインするとご利用になれます
[ログインする]
サイト内 Wiki
☆ 検索 ☆



高度な検索(サイト内)
FireFox検索プラグイン
オンライン状況
合計 51 人がオンライン中 :-)
(フォーラム : 1 人)

登録ユーザ: 0 & ゲスト: 51

もっと...
サイト情報
管理人

nao-pon
 

登録ユーザ数: 4470


Web Services by Yahoo! JAPAN
楽天ウェブサービスセンター
Amazon.co.jpアソシエイト
現在ページのQRコード
現在ページのQRコード
[携帯対応]
参照元情報