نسخة مخبأة ، تم إنشاء PHP على Thumbnails ببطء



performance .htaccess (13)

أعتقد أنه بدلاً من استخدام ذلك البرنامج النصي لمصغرة الصور المصغرة ، يجب عليك إعطاء TinySRC تجربة لإنشاء صورة مصغرة سريعة سريعة وسحابية . يحتوي على واجهة برمجة تطبيقات بسيطة للغاية وسهلة الاستخدام ، يمكنك استخدام مثل: -

http://i.tinysrc.mobi/ [height] / [width] /http://domain.tld/path_to_img.jpg

[عرض] (اختياري): - هذا عرض بالبكسل (الذي يتجاوز التكييف أو تغيير حجم العائلة). إذا كانت مسبوقة بـ "-" أو "x" ، فإنها ستطرح أو تنكمش إلى نسبة مئوية من الحجم المحدد.

[height] (اختياري): - هذا الارتفاع بالبكسل ، إذا كان العرض موجودًا أيضًا. كما أنه يتخطى التكييف أو تغيير حجم العائلة ويمكن أن يبدأ بـ "-" أو "x".

يمكنك التحقق من ملخص واجهة برمجة التطبيقات here

FAQ

ماذا يكلفني tinySrc؟

لا شيئ.

متى يمكنني البدء باستخدام tinySrc؟

الآن.

ما مدى موثوقية الخدمة؟

لا نقدم أي ضمانات حول خدمة tinySrc. ومع ذلك ، فإنه يعمل على بنية أساسية سحابة رئيسية موزعة ، لذلك فهو يوفر توفرًا عاليًا في جميع أنحاء العالم. يجب أن يكون كافيا لجميع احتياجاتك.

ما مدى سرعة ذلك؟

قام التخزين المؤقت لـ tinySrc بتغيير حجم الصور في الذاكرة وفي مخزن البيانات لدينا لمدة تصل إلى 24 ساعة ، ولن يقوم بجلب صورتك الأصلية في كل مرة. وهذا يجعل الخدمات سريعة بشكل مذهل من وجهة نظر المستخدم. (ويقلل من تحميل الخادم كتأثير جانبي لطيف.)

حظا طيبا وفقك الله. مجرد اقتراح ، بما أنك لا تبين لنا الرمز: p

https://ffff65535.com

السؤال جزء A ▉ (100 باونته ، منحت)
كان السؤال الرئيسي كيفية جعل هذا الموقع ، تحميل أسرع. أولا نحن بحاجة لقراءة هذه الشلالات. شكرا لجميع اقتراحاتكم على تحليل قراءات شلال. واضح من الرسوم البيانية الشلال المختلفة المعروضة هنا هو عنق الزجاجة الرئيسي: الصور المصغرة التي تم إنشاؤها بواسطة PHP. حصلت على تحميل jquery بروتوكول أقل من CDN نصح من قبل ديفيد فضل بلدي ، وإن كان جعل موقعي أسرع 3 ٪ فقط عموما ، وبينما لا يجيب على عنق الزجاجة الرئيسي للموقع. حان الوقت لتوضيح سؤالي ومكافأة أخرى:

السؤال جزء B ▉ (100 باونته ، منحت)
كان التركيز الجديد الآن على حل المشكلة التي تحملها صور 6 صور ، والتي تسبب معظم تأخير التحميل. هذه الصور الستة عبارة عن صور مصغرة تم إنشاؤها بواسطة PHP ، صغيرة جدًا و 3 ~ 5 كيلوبايت فقط ، ولكن يتم تحميلها ببطء شديد نسبيًا. لاحظ " وقت البايت الأول " على الرسوم البيانية المختلفة. بقيت المشكلة بدون حل ، لكن ذهب إلى جيمس ، الذي أصلح الخطأ في الرأس الذي underlined RedBot: "طلب مشروط إذا تم تعديله منذ ذلك المحتوى الكامل دون تغيير." .

سؤال الجزء C ▉ (آخر مكافأة لي: 250 نقطة)
للأسف ، بعد أن تم إصلاح الخطأ رأس REdbot.org ، بقي التأخير الناجم عن الصور التي تم إنشاؤها PHP دون مساس. ما على وجه الأرض هذه الصور المصغرة صغيرة جدا 3 ~ 5Kb التفكير؟ كل هذه المعلومات الرأسية يمكنها إرسال صاروخ إلى القمر والعودة. أي اقتراحات حول هذا الاختناق هي محل تقدير كبير وتعامل كإجابة محتملة ، بما أنني عالق في هذه المشكلة التي تعاني من عنق الزجاجة منذ سبعة أشهر. شكري مقدمًا.

