我有一个脚本,用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);
?>
答案 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";
在这种情况下,您也将失去缓存问题。