PDA

View Full Version : سوال: با چه تابعی می تونم چک کنم که فایل داده شده توی اینترنت موجود هست؟



idocsidocs
یک شنبه 30 بهمن 1390, 16:13 عصر
منظورم از اینترنت اینه که موجود بودن فایل توی سرور خودم یا سایر سرورها چک بشه.

Reza1607
یک شنبه 30 بهمن 1390, 18:09 عصر
با استفاده از تابع file_exists چك كنيد كه آيا فايل هست يا نه؟
اگر بود براي اطمينان حجم فايل رو هم مقايسه كنيد تا مطمئن بشيد كه همون فايل هست نه يك تشابه اسمي

idocsidocs
یک شنبه 30 بهمن 1390, 18:37 عصر
تابع فایل file_exists فایلهای سایر سرورها رو نمی تونه چک کنه.
الان از تابع getimagesize استفاده می کنم ولی این تابع هم با https مشکل داره و این پروتوکل رو نمی خونه.

راه بهتری به نظرتون نمی رسه؟

امیـرحسین
یک شنبه 30 بهمن 1390, 22:59 عصر
سوکت و cURL هم هست فقط باید دقت کنید که وضعیت سرور شما و سرور مقصد میتونه تو نتیجه تاثیر داشته باشه یعنی اگه سرور مقصد اون لحظه جوابی برنگردونه یا سرور شما اتصال خوبی نداشته باشه فایل رو پیدا نمیکنه در حالیکه فایل هست.

idocsidocs
یک شنبه 30 بهمن 1390, 23:06 عصر
سوکت و cURL هم هست فقط باید دقت کنید که وضعیت سرور شما و سرور مقصد میتونه تو نتیجه تاثیر داشته باشه یعنی اگه سرور مقصد اون لحظه جوابی برنگردونه یا سرور شما اتصال خوبی نداشته باشه فایل رو پیدا نمیکنه در حالیکه فایل هست.

ممکنه cURL توی سرور فعال نباشه.
راه دیگه ای نیست؟

narsic
دوشنبه 01 اسفند 1390, 00:21 صبح
fopen هم هست با لینک مثل یک فایل برخورد میکنه و محتویات رو میخونه. (فقط برای وجود داشتن گفتن اما استفاده ازش رو برای تصویر پیشنهاد نمیکنم)
به تعداد درخواست هاتون هم توجه کنید با چک کردن چندین سرور به این روش ها ممکن زمان زیادی طول بکشه که مشکلات خودش رو در بر داره.
موفق باشید

idocsidocs
دوشنبه 01 اسفند 1390, 00:59 صبح
fopen هم هست با لینک مثل یک فایل برخورد میکنه و محتویات رو میخونه. (فقط برای وجود داشتن گفتن اما استفاده ازش رو برای تصویر پیشنهاد نمیکنم)
fopen با https مشکلی نداره؟

eshpilen
دوشنبه 01 اسفند 1390, 10:12 صبح
بنظرم باید از سوکت و درخواست از نوع HEAD استفاده کنی.
سرورها در جواب این درخواست فقط هدرها رو برمیگردونن و نه کل فایل رو.
در نتیجه میتونی موجود بودن فایل رو باهاش چک کنی.
البته HTTPS بنظرم یک داستان دیگه ای داره. یحتمل باید OpenSSL نصب باشه و استفاده کنی، اما بازم با درخواست HEAD. احتمالا فقط سوکت شما از نوع SSL میشه.

idocsidocs
دوشنبه 01 اسفند 1390, 11:30 صبح
البته HTTPS بنظرم یک داستان دیگه ای داره. یحتمل باید OpenSSL نصب باشه و استفاده کنی، اما بازم با درخواست HEAD. احتمالا فقط سوکت شما از نوع SSL میشه. بنظرم برای چک کردن لینکها و آدرسهای HTTPS باید کاری کنیم که مرورگر کلید عمومی خودش رو هم ارسال کنه در صورتیکه با استفاده از توابع پی اچ پی، کلید عمومی ارسال نمی شه. نظرتون در این مورد چیه؟