[بعض معلومات الخلفية على موقعي: CSS في الأعلى. JS في الأسفل (Jquery، JQuery UI، اشترى قائمة awm / menu.js engines، tabs js engine، video swfobject.js) تظهر الخطوط السوداء في الصورة الثانية ما الذي يبدأ في تحميله. الروبوت الغاضب هو المفضل لدي "ZAM". هو غير ضار وغالبا أكثر سعادة.]

تحميل الشلال: ترتيب زمني | http://webpagetest.org

المجالات الموازية المجمعة | http://webpagetest.org

شلال الموقع-بيرف | http://site-perf.com

أدوات Pingdom شلال | http://tools.pingdom.com

شلال GTmetrix http://gtmetrix.com


أنا بعيد عن خبير لكن ...

فيما يتعلق بهذا: "طلب IF-Modified-Since إرجاع المحتوى الشرطي دون تغيير." وتعليقاتي.

يجب أن يتحقق الرمز المستخدم لإنشاء الصور المصغرة مما يلي:

  1. هل هناك نسخة مخبأة من الصورة المصغرة.
  2. هل النسخة المخبأة الأحدث من الصورة الأصلية.

إذا كان أيًا منهما غير صحيح ، فيجب إنشاء الصورة المصغرة وإعادتها مهما كانت. إذا كان كلاهما صحيحًا ، فيجب إجراء الفحص التالي:

  1. هل هناك رأس HTTP_IF_MODIFIED_SINCE
  2. هل آخر وقت تم تعديل النسخة المخبأة له هو نفس HTTP_IF_MODIFIED_SINCE

إذا كان أيًا منهما غير صحيح ، فيجب إرجاع الصورة المصغرة المخزنة مؤقتًا.

إذا كان كلاهما صحيحًا ، فيجب إرجاع حالة HTTP 304. لست متأكدًا من ما إذا كان مطلوبًا منه ولكنني أعيد أيضًا بشكل شخصي رؤوس Cache-Control و Expires and Last-Modified جنبًا إلى جنب مع 304.

في ما يتعلق بـ GZipping ، لقد تم إخباري أنه لا توجد حاجة إلى صور GZip لذا تجاهل هذا الجزء من تعليقي.

تعديل: لم ألاحظ إضافة إلى مشاركتك.

session_cache_limiter('public');
header("Content-type: " . $this->_mime);
header("Expires: " . gmdate("D, d M Y H:i:s", time() + 2419200) . " GMT");
// I'm sure Last-Modified should be a static value. not dynamic as you have it here.
header("Last-Modified: " . gmdate("D, d M Y H:i:s",time() - 404800000) . " GMT");

أنا متأكد أيضًا من أن التعليمة البرمجية الخاصة بك تحتاج إلى التحقق من رأس HTTP_IF_MODIFIED_SINCE وأن تتفاعل معها. لا يؤدي تعيين هذه الرؤوس وملف htaccess فقط إلى توفير النتيجة المطلوبة.

أعتقد أنك بحاجة إلى شيء كهذا:

$date = 'D, d M Y H:i:s T'; // DATE_RFC850
$modified = filemtime($filename);
$expires = strtotime('1 year'); // 1 Year

header(sprintf('Cache-Control: %s, max-age=%s', 'public', $expires - time()));
header(sprintf('Expires: %s', date($date, $expires)));
header(sprintf('Last-Modified: %s', date($date, $modified)));
header(sprintf('Content-Type: %s', $mime));

if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
    if(strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) === $modified) {
        header('HTTP/1.1 304 Not Modified', true, 304);
        // Should have been an exit not a return. After sending the not modified http
        // code, the script should end and return no content.
        exit();
    }
}
// Render image data

إذا لم يكن هناك سبب وجيه بالفعل (عادةً لا يوجد) لا يجب أن تستدعي صورك مترجم PHP.

قم بإنشاء قاعدة rewrite لخادم الويب الخاص بك الذي يقوم بتخزين الصورة مباشرة إذا تم العثور عليها في نظام الملفات. إذا لم يكن الأمر كذلك ، فقم بإعادة التوجيه إلى البرنامج النصي PHP الخاص بك لإنشاء الصورة. عندما تقوم بتحرير الصورة ، قم بتغيير اسم ملف الصور لإجبار المستخدمين الذين لديهم نسخة مخزنة مؤقتًا على جلب الصورة المحررة حديثًا.

إذا لم يعمل على الأقل ، فلن يكون له أي علاقة بالطريقة التي يتم بها إنشاء الصور والتحقق منها.


