这会阻止我的网页呈现吗?

时间:2015-11-18 22:16:01

标签: php background-process

在PHP的开头,生成我网站的所有页面就像

log_visitor_info(
    $_SERVER['REMOTE_ADDR'],
    $_SERVER['REQUEST_URI'],
    $_SERVER['HTTP_REFERER'],
    $_SERVER['HTTP_USER_AGENT']
);

调用函数

function log_visitor_info ( $ip, $pgurl, $refurl, $aginfo )
{
    global $wpdb, $ipsToIgnore; 
    if (!in_array($ip, $ipsToIgnore)) {
        $wpdb->insert('wp_nas_visits',  array(
            'ip'=>$ip,
            'refurl'=>$refurl,
            'pgurl'=>$pgurl,
            'aginfo'=>$aginfo
        ));
    }
}

$wpdb->insert正在向数据库插入内容。因为我在页面的其他任何位置都不需要任何此类信息,所以我希望能够异步执行log_visitor_info或在背景中执行"如果愿意的话。我认为它减慢了我的页面加载速度。有什么方法可以将log_visitor_info放在我单独执行的服务器队列中(如果这样的话甚至存在......)?我有Windows Server 2012。

1 个答案:

答案 0 :(得分:2)

未经过测试,我不是WordPress的人或粉丝,但如果你想使用AJAX,应该适应。首先,创建一个PHP页面(logger.php)并添加以下内容:

//include files needed to instantiate $wpdb

$ipsToIgnore  = unserialize($argv[1]);
$dataToInsert = unserialize($argv[2]);

if (!in_array($dataToInsert['ip'], $ipsToIgnore)) $wpdb->insert('wp_nas_visits', $dataToInsert);

其次,在生成网站所有页面的PHP开头,用以下代码替换你的函数和函数调用:

$ips  = escapeshellarg(serialize($ipsToIgnore));
$args = escapeshellarg(serialize(array('ip'     => $_SERVER['REMOTE_ADDR'],
                                       'pgurl'  => $_SERVER['REQUEST_URI'],
                                       'refurl' => $_SERVER['HTTP_REFERER'],
                                       'aginfo' => $_SERVER['HTTP_USER_AGENT'])));

pclose(popen("start /B /path/to/php.exe /path/to/logger.php $ips $args", "r"));

你可能需要escapeshellarg() php.exe的路径和logger.php的路径,特别是如果它们中有空格的话。