PDA

View Full Version : سوال: مشکل در سرعت اجرای کد php



kabootar_y
دوشنبه 06 مهر 1394, 12:43 عصر
با سلام من یه اسکریپت تقریبا مثل مدیریت محتوای ساده نوشتم با php و از هیچ فریم ورکی هم استفاده نکردم.
تمام نکاتی که در مورد سرعت کد های php توی سایت های مختلف توضیح داده بودند رو رعایت کردم اما وقتی توی سایت http://tools.pingdom.com سرعتش رو میسنجم همش بالای 30 ثانیه هست در صورتی که یه وردپرس هم روی همون هاست نصب کردم و وقتی سرعت اون رو می سنجم از 2 ثانیه بیشتر نیست
مگه وردپرس چی کار کرده؟
لطفا راهنمایی کنید
آیا اسکریپتی هست که روی هاست نصب کنم و مشکل هایی که باعث این افت سرعت شدن رو معلوم کنه؟

Unique
دوشنبه 06 مهر 1394, 14:04 عصر
قبل از هر چیز لطفا مقدار Requests و Page Size را بدین.
نیاز به ذکر نیست که باید کمی صبر کنید تا رقم ها ثابت بشن که ؟

این زمانی هم که چک میکنه خیلی ربطی به سمت سرور نداره و بر اساس load فایل های javascript و css و عکس ها هستش

ravand
دوشنبه 06 مهر 1394, 18:44 عصر
با سلام من یه اسکریپت تقریبا مثل مدیریت محتوای ساده نوشتم با php و از هیچ فریم ورکی هم استفاده نکردم.
تمام نکاتی که در مورد سرعت کد های php توی سایت های مختلف توضیح داده بودند رو رعایت کردم اما وقتی توی سایت http://tools.pingdom.com سرعتش رو میسنجم همش بالای 30 ثانیه هست در صورتی که یه وردپرس هم روی همون هاست نصب کردم و وقتی سرعت اون رو می سنجم از 2 ثانیه بیشتر نیست
مگه وردپرس چی کار کرده؟
لطفا راهنمایی کنید
آیا اسکریپتی هست که روی هاست نصب کنم و مشکل هایی که باعث این افت سرعت شدن رو معلوم کنه؟
اتفاقا وردپرس سرعتشم پایینه. من توی سیستم خودم هم اجراش میکنم جون میکنه تا باز بشه.

pbm_soy
دوشنبه 06 مهر 1394, 21:15 عصر
اول از همه بحث اینجا روی سرعت برنامه نوشته شده با php است نه درباره وردپرس؟!
ورد پرس در کل سنگین است مخصوصا وقتی بروی آن ماژول و پلاگین هم نصب شده باشد! نکته ای را باید بگم اونم اینه که وردپرس شدیدا به ram احتیاج دارد بد نیست در زمان اجرای وردپرس منابع را مانیتور را کنید مخصوصا میزان مصرف رم را مانیتور کنید! قاعدتا اجرای وردپرس بصورت لوکال بهتر و سریعتر است!
در مورد سرعت کد php که نوشتید باید خیلی چیزها را بررسی کرد بهتر بود کد را اینجا میگذاشتید البته درصورت امکان!
در زمینه آنالیز کد php نرم افزارهای مختلفی وجود دارد

لینکهای زیر را بررسی کنید
https://en.m.wikipedia.org/wiki/List_of_performance_analysis_tools#PHP

http://www.webperformance.com

kabootar_y
سه شنبه 07 مهر 1394, 09:23 صبح
اول از همه دوستان متشکرم از پاسخ هاتون
حالا وردپرس اگر سرعتش کم هم هست باز نسبت به اسکریپتی که من نوشتم خیلی بیشتره؟

آیا میتونه سرعت کم اسکریپتم به خاطر استفاده از توابع mysql باشه؟ آیا اگه از mysql یا pdo استفاده کنم خیلی فرق میکنه یا نه اینقدر سرعتش تغییر نمیکنه که به چشم بیاد؟