بادئ If-Modified-Since ، تحتاج إلى التعامل مع طلبات If-Modified-Since ، وعلى النحو المناسب ، كما قال جيمس. ينص هذا الخطأ على ما يلي: "عندما أسأل الخادم الخاص بك إذا تم تعديل هذه الصورة منذ آخر مرة ، فإنه يرسل الصورة بالكامل بدلاً من مجرد نعم / لا".

عادةً ما يكون الوقت بين الاتصال والبايت الأول هو الوقت الذي يستغرقه تشغيل برنامج PHP. من الواضح أن شيئًا ما يحدث عندما يبدأ تشغيل هذا البرنامج النصي.

  1. هل فكرت في تصنيفها؟ قد يكون لديك بعض القضايا.
  2. وبالاقتران مع المشكلة المذكورة أعلاه ، قد يتم تشغيل البرنامج النصي الخاص بك عدة مرات أكثر من اللازم. من الناحية المثالية ، ينبغي أن تولد الإبهام فقط إذا تم تعديل الصورة الأصلية وإرسال الإبهام المخزنة مؤقتًا لكل طلب آخر. هل راجعت أن البرنامج النصي يولد الصور دون داع (على سبيل المثال لكل طلب)؟

يعد إنشاء رؤوس صحيحة من خلال التطبيق أمرًا صعبًا إلى حد ما ، بالإضافة إلى أنه قد يتم تجاوزه بواسطة الخادم. وستتعرض لإساءة الاستخدام لأن أي شخص يرسل بعض رؤوس طلبات ذاكرة التخزين المؤقت سيؤدي إلى تشغيل مولد الصور المصغرة باستمرار (ورفع الأحمال). لذا ، إذا أمكن ، حاول حفظ تلك الإبهام المتولدة ، واستدعاء الصور المحفوظة مباشرة من صفحاتك وإدارة العناوين من .htaccess . في هذه الحالة ، لن تحتاج حتى إلى أي شيء في .htaccess إذا تم تكوين الخادم الخاص بك بشكل صحيح.

بخلاف هذه ، يمكنك تطبيق بعض أفكار التحسين الساطعة من أجزاء الأداء من هذا السؤال العام الجيد على كيفية القيام بالمواقع الإلكترونية بالطريقة الصحيحة ، مثل تقسيم مواردك إلى نطاقات فرعية بدون ملفات Cook ، إلخ. ولكن على أي حال ، صورة 3K يجب ألا يستغرق الأمر ثانية لتحميله ، وهذا واضح عند المقارنة بعناصر أخرى في الرسوم البيانية. يجب أن تحاول تحديد المشكلة قبل التحسين.


جرّب إجراء اختبارات Y! ​​Slow و Page Speed ​​على موقعك / صفحتك ، واتبع الإرشادات لفرز اختناقات الأداء المحتملة. يجب أن تحصل على مكاسب هائلة في الأداء بمجرد أن تسجل أعلى في Y! Slow أو Page Speed.

ستخبرك هذه الاختبارات بالخطأ وما الذي يجب تغييره.


غالبية المشكلة البطيئة هي TTFB (Time to first byte) مرتفع للغاية. هذا هو واحد من الصعب معالجة دون الحصول على حميمية مع ملفات التكوين الخادم الخاص بك ، والمكونات الأساسية ، ولكن يمكنني أن أرى أنها متفشية على كل طلب. لديك الكثير من الحانات الخضراء (سيئة) والقضبان الزرقاء قليلاً جداً (جيد). قد ترغب في التوقف عن تحسين الواجهة الأمامية لبعض الوقت ، لأنني أعتقد أنك قد فعلت الكثير في هذا المجال. على الرغم من المثل القائل بأن " 80٪ -90٪ من وقت استجابة المستخدم النهائي يتم إنفاقه على الواجهة الأمامية " ، فإنني أعتقد أن هذا يحدث في الخلفية.

TTFB هو الاشياء الخلفية ، الاشياء الخادم ، ما قبل المعالجة قبل الإخراج والمصافحة.

وقت تنفيذ التعليمات البرمجية الخاصة بك للعثور على أشياء بطيئة مثل استعلامات قاعدة البيانات البطيئة ، والوقت يدخل والخروج من وظائف / طرق للعثور على وظائف بطيئة. إذا كنت تستخدم php ، فجرّب Firephp . في بعض الأحيان هو واحد أو اثنين من الاستفسارات البطيئة التي يتم تشغيلها أثناء بدء التشغيل أو initializtion مثل سحب معلومات الجلسة أو التحقق من المصادقة وما لا. يمكن أن يؤدي تحسين الاستعلامات إلى بعض مكاسب جيدة في الأداء. في بعض الأحيان يتم تشغيل التعليمات البرمجية باستخدام php prepend أو spl autoload حتى تعمل على كل شيء. في أوقات أخرى يمكن أن يكون مال تكوين أباتشي conf والتغيير والتبديل الذي يحفظ اليوم.

