我已经将这些代码剥离到了最基本的骨头,但仍然存在问题。无法使curl请求导致只有一次点击页面,当与readfile()
一起使用时,它总是会点击两次来加载图像。
它应该工作的方式:当用户请求页面时, image-url.php 它会显示一个图像 - download.png 。 image-url.php 中的脚本向 http://example.com/test.php 发出curl请求,该请求会递增计数器并更新数据库。
问题在于,此处显示的代码会点击 http://example.com/test.php 两次,我无法弄清楚原因。
我发现如果我在卷曲请求之后请求图像,图像不显示,则会加载页面。计数器递增一次。
如果我删除了请求图像的代码,页面将不会加载(预期的行为),计数器会递增一次。
必须有一种方法可以加载图像而不是页面,并且一次增加计数器。
我正在尝试使用curl,因为请求页面会因图像而异,并且会出现在各种服务器上。图像始终位于同一个域中。如果能使它发挥作用,似乎是最好的方法。
有人可以帮忙吗?
图片-url.php
<?php
// display the requested image ( works fine )
$show_image = "download.jpg";
$imginfo = getimagesize($show_image);
header("Content-type: ".$imginfo['mime']);
readfile($show_image);
// send useragent to hit counter or else won't count
$agent = $_SERVER['HTTP_USER_AGENT'];
$curl = curl_init();
curl_setopt ($curl, CURLOPT_URL, "http://example.com/test.php");
curl_setopt($curl, CURLOPT_USERAGENT, $agent);
// makes no difference whether CURLOPT_RETURNTRANSFER set or not.
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec ($curl);
curl_close($curl);
// grasping at straws here to no affect
unset($curl);
// requested image displays, hits 'http://example.com/test.php' twice
?>
hitter.php 这是一个简单的点击计数器。我删除了大部分功能,因此它只计算命中和记录ip,页面名称和用户代理。当包含在页面中时,它会记录每次访问一次,但卷曲请求会计算两次。
<?php
include('functions.php');
// get hitter info
$ipAddress = $_SERVER['REMOTE_ADDR'];
$page_name = basename($_SERVER["REQUEST_URI"]);
$browser = $_SERVER['HTTP_USER_AGENT'];
//database connection
$db = new PDO("mysql:host=".DBHOST.";dbname=".DBNAME, DBUSER, DBPASS);
$statement=$db->prepare("INSERT INTO `page_views` (`page_name`, `ip`,
`browser`)
VALUES ( ?, ?, ?)");
$statement->execute(array($page_name $ipAddress, $browser));
// this adds one record to the counter for all hits
// except from image-url.php which increments twice
?>
更新
当在图像标记中使用 image-url.php 时,上述代码按预期工作:<img src = "image-url.php">
。它显示图像并计算一页加载。但是加载 image-url.php 会直接计算两个页面加载次数。