画像のクオリティを下げれば不可能ではないですが
下げたあと500kb以下になるとは限りませんので
UIとしてユーザーに%指定させて圧縮し、それでもだめならエラーを返すというくらいが妥当。
自動でなんどもサーバー側で圧縮比率を変えながら処理するのは
負荷が高く効率的ではないのでやめたほうがいい
3段階くらいでトライアンドエラー処理するくらいならなんとかなりますが
低クオリティにしたときにクライアントがそれをよいとジャッジするかわからないので
圧縮率はクライアントが決めるべき
追記
imgjpegで出力したサイズを知りたいならバッファリングしてstrlenをすればよいです
PHP
1<?PHP
2$im = @imagecreatefromjpeg('1.jpg');
3
4ob_start();
5imagejpeg($im,null,100);
6$content=ob_get_contents();
7ob_end_clean();
8print "100:".strlen($content)."<br>";
9
10ob_start();
11imagejpeg($im,null,75);
12$content=ob_get_contents();
13ob_end_clean();
14print "75:".strlen($content)."<br>";
15
16ob_start();
17imagejpeg($im,null,50);
18$content=ob_get_contents();
19ob_end_clean();
20print "50:".strlen($content)."<br>";
21
22ob_start();
23imagejpeg($im,null,25);
24$content=ob_get_contents();
25ob_end_clean();
26print "25:".strlen($content)."<br>";
27
28ob_start();
29imagejpeg($im,null,0);
30$content=ob_get_contents();
31ob_end_clean();
32print "0:".strlen($content)."<br>";
33
34
35/*
36header('Content-Type: image/jpeg');
37print $content;
38*/