kabootar_y
سه شنبه 07 مهر 1394, 09:25 صبح
دوست من متشکر از لطفت اما من صفحه اصلی ام رو به صورت ایستاتیک با همون حجم یعنی 2.7 MB اجرا کردم و مثل سرعت برق اجرا شد و نتیجه گرفتم چون کش رو فعال کردم مربوط به حجم فایل های قالب نیست.

ravand
سه شنبه 07 مهر 1394, 10:11 صبح
دوست من متشکر از لطفت اما من صفحه اصلی ام رو به صورت ایستاتیک با همون حجم یعنی 2.7 MB اجرا کردم و مثل سرعت برق اجرا شد و نتیجه گرفتم چون کش رو فعال کردم مربوط به حجم فایل های قالب نیست.
اگه کش شده باشه که بعدا باید سرعتش بیشتر بشه نه کمتر!
حجم 2.7 مگابایت برای یه صفحه زیاده. سرعت سایت به سرعت سرور هم بستگی داره.

hsgpro
سه شنبه 07 مهر 1394, 11:32 صبح
سلام
اگه از پروژه ات نمونه آنلاین بدی مطمئناً دوستان بهتر می تونن کمک کنن.
حداقل کاش میگفتید سایت pingdom در سربرگ Performance Grade چه ایراد هایی گرفته تا بتونیم بسته به اون ایراد ها کمکت کنیم.

kabootar_y
سه شنبه 07 مهر 1394, 11:47 صبح
سلام
اگه از پروژه ات نمونه آنلاین بدی مطمئناً دوستان بهتر می تونن کمک کنن.
حداقل کاش میگفتید سایت pingdom در سربرگ Performance Grade چه ایراد هایی گرفته تا بتونیم بسته به اون ایراد ها کمکت کنیم.

135558

این تصویر همون صفحه ای هست که فرمودید آدرس آنلاین اسکریپت رو هم پ.خ می کنم همین الان براتون
متشکر از لطفتون

hsgpro
سه شنبه 07 مهر 1394, 12:21 عصر
سایتتون واقعاً خیلی دیر لود میشه.
این مشکل از کدنویسی شما نیست مشکل از سرور است.

در GTmetrix گفته:

