返回偶尔错误而不是PHP图像

时间:2010-04-28 19:06:51

标签: php javascript image png queue

我有一个脚本,用GD和PHP在世界地图上为所请求的国家/地区着色。使用复选框调用PHP请求。看起来如果你调用PHP脚本太快,它会返回一个“Xed out”错误图像。有没有办法用setTimeout或其他东西对PHP请求进行排队,所以新的检查事件永远不会失败?

以下是onClick事件调用的Javascript:

    function onBoxClicked(frame, country){
var randomNumber = Math.floor(Math.random()*100000001);
if (document.getElementById(country).checked == true){
window.parent.document.getElementById('world_map').src=(country)+".php?r=" + randomNumber;
}else if (document.getElementById(country).checked == false){
window.parent.document.getElementById('world_map').src=(country)+"_unload.php?r=" + randomNumber;
}
}

这是一个典型的国家/地区PHP文件(我知道有一些垃圾可以删除):

<?php
session_cache_limiter('nocache');
$cache_limiter = session_cache_limiter();
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");// Date in the past
$ip=$_SERVER['REMOTE_ADDR'];
$oldImageName = 'world_map2_users_copy.png';
$newImageName = $ip.'.'.'world_map2_users_copy.png';
if (file_exists($newImageName)){
$im = imagecreatefrompng($newImageName);
}else{
copy($oldImageName, $newImageName);
$im = imagecreatefrompng($newImageName);
}
$syria_color = imagecolorallocate($im, 0, 158, 96);
imagefill($im, 780, 205, $syria_color);
ImagePNG($im, $newImageName);
ImagePNG($im);
ImageDestroy($im);
?>

1 个答案:

答案 0 :(得分:1)

如果你这样做

ImagePNG($im, $newImageName);

有两个PHP脚本可能同时写入同一个文件。

为什么要写入磁盘?

只是做:

$im = imagecreatefrompng($oldImageName);
$syria_color = imagecolorallocate($im, 0, 158, 96);
imagefill($im, 780, 205, $syria_color);
ImagePNG($im);
ImageDestroy($im);

最佳解决方案是提前生成所有图像文件,因此在JavaScript中您只需说:

window.parent.document.getElementById('world_map').src=country+".png";

在这种情况下,您也将失去缓存问题。