PDA

View Full Version : کش کردن عکس ساخته شده توسط php



trasilver
دوشنبه 16 دی 1392, 01:06 صبح
با سلام خدمت دوستان.

راهی هست که بشه باهاش عکسی رو که با کد های php ساختیم کش کنیم؟

چون هر بار که فایل php لود میشه عکس هم از اول لود میشه و کش نمیشه!

یه سوال دیگه هم داشتم!

این که مثلا ما یدونه عکس داریم توی فولدر image و اسم عکس هم a.png هست.

چطوری به فایل php بگیم(از طریق کد php نه html) که بیا و فایل a.png رو در فولدر image نشون بوده؟

با تشکر.

Javidhb
دوشنبه 16 دی 1392, 11:51 صبح
اول چک میکنه اگه قبلا عکس با اسم مد نظرمون توی پوشه pics باشه، اون رو نمیسازه و فقط عکس رو از روی فایل میخونه.


header('content-type: image/png');

$fileName = 'test'; //اسم فایل - عکس
$imagePath = "pics/".$fileName.".png"; //مسیر و اسم عکس

if (file_exists($imagePath))
{
//اگه قبلا عکس تولید شده همون رو نمایش بده
readfile($imagePath);
}
else
{
$width = 100;
$height = 50;
$fontSize = 18;
$fontAngle = 10;
$fontName = 'tahoma.ttf';
$txt = 'LoGo';

$pic = imagecreate($width, $height);

imagecolorallocate($pic,200,200,200);
$color_black = imagecolorallocate($pic,0,0,0);

imagestring($pic, 6, 10, 5, $txt, $color_black);

//ساخت عکس و ذخیره در مسیر مورد نظر
imagepng($pic, $imagePath);
imagedestroy($pic);
}

-> کد بالا برای مثاله و فقط با پسوند Png کار میکنه...

trasilver
دوشنبه 16 دی 1392, 12:38 عصر
من با استفاده از چند تا عکس png می خوام در نهایت یدونه عکس gif بسازم ولی مشکلی که دارم اینه که صفحه زمینه عکس ها مشکی میشه!
از تابع imagecreatefrompng استفاده می کنم.
و در آخر فایل هم:

header("Content-Type: image/gif");
imagesavealpha($body, true);
imagegif($body);

Unique
دوشنبه 16 دی 1392, 13:45 عصر
راهی هست که بشه باهاش عکسی رو که با کد های php ساختیم کش کنیم؟

سوالت دو پهلو هست ! منظورت از cache اینه که :

۱ - عکس یکبار ساخته بشه و دوباره لازم به ساختنش نباشه ؟ خوب باید وقتی ساختی روی دیسک ذخیره کنی و از روی اون بخونی !
۲ - مرورگر اگه عکسی را از روی یک php لود کنه cache نمیشه ! خوب برای رفع این مشکل هم باید از etag استفاده کنی اینطوری :


$hash = "/".md5_file($filepath)."/";
$headers = getallheaders();
$hdr_match = "nothing";

if (isset($headers['If-None-Match']))
$hdr_match = $headers['If-None-Match'];

if (preg_match($hash,$hdr_match)){
header('HTTP/1.1 304 Not Modified');
}else{
header("Content-type: image/jpeg");
header("ETag: \"{$hash}\"");
// send file content here
}

trasilver
دوشنبه 16 دی 1392, 14:08 عصر
سوالت دو پهلو هست ! منظورت از cache اینه که :

۱ - عکس یکبار ساخته بشه و دوباره لازم به ساختنش نباشه ؟ خوب باید وقتی ساختی روی دیسک ذخیره کنی و از روی اون بخونی !
۲ - مرورگر اگه عکسی را از روی یک php لود کنه cache نمیشه ! خوب برای رفع این مشکل هم باید از etag استفاده کنی اینطوری :


$hash = "/".md5_file($filepath)."/";
$headers = getallheaders();
$hdr_match = "nothing";

if (isset($headers['If-None-Match']))
$hdr_match = $headers['If-None-Match'];

