PDA

View Full Version : آموزش: روش هایی برای بهینه ساختن دستورات در PHP



trade_mark
دوشنبه 30 فروردین 1389, 17:28 عصر
تما می دانید در برنامه نویسی روش های وجود دارد که می توانید کد های اجرایی را بهینه کنید ، شاید وقتی برنامه ای را بر روی سیستم خود می نویسید و اجرا می کنید درست و بدون نقص کار کند اما وقتی زیر تست می رود مشکلاتش تازه نمایان می شود.
http://ipooya.com/files/php-logo.jpg
در این نوشته می خواهیم در مورد بهینه سازی دستورات در php صحبت کنیم ، اگر روش های که در اینجا به آنها اشاره می شود را با دقت در برنامه های خود لحاظ کنید ، شاید در یک برنامه ۱۰ خطی و یا کمی بیشتر بالا رفتن سرعت اجرای برنامه را حس نکنید ، اما در یک برنامه سنگین تر تغییرات کاملا حس می شوند.
خروجی ها:
این را به خاطر داشته باشید که تابع echo (http://www.php.net/echo) سریعتر از تابع print (http://www.php.net/print) عمل می کند.
تک کوتیشن سریع تر از دابل کوتیشن عمل می کند ، به عنوان مثال:


echo 'a string ' . $name;
//is faster than
echo "a string $name"; و اجرای برنامه سریعتر می شود وقتی که از چند پارامتر استفاده کنید:

echo 'this', 'is', 'a', $variable, 'string';
//is faster than
echo 'this' . 'is' . 'a' . $variable . 'string'; حلقه ها و متغییر ها
همیشه قبل از اینکه متغییری را در حلقه استفاده کنید ، مقدار آن را حساب کنید:


$max = count($array);
for ($i = 0; $i < $max; $i++)
//is faster than
for ($i = 0; $i < count($array); $i++) زمانی که می خواهید طول متغییری را محاسبه کنید:
if (!isset($foo{5})) { echo "Foo is too short"; }
//is faster than
if (strlen($foo) < 5) { echo "Foo is too short"; } زمانی که می دانید تغییر در محاسبات پیش نمی آید از روش پری فیکس به جای پست فیکس استفاده کنید:
++$i;
//is faster than$i++; توابع و متغییر ها:
متغییر های خود را با استفاده از تابع Unset (http://ir.php.net/unset) خالی کنید تا حافظه تخصیص داده شده به آنها نیز خالی شود.
از تابع require (http://ir.php.net/require) به جای require_once (http://ir.php.net/require_once) در مواقعی که می توانید استفاده کنید. یعنی لازم نیست که همه جای برنامه از require_once استفاده کنید.
از آدرس کامل استفاده کنید ، این کار باعث می شود که زمان کمتری برای محاسبه آدرس فایل مورد نظر در سیستم استفاده شود:


include('http://pixeldesign.ir/test.php');
//is faster than
include('test.php') دستور else if سریعتر از switch/case عمل می کند.
دیگر موارد:
جهت نمایش ندادن خطا ها استفاده از @ سرعت را به شدت پایین می آورد می توانید از روشی شبیه این روش استفاده کنید:


if (isset($albus)) $albert = $albus;
else $albert = NULL;
//is faster than
$albert = @$albus; حتما php را اینگونه تعریف کنید:
<?php … ?>
جهت رعایت موارد امنیتی ، هیچ وقت به متغییر های که از طرف کاربران مقدار دهی می شوند (POST_$) اعتماد نکنید!
هنگام خواند از بانک اطلاعاتی از تابع mysql_real_escape_string (http://ir.php.net/mysql_real_escape_string) استفاده کنید و از تابع htmlspecialchars (http://ir.php.net/htmlspecialchars) زمانی که خروجی html تولید می کنید.


//a safe query
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
mysql_real_escape_string($user),
mysql_real_escape_string($password));
//safe output
echo htmlspecialchars(">a href="test"&gtTest>/a&gt", ENT_QUOTES);
//output: <a href='test'>Test</a> به هیچ وجه از مقدار اصلی جهت ثبت و یا بازخوانی اطلاعاتی از قبیل رمز های عبور استفاده نکنید:


$user_input = 'myPassword';
if (md5($user_input) == $md5_password_from_database) {
//login here...
} جهت ذخیره ip ها از توابع ip2long و long2ip استفاده کنید.