৪০টি টিপস(সাথে বোনাস): PHP অপটিমাইজ করুন


1. কোনো মেথড যদি static করা যায় তাহলে তাই করুন, কারণ তাতে স্পীড ৪গুণ বাড়বে।
2. echo কনস্ট্রাক্টটি print এর চাইতে দ্রুততর। তবে print এর একটি রিটার্ন ভ্যালু আছে এবং এটি মাত্র একটি প্যারামিটার নেয়।
3. কনক্যাট করার চেয়ে echo এর একাধিক প্যারামিটার পদ্ধতি অর্থাৎ কমা ব্যবহার করে স্ট্রিং আর ভ্যারিয়েবল আলাদা করুন।
4. for লুপের maxvalue আগেই নির্ধারণ করুন, লুপের ভেতর সেটি করবেন না। অথাৎ ক্যালকুলেট করে লুপ চলাকালীন যাতে প্রতিবার বের করতে না হয়।
5. আপনার ব্যবহৃত ভ্যারিয়েবলগুলোকে আনসেট করে মেমোরি ফ্রি করুন, বিশেষ করে বড় বড় অ্যারে নিয়ে যখন কাজ করবেন, সেগুলোকে আনসেট করতে ভুলবেন না।
6. __get, __set, __autoload এজাতীয় ম্যাজিক মেথডগুলো এড়িয়ে চলতে পারলে ভালো। তবে আজকাল ফ্রেমওয়ার্কগুলোতে এগুলো ব্যবহার করা হয় অনেক বেশি পরিমাণে।
7. require_once() ফাংশনটি এক্সপেনসিভ, পারলে এটির ব্যবহার করবেন না।
8. যদি আপনার ফাইলসমূহের ইনক্লুড পাথ জানা থাকে তবে অ্যাবসোলিউট পাথ ব্যবহার করুন(প্রোগ্রাম এক্সিকিউশন অনেক দ্রুততর হবে)।
9. যদি আপনার স্ক্রিপ্টটি ঠিক কখন এক্সিকিশন শুরু করেছে জানতে চান, তাহলে $_SERVER[’REQUEST_TIME’] ব্যবহার করুন time() নয়।
10. যদি সম্ভব হয় তবে, strncasecmp, strpbrk এবং stripos প্রভৃতি ব্যবহার করুন regex এর বদলে। কারণ রেগুলার এক্সপ্রেশন এর এক্সিকিউশন মন্থর।
11. str_replace ফাংশনটি preg_replace এর চাইতেও দ্রুততর, কিন্তু strtr ফাংশনটি str_replace এর তুলনায়ও ৪গুণ দ্রুততর।
12. যদি কোনো ফাংশন যেমন স্ট্রিং রিপ্লেসমেন্ট ফাংশন অ্যারে এবং সিঙ্গল ক্যারেক্টার উভয়ই আরগুমেন্ট হিসেবে নেয়, আর আপনার আরগুমেন্ট লিস্ট যদি খুব বড়া না হয়। তাহলে হাতেই লিখেদিন কয়েকটি রিপ্লেসমেন্ট স্টেটমেন্ট(এক লাইনেই অ্যারেতে পুরো আরগুমেন্ট পাস করার বদলে), যাতে একটি একটি করে ক্যারেক্টার পাস করবেন।
13. যেখানেই সম্ভব if, else if এর জঙ্গলের চেয়ে switch-case ব্যবহার করুন। পিএইচপি ৬ এ goto স্টেটমেন্টটিও ফিরে আসছে!
14. Error suppression অপারেটর @ ব্যবহার করলে স্ক্রীপ্ট অনেক মন্থর চলবে। তাই যখন-তখন এটি ব্যবহার করবেন না। এমনকি ডিবাগিংও করা কঠিন হয়ে যায় এটি ব্যবহারে।
15. অ্যাপাচি’র mod_deflate অন করে দিন।
16. ডাটাবেজ কানেকশন নিয়ে কাজ করা হয়ে গেলেই তা ক্লোজ করে দিন।
17. $row[’id’] এভাবে লিখলে তা $row[id] এর চেয়ে ৭ গুণ দ্রুততর হবে। কারণ ” দিয়ে আগেই বলে দেয়া হচ্ছে কি করতে হবে, ” না দিলে গরু খোঁজা শেষ করে তারপর কাজ করে। :)
18. Error messages are expensive টেস্টিং এর সময় এরর মেসেজ রাখুন, প্রোডাকশনে এরর বাদ।
19. for লুপের ভেতরে ফাংশন ব্যবহার এড়িয়ে চলবেন, যেমন: for ($x=0; $x < count($array); $x) এখানে count() ফাংশনটি বারবার কল হবে। 4 নং পয়েন্ট দেখুন।
20. কোনো মেথডের লোকাল ভ্যারিয়েবলকে ইনক্রিমেন্ট করা অপেক্ষাকৃত দ্রুততর। যা কিনা কোনো ফাংশনের লোকাল ভ্যারিয়েবলকে কল করার মতোই সমগতির।