if (preg_match($hash,$hdr_match)){
header('HTTP/1.1 304 Not Modified');
}else{
header("Content-type: image/jpeg");
header("ETag: \"{$hash}\"");
// send file content here
}


یه سوال برای من پیش اومد! توی مورد اولی که شما فرمودید فرمول ساختار عکس عوض بشه عکس تغییر نمی کنه! تا اینکه عکسی که ذخیره شده رو حذف نکنی و یکی دیگه نسازی! این منطقشه!
حالا سوال من این هست که با مورد دوم هم همین جوره یا اگه فرمول ساختار عکس تغییر کنه خودش می فهمه و عکس جدید رو لود می کنه؟
یه مثال می زنم!
عکسی که قراره فایل به ما بده 2 تا عکس هست که روی هم قرار می گیره!
image1.png و image2.png
حالا ما علاوه بر این دو عکس یکی دیگه هم داریم به اسم image3.png که کاربر می تونه اون رو با image2 و یا 1 تعوض کنه!
کاربر حالا عکسی که براش توی فولدر pics ایجاد شده دو عکس image1 و image2 روی هم قرار گرفته و نمایش میده.
اگه کاربر بیاد و image1 و image3 رو انتخاب بکنه با فرمول شما خودش می فهمه و عکس رو دوباره می سازه و سیو می کنه یا باید عکسی که image1 و image2 روی هم قرار گرفته رو حذف کنیم و عکس جدیدی بسازیم که image1 و image3 روی هم قرار گرفتند؟
خدا کنه متوجه شده باشید.:لبخند:

trasilver
دوشنبه 16 دی 1392, 20:56 عصر
دوستان عزیز آپ.
کسی نتونست به سوال ما جواب بده یا نتونستید بفهمید دقیقا منظور من رو؟

Unique
سه شنبه 17 دی 1392, 13:07 عصر
ببینید ! من وارد استدلال های شما نمیشم ، شما اگه اصل مطلب را بگیرین بقیه مشکلات حله :

۱ - وقتی عکسی از روی وب سررو به صورت static مثل عکس هایی که معمولا توی پوشه images می سازین و آرم عکس های دیگه سایت را توش قرار میدین بارگزاری بشه ! مرورگر و وب سرور این بحث etag و cache را با هم حل میکنند.

۲ - وقتی ما توی src آدرسی غیر از یک عکس static میدیم ! وب سرور از بازی خارج میشه و همه چیز دست خودمونه !

حالا برنامه من قراره یک عکسی را ایجاد کنه و برای کاربر بفرسته ، قائدتا چه من هر بار عکس را ایجاد کنم و چه عکس را ایجاد کنم و جایی ذخیره کنم و با هر تغییر دوباره ایجاد و ذخیره کنم ! آخرش باید با توابع gd یا readfile ارسالش کنم !

پس منطق را هر جور دوست داری پیاده کن ! در نهایت برای cache شدن سمت مرورگر باید etag را چک کنی و header مناسب را در صورت عدم تغییر عکس بفرستی ! یا etag جدید با عکس جدید را بفرستی !

ببین این موضوع را شاید خیلی از بچه های این انجمن هم نمیدونستند و شاید براشون اهمیت نداشته کاربر چند کیلوبایت اضافه دانلود کنه در صورتی که حواسشون نیست داره bandwidth سرورشون هم کم میشه ! ولی خیلی ها روی سایت های کوچیک کار میکنند و سایت های بزرگ که ۱۰ کیلو هم توش ۱۰ کیلو هست را مد نظر ندارند ! مثل اپراتور های بیسواد ادارات که میاد عکس ۲ مگابایتی را میگذاره روی cms و بلد نیست حجم و سایز را برای وب مناسب کنه. پس اگه پروژه بزرگی دستت نیست و performance برات اهمیت نداره میتونی کاملا بیخیال این موضوع بشی یا از کلاس های آماده استفاده کنی که ممکنه این موضوع را رعایت کرده باشند.