Your page generation time is slow
Find out why and explore possible solutions » (https://gtmetrix.com/why-is-my-page-slow.html)



یعنی تولید صفحه شما از طرف سرور خیلی خیلی طول میکشه.
هر اتفاقی هست هیچ ربطی به HTML و CSS و جاوا اسکریپت و تصاویر شما نداره هر چی هست از سرور و زبان های تحت سرور است که چندین ثانیه طول میکشه که تازه جواب درخواست Request مرورگر رو بده.

در این لینک https://gtmetrix.com/why-is-my-page-slow.html پیشنهاداتی داده شده اما من پیشنهاد میکنم حتماً یه بار پروژه ات رو توی یه هاست دیگه از یه شرکت دیگه تست کن ببین اون جا چطوره؟ یا کلاً توی localhost خوبه یا نه؟ من احتمال میدم مشکل از کانفیگ غلط کش کننده ها توسط سرور است.

us1234
سه شنبه 07 مهر 1394, 21:06 عصر
بحث سرعت خیلی پیچیده است و بدون تست های دقیق نمیشه نظر داد ولی در کل به صورت سر بسته بگم در خصوص keep alive ، بهینه سازی ریکویست ها ، استاتیک فایل ها و cdn ها (بیشتر) تحقیق کنید .


-- وردپرس بخاطر اینکه ارتباط پشت پرده خیلی زیاده به منابع وردپرس و منابع افزوده ها دارد و همیشه درحال بررسی وضعیت آپدیت افزونه ها است در لوکال سرعت خیلی کمی دارد ولی در هاست سرعتش بیشتر است .

pbm_soy
سه شنبه 07 مهر 1394, 22:38 عصر
سرعت و کارایی خود سرور مهم است
آیا وب سرور و دیتابیس سرور روی یک سرور قرار دارد و یا جدا هستند؟

فاکتور بعدی درسرعت میزان پهنای باند سرور است یعنی سرور با چه سرعتی به اینترنت متصل است و از چه backboneی استفاده میکند
مورد بعدی میزان ترافیک سرور است و چقدر شلوغ است؟!
تعداد سایتهایی که هاست کرده چقدر است؟ آیا این سایتها بصورت اشتراکی هاست شدند و یا اختصاصی؟

kabootar_y
چهارشنبه 08 مهر 1394, 10:17 صبح
مشکل اصلی رو فهمیدم که استفاده از mysql_* بود که دارم همه رو به PDO تغییر میدم

ولی باز با PDO هم روی لوکال خیلی سرعتش زیاده حتی از وردپرس سریع تره با همون حجم اطلاعاتی که روی وب داره اجرا میشه

نمی دونم روی یک هاست دیگه از یه شرکت دیگه هم تست کردم روی اون هم خیلی سرعتش افتضاحه.

هاستم بله از همین هاست های اشتراکی هست ولی فکر نمی کردم تا این اندازه بدردنخور باشه. چون قبلا از این هاست ها برای جوملا و وردپرس استفاده کرده بودم خیلی عالی بودن

به هر حال از همه دوستان که لطف داشتن متشکرم

ravand
چهارشنبه 08 مهر 1394, 12:59 عصر
مشکل اصلی رو فهمیدم که استفاده از mysql_* بود که دارم همه رو به PDO تغییر میدم

ولی باز با PDO هم روی لوکال خیلی سرعتش زیاده حتی از وردپرس سریع تره با همون حجم اطلاعاتی که روی وب داره اجرا میشه

نمی دونم روی یک هاست دیگه از یه شرکت دیگه هم تست کردم روی اون هم خیلی سرعتش افتضاحه.

هاستم بله از همین هاست های اشتراکی هست ولی فکر نمی کردم تا این اندازه بدردنخور باشه. چون قبلا از این هاست ها برای جوملا و وردپرس استفاده کرده بودم خیلی عالی بودن

به هر حال از همه دوستان که لطف داشتن متشکرم
اشتباه میکنی من بعید میدونم سرعت mysql از pdo کمتر باشه. اونم اینقدر که شما رو اذیت کرده باشه. سرعتشون زیاد با هم فرقی نداره. حتما از mysql درست استفاده نکردی. یه سری کدهات رو بذار بررسی کنیم ببینیم کجا اشتباه کردی!؟

Unique
چهارشنبه 08 مهر 1394, 16:36 عصر
مشکل اصلی رو فهمیدم که استفاده از mysql_* بود که دارم همه رو به PDO تغییر میدم
خیر ، کتابخونه mysql این مشکلاتی که شما میگی را نداره. در ضمن mysqli سرعتش از pdo هم بیشتره.

راستش شما نگفتین Requests و Page Size توی نتایج pingdom.com برای سایتتون چقدره.
در مورد هاست هم دو مورد :

۱ - کلا هاستینگ چند سالی هست افتاده دست بچه ها و نباید از هر شرکتی سرویس بگیرین. سعی کنید از شرکت های معتبر بگیرین.
۲ - توجه داشته باشین سرور های ایران برای اینکه سرعت را با pingdom.com چک کنین مناسب نیستند.

موفق باشین.

kabootar_y
چهارشنبه 08 مهر 1394, 17:29 عصر
بله اشتباه کردم به خاطر استفاده از توابع mysql_* نبود اما حالا متوجه مشکل اصلی شدم ولی به هر حال این تغییر از mysql به pdo یا mysqli بالاخره که باید انجام میشد دیگه

حالا مشکل من اساسی تر شده. من حدود 2000 رکورد در جدول product داشتم. وقتی این رکوردها رو از 2000 به 1000 تغییر دادم یعنی 1000 تا رو delete کردم نتیجه در سایت pingdom از 36 ثانیه به 11.8 ثانیه رسید وقتی تعداد رکورد ها رو 250 تا کردم سرعت به 3.16 ثانیه رسید و وقتی رکورد ها رو 100 تا کردم سرعت به 788 ms رسید





توجه داشته باشین سرور های ایران برای اینکه سرعت را با pingdom.com چک کنین مناسب نیستند.

هاست من هاست لینوکس خارجی هست که از سایت http://toobaweb.com/cart.php?gid=1&currency=2 خریدم بسته cp-1 500 مگابایتش

حالا دوستان لطفا راهنمایی کنید که مشکل از نحوه طراحی دیتابیس هست یا از خود سرور یا کد های php؟




//index.php

define('BASE_PATH', dirname( __FILE__ ));

require(BASE_PATH . '/config.php');

require(BASE_PATH . '/functions.php');

require(BASE_PATH . '/loader.php');






//config.php


$host ="localhost";

$user ="root";$pass ="";

$db ="databasename";

$pref = "prefix_";
...





//loader.php


if(!sizeof($_GET) && !sizeof($_POST))
{
unset($_GET, $_POST, $_COOKIE, $_FILES, $_ENV, $_REQUEST, $_SERVER);

require(BASE_PATH . '/template/index.php');
exit(0);}
...


تا یه جایی کدها رو گذاشتم از لطف همه ممنونم

hsgpro
چهارشنبه 08 مهر 1394, 18:49 عصر
تو هر صفحه 2000 رکورد می خونید؟ خب پس مشخص شد مشکل از چیه.
مسلماً شما تو هر صفحه 2000 محصول نمایش نمیدین پس بهتر نیست کوئری ها رو بهینه تر کنید و فقط اونایی که نیاز هست رو از دیتابیس بخونید نه؟
در جا هایی هم که تعداد رکورد زیادی باید خونده شود هم بهتره صفحه بندی کنید و چند تا چند تا بخونید.

kabootar_y
چهارشنبه 08 مهر 1394, 20:31 عصر
من از sql ای استفاده می کنم که حدس خودم اینه که مشکل اصلی از همین باشه.
آیا راه دیگری برای بدست آوردن نتیجه کد زیر با روش دیگری هست؟





$sql = "SELECT * FROM ".$pref."products WHERE status = '1' AND id IN (SELECT ".$pref."product_id FROM category_controller WHERE category_id IN (SELECT id FROM ".$pref."categories WHERE status = '1'))";

Unique
پنج شنبه 09 مهر 1394, 00:32 صبح
آیا راه دیگری برای بدست آوردن نتیجه کد زیر با روش دیگری هست؟
استفاده از subquery های تو در تو برای پایگاه داده مناسب نیستند و باید از join ها استفاده کنید. مثلا اینطوری :

select t1.* from ".$pref."products t1 inner join category_controller t2 on t1.id = t2.".$pref."product_id inner join ".$pref."categories t3 on t2.category_id = t3.id where t1.status = 1 and t3.status = 1

نکته مهم دیگه ای که دقت نکردین و دوستان اشاره کردن اینه که گویا شما همه رکورد ها را دارین توی خروجی چاپ میکنید که درست نیست و باید pagination داشته باشین و صفحه به صفحه نشون بدین مثلا ۳۰ تایی یا ۱۰ تایی و ...

kabootar_y
پنج شنبه 09 مهر 1394, 09:33 صبح
نکته مهم دیگه ای که دقت نکردین و دوستان اشاره کردن اینه که گویا شما همه رکورد ها را دارین توی خروجی چاپ میکنید که درست نیست و باید pagination داشته باشین و صفحه به صفحه نشون بدین مثلا ۳۰ تایی یا ۱۰ تایی و ...

نه من همه رکوردها (مثلا 2000) تا رو در هیچ صفحه ای نمایش ندادم. از یه کلاس برای Pagination استفاده میکنم که تعداد کل رکوردهای (محصولات) قابل نمایش رو میگیره و دو خروجی limit_start , limit_end میده

من فکر میکنم چون تعداد رکوردها در دیتابیس زیاد هست وقتی من میخوام حتی یک رکورد رو مثلا با select * from products where id = 819 بگیرم هم به دلیل رکوردهای زیاد سرعتش کمه یا وقتی میخوام تعداد کل محصولات قابل نمایش رو بگیرم

باز هم از لطف همه دوستان مخصوصا Unique (http://barnamenevis.org/member.php?11933-Unique) بینهایت متشکرم

Unique
پنج شنبه 09 مهر 1394, 14:49 عصر
تعداد کل رکوردهای (محصولات) قابل نمایش رو میگیره
برای پیدا کردن تعداد کل لازم نیست همه را select کنین و باید با (*)count تعداد کل را بگیرین.


ن فکر میکنم چون تعداد رکوردها در دیتابیس زیاد هست وقتی من میخوام حتی یک رکورد رو مثلا با select * from products where id = 819 بگیرم هم به دلیل رکوردهای زیاد سرعتش کمه یا وقتی میخوام تعداد کل محصولات قابل نمایش رو بگیرم
دوست عزیز ۲۰۰۰ تا رکورد چیزی در حد جوک هستش ، با ۲۰ میلیو نرکورد هم query بالا در چند میلی ثانیه جواب میده. id که یک فیلد منحصر به فرد و index شده هستش.

من توصیه میکنم اول خروجی query ها را توی mysql بگیرین و بررسی کنین چقدر زمان میبره و با تصحیح کردن ساختار جداول و بهینه سازی query و تنظیم Index های صحیح از بابت پایگاه داده اطمینان حاصل کنین.

kabootar_y
پنج شنبه 09 مهر 1394, 23:18 عصر
آیا VIEW در MYSQL راه خوبی هست برای سرعت بخشیدن به query ها؟
نحوه استفاده اش رو اگه میشه یکی توضیح بده یا لینک آموزش بدین لطفا. البته آموزش کامل نه در حدی که در w3scools.com توضیح داده
یه سوال دیگه هم داشتم که آیا view که ایجاد میشه برای همون کاربر یا بازدید کننده ساخته میشه یا نه کاربر جدید هم بیاد از سایت بازدید کنه از همون view ساخته شده قبلی استفاده میشه؟

در کل این روش توصیه میشه یا نه؟

متشکر از دوستان بابت لطف زیادتون

Unique
جمعه 10 مهر 1394, 01:12 صبح
آیا VIEW در MYSQL راه خوبی هست برای سرعت بخشیدن به query ها؟
جواب مستقیمش میشه نه ! اما چون view ها را میشه index کرد پس اگه چند تا query متداخل داشته باشیم که یک view را میسازن و میخوایم خروجی ازشون بگیریم بر اساس index گذاری که روی view کردیم خوب قطعا توی سرعت تاثیر داره.


نحوه استفاده اش رو اگه میشه یکی توضیح بده یا لینک آموزش بدین لطفا. البته آموزش کامل نه در حدی که در w3scools.com توضیح داده
منبع لاتین که خیلی زیاده اما منابع فارسی را چون نمیرسم کامل بخونم نمیتونم معرفی کنم :
http://www.mysqltutorial.org/mysql-views-tutorial.aspx
http://www.mysqltutorial.org/create-sql-views-mysql.aspx
http://code.tutsplus.com/articles/an-introduction-to-mysql-5-views--net-12698


آیا view که ایجاد میشه برای همون کاربر یا بازدید کننده ساخته میشه یا نه کاربر جدید هم بیاد از سایت بازدید کنه از همون view ساخته شده قبلی استفاده میشه؟
سوالتون دو پهلو هستش ۷ اگه منظورتون بازدیدکنندگان سایت هستند که با یک نام کاربری به database وصل میشن خوب برای همشون یکیه ! اما اگه منظورتون اینه چند نام کاربری mysql دسترسی های مختلف به view ها داشته باشن جوابتون اینه که بله میشه به یکسری دسترسی داد و به یکسری نداد. یکی از قابلیت های view ها هم همینه. در واقع میان دستری را به جدول اصلی میبندن و به اون view دسترسی میدن تا اطلاعات اصلی را امن کنند و دسترسی به اونها ندن.


در کل این روش توصیه میشه یا نه؟
بله خیلی مورد استفاده داره و علت اینکه توی پروژه ها خییل بهش بر نمیخورین اینه که عموما یادگیری برنام هنویسان از پایگاه های داده کامل نیست وگرنه view ها خیلی از query های پیچیده را میتونن ساده و در دسترس کنن.