21. গ্লোবাল ভ্যারিয়েবল এর ইনক্রিমেন্ট একটি লোকাল ভ্যারিয়েবলের তুলনায় দ্বিগুণ মন্থর।
22. কোনো অবজেক্ট প্রোপার্টি’র ইনক্রিমেন্ট (যেমন $this->prop++) লোকাল ভ্যারিয়েবল ইক্রিমেন্ট থেকেও ৩গুন মন্থর।
23. ইনিশিয়ালাইজ না করা কোনো লোকাল ভ্যারিয়েবলের ইনক্রিমেন্ট ইনিশিয়ালাইজ করাটি তুলনায় ৯-১০গুণ মন্থর হবে।
24. কোনো গ্লোবাল ভ্যারিয়েবল ডিক্লেয়ার করলেন কিন্তু তার ব্যবহার করেননি, তবুও এটা এক্সিকিউশনকে মন্থর করে দেবে (মন্থরতার পরিমান কোনো লোকাল ভ্যারিয়েবলকে ইনক্রিমেন্ট করানোর সমান). PHP খুব সম্ভব এ সময় খুঁজে দেখে এই নামে কোনো গ্লোবাল ভ্যারিয়েবল আছে কিনা আগেই।
25. মেথড ইনভোক করলে তা ক্লাসের ভেতর কতগুলো মেথড রয়েছে তার উপর নির্ভরশীল নয়। পরীক্ষায় দেখা গেছে, একটি টেস্ট ক্লাসের কোনো মেথডের পূর্বে বা পরে ১০টি এক্সট্রা মেথড যোগ করেও পারফর্মেন্সের হেরফের পাওয়া যায়নি(এটি সরাসরি কোনো কাজে লাগবে বলে মনে হচ্ছেনা ;))।
26. ডিরাইভড ক্লাসের মেথডগুলো বেজ ক্লাসের মেথডগুলোর চেয়েও দ্রুত কাজ করে।
27. যদি এমন একটি ফাংশন কল করা হয় যার একটি প্যারামিটার আছে তবে ফাংশনের বডিতে কোনো কোড নেই, তবে তাও কিন্তু ৭/৮টি $localvar++ অপারেশনের সমান! আর তা যদি ফাংশ না হয়ে মেথড হয় তবে তা প্রায় ১৫টি $localvar++ অপারেশনের সমান!
28. আপনার স্ট্রিং গুলোকে ‘ দিয়ে কোট করুন ” দিয়ে নয়, এতে এক্সিকিউশন কিঞ্চিত হইলেও দ্রুততর হবে, কারণ পিএইচপি “…” এর ভেতরে ভ্যারিয়েবল খুঁজে বেড়ায়। কিন্তু ‘…’ এর ভেতরে খোঁজে না। অবশ্য যদি ভ্যরিয়েবল রাখতে চান তবে “…” এর ভেতরেই ব্যবহার করতে হবে।
29. স্ট্রীং ইকো করার সময় ডট এর বদলে কমা দিয়ে সেগুলো পৃথক করলে তা দ্রুততর হবে। তবে মনে রাখবেন এটি ইকো’র বেলায়ই খাটে কেননা কমা দিয়ে আসলে একাধিক প্যারামিটার নিচ্ছে সে। ২নং পয়েন্টেই এই কথা বলা আছে আবার এইখানে বললো কেনু? :X
30. কোনো PHP স্ক্রীপ্ট কোনো HTML পেজের চেয়ে কম করেও ২থেকে ১০ গুণ মন্থরতায় রান করবে অ্যাপাচিতে। তাই HTML বেশি ব্যবহার করে স্ক্রীপ্টের ব্যবহার সীমিত রাখুন। মানে মাথাব্যথা করলে মাথা কেটে ফেলুন। :P
31. আপনার পিএইচপি কোড বারবার রিকম্পাইল হবে যদি না তা ক্যাশিং করা থাকে। কোনো ক্যাশিং সফটওয়্যার কাজে লাগান আপনার সার্ভারে তা ২৫ থেকে ১০০% পর্যন্ত বেশি দ্রুততা নিশ্চিত করতে পারে। বড় কোনো সাইট করতে গেলে এসব অবশ্যই খেয়াল করা দরকার।
32. যতো ক্যাশ করা যায় করুন। memcached ব্যবহার করুন। মেমক্যাশড একটি হাই পারফর্ম্যান্স মেমোরি অবজেক্ট ক্যাশিং সিস্টেম। এটি ডাটাবেজ লোড কমিয়ে ডাইনামিক ওয়েব অ্যাপ্লিকেশনের কার্যকারিতা বৃদ্ধিতে সহায়ক। অপকোড ক্যাশ করাও জরুরী, তাহলে আপনার পিএইচপি কোডকে বার বার কম্পাইল করতে হচ্ছেনা।
33. যখন কোনো স্ট্রিং নিয়ে কাজ করছেন তখন আপনি যদি এর লেংথ চেক করতে চান, নিশ্চয়ই প্রথমে মনে আসবে strlen() ফাংশনটির কথা। ফাংশনটি বেশ দ্রুত কাজ করে কারণ এটির অপারেশনে কোনো ক্যালকুলেশন থাকেনা, বরং অলরেডি জানা লেংথটিই রিটার্ন করে zval নামক স্ট্রাকচার থেকে(এটি অভ্যন্তরীন সি স্টাক্ট যার মধ্যে পিএইচপি’র ভ্যারিয়েবলগুলো থাকে)। তবে যেহেতু strlen() একটি ফাংশন তাই এটি কিছুটা হলেও মন্থর, কারণ এটি আরো কয়েকটি ফাংশন কলের উপর নির্ভরশীল যেমন lowercase বা hashtable lookup ইত্যাদি। আপনি কিছু কিছু ক্ষেত্রে এটাকে অপটিমাইজ করে নিতে পারেন isset() কনস্ট্রাক্ট ব্যবহার করে দেখুন:

