在网页中用img标签实现php异步执行

最近写了个小网站,需要统计页面访问记录,于是直接把index.html改成index.php文件,然后内嵌读写数据库的php代码(php7.0)。
比较简单,如下:

<?php
$con = new mysqli('xxx.xxx.xxx.xxx', 'root', '123456', 'db_name');
$con -> query('set names utf8;');
$ip = get_client_ip();
$sql = "insert into table_name(v_ip, v_time) values('$ip', NOW())";
$con -> query($sql);
$con -> close();

function get_client_ip() {
    if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
        $ip = getenv("HTTP_CLIENT_IP");
    else
        if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
            $ip = getenv("HTTP_X_FORWARDED_FOR");
        else
            if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
                $ip = getenv("REMOTE_ADDR");
            else
                if (isset ($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
                    $ip = $_SERVER['REMOTE_ADDR'];
                else
                    $ip = "unknown";
    return ($ip);
}
?>

大概是这样一段代码,我直接写在了首页的网页源码中,放在body标签内外都行,但由于我存储数据的DB不在这个网页所在的服务器,而是另一个服务器,所以读写有耗时,我发现网页加载特别慢,空白时间很长。
很显然,是因为php读写数据库造成了阻塞,成功返回结果后HTML页面才渲染出来,在这之前都是一片空白。


然后我就想这段php代码为何不能异步执行呢?但php本身又是单线程的,网上搜了搜,想要在代码层面支持多线程很麻烦。
随后问了问周边的技术大佬,告诉我了一种方法,把php代码单独写一个文件,再在img标签里的src属性里引用,就可以直接实现异步了。我当时一听恍然大悟。
于是,代码就成了这样:

...
<!-- CRWD -->
<img src="crwd.php" border="0" style="display:none;"/>

</body>
</html>

crwd.php里就是上文那段代码,后面的border和style属性都是为了隐藏这个图片,否则会有一块加载失败的placeholder出现在你的页面中。
说明图片加载所用的img标签本身就是支持异步的,所以在这里整个页面其它内容就能够提前渲染出来了,而不会被php代码阻塞。

猜你喜欢

转载自blog.csdn.net/ysy950803/article/details/79591555