eshpilen
دوشنبه 01 اسفند 1390, 11:57 صبح
خیر، مرورگر کلید عمومی خاصی رو ارسال نمیکنه.
اون چیزی که در اینترنت هست تقریبا همیشه احراز هویت یک طرفه هست. حداقل این کاری هست که سایت های عمومی میکنن.
یعنی سرور مورد نظر هویت خودش رو با استفاده از گواهینامه و امضای دیجیتال ثابت میکنه و بعدش هم که اطلاعات رد و بدل شده رمزنگاری میشن تا کلاینت مطمئن باشه داره با همون سرور صحبت میکنه و کسی هم نمیتونه اطلاعات رد و بدل شده رو این وسط بخونه یا دستکاری کنه.
کلاینت چیزی رو ثابت نمیکنه و برای سرور احراز هویت نمیشه. بنابراین هیچ گواهینامه و کلید عمومی ای از جانب کلاینت به سرور ارسال نمیشه.

امیـرحسین
دوشنبه 01 اسفند 1390, 12:14 عصر
سوکت Port هم میگیره دیگه. مشکل ssl با اون حل میشه. من گفتم با سوکت و cURL میشه شما سوکت رو نشنیده گرفتی. fsockopen

idocsidocs
دوشنبه 01 اسفند 1390, 12:23 عصر
یعنی سرور مورد نظر هویت خودش رو با استفاده از گواهینامه و امضای دیجیتال ثابت میکنه و بعدش هم که اطلاعات رد و بدل شده رمزنگاری میشن تا کلاینت مطمئن باشه داره با همون سرور صحبت میکنه و کسی هم نمیتونه اطلاعات رد و بدل شده رو این وسط بخونه یا دستکاری کنه.پس چرا توابع php نمی تونن وجود فایلها رو توی سرورهایی که از HTTPS استفاده می کنن رو شناسایی کنن؟

سوکت Port هم میگیره دیگه. مشکل ssl با اون حل میشه.می شه توضیح فنی بدید که چرا با سوکت مشکل حل می شه و توابع عادی نمی تونن مشکل رو حل کنن؟

eshpilen
دوشنبه 01 اسفند 1390, 21:07 عصر
پس چرا توابع php نمی تونن وجود فایلها رو توی سرورهایی که از HTTPS استفاده می کنن رو شناسایی کنن؟
بخاطر اینکه ارتباط از طریق سوکت انجام میشه و سوکت هایی که برای HTTPS استفاده میشن باید از نوع SSL باشن.
البته من تاحالا تست نکردم. ولی اگر کار نمیکنه حتما به این دلیل هست.

idocsidocs
دوشنبه 01 اسفند 1390, 21:37 عصر
بخاطر اینکه ارتباط از طریق سوکت انجام میشه و سوکت هایی که برای HTTPS استفاده میشن باید از نوع SSL باشن.
مگه نمی گید که سمت مروگر نیاز به تایید ارتباط نیست پس چرا باید از سوکت استفاده کرد؟

امیـرحسین
دوشنبه 01 اسفند 1390, 22:40 عصر
من الان چک کردم fopen هم که //:ssl رو پشتیبانی میکنه

idocsidocs
دوشنبه 01 اسفند 1390, 22:49 عصر
من الان چک کردم fopen هم که //:ssl رو پشتیبانی میکنه

تصویری که چک کرده بودید توی سرور خودتون بود یا از یه سرور دیگه؟
بعد از اینکه از fopen استفاده کردید چطور باید تشخیص بدم که فایل مورد نظر یه تصویر هست؟

امیـرحسین
دوشنبه 01 اسفند 1390, 23:17 عصر
هیچ کدوم. از سایت PHP !
http://www.php.net/manual/en/function.fopen.php
ببینیداگر فایل وجود نداشته باشه، این توابع اگه هدر برگردونند (مثل سوکت) ۴۰۴ برمیگردوند در غیر اینصورت معمولا False... اطلاعاتشون رو مطالعه کنید. ساده هستند.
به نظر من ساده‌ترین و تمیزترین راه، cURL هست و در نهایت نتیجه‌ی هیچکدوم قطعی نیست چون همونجور که گفتم به وضعیت دو تا سرور وابسته‌ست...