Ex. if (strlen($foo) < 5) { echo “Foo is too short”; } vs. if (!isset($foo[5])) { echo “Foo is too short”; } খুবই মজার ব্যাপার!

কনস্ট্রাক্ট হওয়াতে isset() দ্রুত রান করে কারণ এতে ফাংশন লুকআপ তো নেই’ই লোয়ারকেস বা হ্যাশটেবলও দেখতে হচ্ছেনা। এধরণের চালাকি ঠিকমতো কাজে লাগাতে পারলে বেশ মজা পাবেন নি:সন্দেহে।

34. ভ্যারিয়েবলের মান কমানো বাড়ানোর সময় $i++ সবসময়ই ++$i থেকে মন্থরতর। এটা সম্পর্কে বলা হয়েছে এটা পুরোটাই PHP নির্ভর তাই আপনার C বা Java কোডেও এই বুদ্ধি কাজে লাগাতে গেলে তেমন ফায়দা হবেনা(আগে সিতে এই অপটিমাইজেশনের কথা বলা হতো এখন কম্পাইলারেই অপটিমাইজড হবে হয়তো)। ++$i এটি PHPতে দ্রুততর কারণ $i++ এ ৪টি অপকোড ব্যবহৃত হয়েছে কিন্তু প্রি-ইনক্রিমেন্টে মাত্র ৩টি। সবারই জানা আছে পোস্ট ইনক্রিমেন্ট একটি টেম্পোরারি ভ্যারিয়েবল তৈরি করে এরপর তা ইনক্রিমেন্ট করে। কিন্তু প্রি-ইনক্রিমেন্ট মানটি সরাসরি ইনক্রিমেন্ট করে। Zend এর পিএইচপি অপটিমাইজারও এধরণের অপকোড অপটিমাইজ করে। তবুও এধরণের প্রাকটিস রাখা ভালো কেননা অনেক হোস্টিংয়েই কিন্তু অপকোড অপটিমাইজার ব্যবহার করা হয়না।
35. সবকিছুকেই OOP করতে হবে এমন কথা নেই, অনেক বেশি ওভারহেড তৈরি করে এবং প্রতিটি মেথড এবং অবজেক্ট কল করা হলে অনেক মেমোরি দখল হয়ে যায়। সবসময়ই ঢাল, সড়কি লাগবে না, প্রয়োজনে একটি চড়ই যথেষ্ট। ;)
36. সবধরণের ডাটা স্ট্রাকচারকেই class এ পরিণত করতে হবে এমন কোনো বাধ্যবাধকতা নেই arrayও কিন্তু অনেক কাজের।
37. মেথডকে অযথাই অনেকগুলো স্প্লিট করে করার দরকার নেই। আগেই ভেবে নিন ঠিক কোন কোডগুলো বারবার আপনার ব্যবহার করার প্রয়োজন হবে।
38. যদি দেখেন যে মেথডের কোনো বিশেষ অংশ আলাদা করা দরকার, রি-ফ্যাক্টরিং এর সময় তা পরেও করতে পারবেন।
39. অসংখ্য প্রিডিফাইনড ফাংশন আছে পিএইচপিতে সেগুলোর ব্যবহারে প্রাধাণ্য দিন। অনেক সময়ই সেগুলোর ব্যবহারই অনেকে জানেন না, এগুলো নিজের লেখা ফাংশনের চেয়ে দ্রুত রান করার সম্ভাবনা বেশি।
40. এটা অ্যাডভান্সড লেভেলের জন্য। আপনার কোনো ফাংশন যদি অনেক সময় সাপেক্ষ এক্সিকিউট করে তবে তা C এক্সটেনশন(PECL) হিসেবে তৈরি করে নিতে পারেন।
41. কোড প্রোফাইলিং করুন। প্রোফাইলারের মাধ্যমে আপনি জানতে পারবেন কোন কোড বেশি রান হচ্ছে, কোন অংশ বেশি সময় নিচ্ছে ইত্যাদি। সুতরাং সেইভাবে অপটিমাইজ করতে পারবেন। Xdebug এর একটি প্রোফাইলার আছে। আরো নতুন নতুন কি কি বের হচ্ছে খোঁজ রাখুন।
42. mod_gzip নামে একটি অ্যাপাচি মডিউল আছে। যা আপনার ডাটাকে অন দ্য ফ্লাই কম্প্রেস/সংকোচন করতে পারে এবং ডাটা ট্রান্সফার প্রায় ৮০% কমিয়ে দিতে সক্ষম।
43. এই ছোট আর্টিকেলটিও চোখ বুলিয়ে নিতে পারেন John Lim এর পিএইচপি অপটিমাইজেশন’এর উপর লেখা।