ابحث عن الحلقات غير الفعالة. ابحث عن بطء جلب المكالمات من ذاكرات التخزين المؤقت أو عمليات الإدخال / الإخراج البطيئة التي تسببها محركات الأقراص التالفة أو استخدام مساحة القرص عالية. ابحث عن استخدامات الذاكرة وما يتم استخدامه وأين. شغّل اختبارًا متكررًا لصفحة ويب لـ 10 عمليات على صورة واحدة أو ملف واحد باستخدام العرض الأول فقط من مواقع مختلفة حول العالم وليس الموقع نفسه. وقراءة سجلات الدخول والخطأ لديك ، يتجاهلها الكثير من المطورين ويعتمدون فقط على الأخطاء التي تظهر على الشاشة. إذا كان مضيف الويب الخاص بك لديه دعم ، اطلب منه المساعدة ، إذا لم يطلب منهم بأدب المساعدة على أي حال ، فلن يؤذي ذلك.

يمكنك تجربة DNS Prefetching لمكافحة العديد من المجالات والموارد ، http://html5boilerplate.com/docs/DNS-Prefetching/

هل الخادم الخاص بك خادم جيد / لائق؟ في بعض الأحيان يمكن لخادم أفضل حل الكثير من المشاكل. أنا من المعجبين من " الأجهزة رخيصة ، والمبرمجين هي عقلية" باهظة الثمن ، إذا كان لديك فرصة وترقية المال الخادم. و / أو استخدام CDN مثل maxcdn أو cloudflare أو ما شابه ذلك.

حظا طيبا وفقك الله!

(ملاحظة: أنا لا أعمل في أي من هذه الشركات. كما سيقول رابط CloudFare أعلاه أن TTFB ليس بهذه الأهمية ، لقد ألقيت ذلك هناك حتى يمكنك الحصول على آخر.)


لذا ، فإن نص PHP الخاص بك يقوم بإنشاء الصور المصغرة في كل تحميل للصفحة؟ أولاً ، إذا كانت الصور التي يتم التقاطها بالصور لا تتغير كثيرًا ، فهل يمكنك إعداد ذاكرة تخزين مؤقت بحيث لا يلزم تحليلها في كل مرة يتم فيها تحميل الصفحة؟ ثانيًا ، هل البرنامج النصي لـ PHP يستخدم شيئًا مثل imagecopyresampled() لإنشاء الصور المصغرة؟ هذا هو اختزال غير تافه ولن يعيد البرنامج النصي PHP أي شيء حتى تنتهي الأمور إلى الأسفل. بدلاً من ذلك ، سيؤدي استخدام imagecopymerged() إلى تقليل جودة الصورة ، ولكن تسريع العملية. وكم من التخفيض تفعل؟ هل هذه الصور المصغرة 5٪ حجم الصورة الأصلية أو 50٪؟ من المحتمل أن يؤدي حجم أكبر للصورة الأصلية إلى تباطؤ نظرًا لأن نص PHP يجب أن يحصل على الصورة الأصلية في الذاكرة قبل أن يتقلصها وينتج صورة مصغرة أصغر حجمًا.


لقد عثرت على عنوان URL لموقعك على الويب وتحققت من ملف jpg فردي من الصفحة الرئيسية. في حين أن وقت التحميل معقول الآن (161ms) ، فإنه ينتظر 126ms ، وهو أكثر من اللازم.

تم تعيين جميع رؤوس الرسائل المعدلة الأخيرة على Sat ، 01 Jan 2011 12:00:00 GMT ، والتي تبدو "مستديرة" للغاية لتكون التاريخ الحقيقي للجيل ؛-)

نظرًا لأن التحكم في ذاكرة التخزين المؤقت هو "عام ، max-age = 14515200" ، فإن العناوين المعدلة في آخر تعديل قد تتسبب في حدوث مشكلة بعد 168 يومًا.

على أي حال ، ليس هذا هو السبب الحقيقي للتأخير.

يجب أن تتحقق مما يقوم به مولد الصور المصغرة الخاص بك عندما تكون الصورة المصغرة موجودة بالفعل وما يمكن أن يستهلك الكثير من الوقت في فحص الصورة وتسليمها.

يمكنك تثبيت xdebug لملف البرنامج النصي ومعرفة مكان الاختناقات.

