2010-04-28 55 views
0

我有一个脚本,使用GD和PHP在世界地图上绘制所请求的国家的颜色。 PHP请求被复选框调用。它看起来像是你调用PHP脚本太快,然后返回一个“Xed out”错误图像。有没有办法用setTimeout或其他东西排队PHP请求,所以新的检查事件永远不会失败?得到偶尔的错误,而不是PHP图像

下面是JavaScript调用由的onclick事件:

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

你能告诉我们包括该行在内的确切错误吗? – Jamescun 2010-04-28 21:58:09

回答

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"; 

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

+0

谢谢。该网站的目的是指示访问国家,所以会有多种颜色。 预先创建彩色国家的所有组合会产生大量的图像。我试图计算出我需要的数量,但因为头部受伤而放弃了。也许这是最好的解决方案,但我不知道如何以编程方式生成图像。现在每个图像大约是29KB。 因此,双重书写的原因是,实际的png文件可以作为其他国家脚本进一步着色的起点。 – socrtwo 2010-04-28 21:58:31

+0

我明白了。另一种选择是在每个GIF中创建一个透明GIF,一个突出显示的国家。在HTML和一些CSS中,您可以将它们放在彼此顶部,并使用JavaScript将它们打开/关闭。 – edwin 2010-04-28 22:51:26