এই আর্টিকেলটি ২০টির’ও বেশি ভাষায় অনূদিত। আর কিছুক্ষণ আগে এটি বাংলায়ও অনূদিত হলো এই অধমের দ্বারা

আর্টিকেলটি ক্রিয়েটিভ কমনস লাইসেন্সের অধীনে প্রকাশিত। কোথাও এর কোনো অংশ ব্যবহার করলে মূল সূত্রগুলো উল্লেখ বাধ্যতামূলক।

4 thoughts on “৪০টি টিপস(সাথে বোনাস): PHP অপটিমাইজ করুন

  1. বাহ। অনেক কিছু জানতে পারলাম । কয়েকটা পয়েন্ট আমিও টাইম সাপেক্ষ পদ্ধতি ব্যবহার করতাম, এখন থেকে এখানে সাজেস্ট করা পদ্ধতি ব্যবহার করব।

    ১১ নং পয়েন্টে strtr এর কথা এখানেই জানলাম। অনেক ধন্যবাদ।

    ৩০ নং পয়েন্টের বিষয়টা কি ?
    <?php
    echo "$text”
    ?>
    এরকম ব্যবহার না করে,
    <option value= >

    এরকম করলে দ্রুত হবে ?

    অবশেষে আবার ও ধন্যবাদ।😀

  2. বাহ। অনেক কিছু জানতে পারলাম । কয়েকটা পয়েন্ট আমিও টাইম সাপেক্ষ পদ্ধতি ব্যবহার করতাম, এখন থেকে এখানে সাজেস্ট করা পদ্ধতি ব্যবহার করব।

    ১১ নং পয়েন্টে strtr এর কথা এখানেই জানলাম। অনেক ধন্যবাদ।

    ৩০ নং পয়েন্টের বিষয়টা কি ?

    <?php
    echo "<option value=$value>$text</option>"
    ?>

    এরকম ব্যবহার না করে,

    <option value=<?php echo $value ?> ><?php $text ?></option>

    এরকম করলে দ্রুত হবে ?

    অবশেষে আবার ও ধন্যবাদ।😀

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s