ربما كل شيء يستخدم إطار أو يتصل ببعض قواعد البيانات من أجل لا شيء. لقد رأيت mysql_connect () بطيئًا جدًا على بعض الخوادم ، غالبًا لأنها كانت تتصل باستخدام TCP وليس مقبسًا ، أحيانًا مع بعض مشكلات DNS.

أتفهم أنه لا يمكنك نشر المولّد المدفوع الخاص بك هنا ، لكنني أخشى أن يكون هناك الكثير من المشاكل المحتملة ...


نأسف لقولك ، أنت تقدم القليل من البيانات. وكان لديك بالفعل بعض الاقتراحات الجيدة.

كيف تخدم تلك الصور؟ إذا كنت تقوم بالتدفق عبر PHP فأنت تقوم بعمل سيء للغاية ، حتى لو تم إنشاؤها بالفعل.

أبدا صور الدفق مع PHP. وسوف تبطئ الخادم الخاص بك ، بغض النظر عن الطريقة التي تستخدمها.

وضعها في مجلد يمكن الوصول إليه ، مع URI هادف. ثم اتصل بهم مباشرة باستخدام عنوان URI الحقيقي. إذا كنت بحاجة إلى جيل الطيران ، فيجب عليك وضع .htaccess في دليل الصور الذي يعيد التوجيه إلى برنامج php-script فقط إذا كانت صورة الطلب مفقودة. (وهذا ما يسمى استراتيجية ذاكرة التخزين المؤقت عند الطلب).

سيؤدي ذلك إلى حل جلسة php ، أو proxy-proxy ، أو التخزين المؤقت ، أو ETAGS ، مهما كان الأمر في وقت واحد.

يستخدم WP-Supercache هذه الإستراتيجية ، إذا تم تكوينها بشكل صحيح.

لقد كتبت هذا منذ بعض الوقت ( http://code.google.com/p/cache-on-request/source/detail?r=8 ) ، تم تعطيل المراجعات الأخيرة ، ولكن أعتقد أن 8 أو أقل يجب أن يعمل ويمكنك الاستيلاء على .htaccess كمثال فقط لاختبار الأشياء (على الرغم من أن هناك طرق أفضل لتكوين. htaccess من الطريقة التي اعتدت عليها).

لقد وصفت هذه الإستراتيجية في هذا التدوين ( http://www.stefanoforenza.com/need-for-cache/ ). ربما تكون مكتوبة بشكل سيء ولكنها قد تساعد في توضيح الأمور.

Further reading: http://meta.wikimedia.org/wiki/404_handler_caching


نظرًا لأن بعض المتصفحات لا تنزل سوى تنزيلين متوازيين لكل نطاق ، فلم تتمكن من إضافة نطاقات إضافية لتطويق الطلبات على أكثر من اثنين إلى ثلاثة أسماء مضيف مختلفة. على سبيل المثال 1.imagecdn.com 2.imagecdn.com


هل حاولت إعداد العديد من النطاقات الفرعية في NGINX webserver خصيصًا لخدمة البيانات الثابتة مثل الصور وأوراق الأنماط؟ يمكن العثور على شيء مفيد بالفعل في هذا الموضوع .


هل حاولت استبدال thumnails خلق php بواسطة الصور العادية لمعرفة ما إذا كان هناك أي اختلاف؟ قد تكون المشكلة حول - خطأ في كود php الخاص بك يؤدي إلى تجديد الصورة المصغرة على كل استدعاء خادم - تأخير في شفرتك (النوم ()؟) المرتبطة مشكلة الساعة - قضية hardrive تسبب حالة سباق سيئة للغاية حيث يتم تحميل / إنشاء جميع الصور المصغرة في نفس الوقت.


واو ، من الصعب شرح الأشياء باستخدام هذه الصورة .. ولكن هنا ، يحاول البعض:

  • الملفات 33-36 تحميل هذا المتأخر ، لأنها محملة بشكل حيوي داخل فرنك سويسري ، ويتم تحميل فرنك سويسري (25) لأول مرة تماما قبل تحميل أي محتوى إضافي
  • الملفات 20 و 21 ربما (لا أعرف ، لأنني لا أعرف الرمز الخاص بك) المكتبات التي يتم تحميلها بواسطة all.js (11) ، ولكن 11 للتنفيذ ، فإنه ينتظر الصفحة بأكملها (والأصول) لتحميل (يجب عليك تغيير ذلك إلى domready)
  • يتم تحميل الملفات 22-32 من قبل هاتين المكتبتين ، مرة أخرى بعد أن يتم تحميلها بالكامل




cache-control