Мой код выглядит следующим образом:
<?php
session_start();
$img=imagecreatetruecolor(150,50);
$white=imagecolorallocate($img,255,255,255);
$black=imagecolorallocate($img,0,0,0);
$red=imagecolorallocate($img,255,0,0);
$pink=imagecolorallocate($img,200,0,150);
$grey=imagecolorallocate($img,150,150,150);
$blue=imagecolorallocate($img,0,204,255);
$redd=imagecolorallocate($img, 153, 0,0);
function randomString($length){
$chars="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ023456789";
srand((double)microtime()*1000000);
$str="";
while($i<=$length){
$num=rand() % 33;
$tmp=substr($chars,$num,1);
$str.=$tmp;
$i++;
}
return $str;
}
for($i=0;$i<=rand(1,5);$i++)
{
$color=(rand(1,2)==1)? $grey:$white;
imageline($img, rand(5,50),rand(5,50),rand(50,150) , rand(5,50), $color);
}
$ran=randomString(rand(3,6));
$_SESSION['captcha']=$ran;
imagefill($img,0,0,$redd);
imagettftext($img,14,7,23,27,$black,"fonts/times_new_yorker.ttf",$ran);
imagettftext($img,16,10,18,30,$white,"fonts/times_new_yorker.ttf",$ran);
header("Content-type:image/png");
imagepng($img);
imagedestroy($img);
?>
Вчера это работало так, как ожидалось. Но теперь Firefox показывает сообщение:
Это изображение невозможно отобразить, поскольку оно содержит ошибку.
Когда я искал какие-либо решения, кажется, все говорят о возможности включения GD. Но в моем коде GD включен, и этот код отлично работал до сегодняшнего утра.
Может ли кто-нибудь помочь мне получить решение для этого?
Изображение не может быть отображено, потому что PHP сообщает об ошибке, а header('Content-Type: image/png')
сообщает ему, чтобы страница отображалась как изображение.
Чтобы увидеть эту ошибку, вы должны удалить следующую часть:
header("Content-type:image/png");
imagepng($img);
imagedestroy($img);
или еще лучше, окружайте его с помощью if (!isset($_GET['debug']))
. Таким образом, вы можете добавить ?debug=1
к своему URL-адресу и просмотреть все возможные ошибки PHP, в то время как изображение все еще отображается нормально.
Существует несколько возможных решений, почему ваш код может перестать работать, не меняя его. Я предполагаю, что вы каким-то образом вмешались в окружающую среду.
session_start()
должен хранить данные сеанса в каталоге на локальном диске. Имеет ли ваш PHP доступ к этому каталогу?fonts/times_new_yorker.ttf
могут исчезнуть.Кроме того, всего пару советов:
srand()
, он инициализируется автоматически. (Я предполагаю, что вы исходите из фона C/C++).rand()
вы должны использовать mt_rand()
поскольку он быстрее и обеспечивает лучшую случайность.% 33
на % strlen($chars)
).0
и O
, 1
и l
одним и тем же "символом", чтобы были прощены разумные ошибки пользователя. (Простите, если вы это сделаете.)