কেন প্রয়োজনীয়_অনস ব্যবহার করা এত খারাপ?


143

উন্নত পিএইচপি কোডিং অনুশীলন সম্পর্কে আমি যা কিছু পড়ি তা বলতে থাকে require_onceগতির কারণে ব্যবহার করবেন না ।

কেন?

একই জিনিসটি করার সঠিক / আরও ভাল উপায় কী require_once? যদি এটি গুরুত্বপূর্ণ হয় তবে আমি পিএইচপি 5 ব্যবহার করছি।


9
এই প্রশ্নটি এখন বেশ পুরানো, এবং উত্তরগুলি সন্দেহজনকভাবে আর প্রাসঙ্গিক। অংশগ্রহণকারীদের কাছ থেকে উত্তরগুলির একটি আপডেট সেট দেখতে পারা দুর্দান্ত হবে :)
শুক্রফফান

উত্তর:


108

require_onceএবং include_onceউভয়েরই প্রয়োজন যে সিস্টেমটি ইতিমধ্যে কী অন্তর্ভুক্ত / প্রয়োজনীয় হয়েছে তার একটি লগ রাখে। প্রতিটি *_onceকল মানেই সেই লগ চেক করা। সুতরাং সেখানে অবশ্যই কিছু অতিরিক্ত কাজ করা হচ্ছে তবে পুরো অ্যাপ্লিকেশনটির গতি ক্ষতির জন্য যথেষ্ট?

... আমি সত্যিই এতে সন্দেহ করি ... আপনি যদি না সত্যিই পুরানো হার্ডওয়্যার থেকে থাকেন বা এটি অনেক কিছু না করেন তা না হলে ।

আপনি যদি করছে হাজার হাজার করছেন *_once, আপনি একটি লাইটার ফ্যাশন কাজ নিজেকে করতে পারে। সহজ অ্যাপ্লিকেশনগুলির জন্য, কেবল একবারে এটি যথেষ্ট পরিমাণে অন্তর্ভুক্ত করা উচিত তা নিশ্চিত করে তবে আপনি যদি এখনও ত্রুটিগুলি পুনরায় সংজ্ঞায়িত করে থাকেন তবে আপনি এর মতো কিছু করতে পারেন:

if (!defined('MyIncludeName')) {
    require('MyIncludeName');
    define('MyIncludeName', 1);
}

আমি ব্যক্তিগতভাবে *_onceবিবৃতিতে আটকে থাকব তবে নির্বোধ মিলিয়ন-পাস বেঞ্চমার্কে, আপনি দুজনের মধ্যে একটি পার্থক্য দেখতে পাবেন:

                php                  hhvm
if defined      0.18587779998779     0.046600103378296
require_once    1.2219581604004      3.2908599376678

10-100 with require_onceএর সাথে ধীর এবং এটি কৌতূহল যা require_onceআপাতদৃষ্টিতে ধীর hhvm। আবার আপনি যদি *_onceহাজার হাজার বার চালনা করেন তবে এটি কেবল আপনার কোডের সাথে প্রাসঙ্গিক ।


<?php // test.php

$LIMIT = 1000000;

$start = microtime(true);

for ($i=0; $i<$LIMIT; $i++)
    if (!defined('include.php')) {
        require('include.php');
        define('include.php', 1);
    }

$mid = microtime(true);

for ($i=0; $i<$LIMIT; $i++)
    require_once('include.php');

$end = microtime(true);

printf("if defined\t%s\nrequire_once\t%s\n", $mid-$start, $end-$mid);

<?php // include.php

// do nothing.

29
আমি সন্দেহ করি যে আপনার সংজ্ঞায়িত () পদ্ধতিটি অন্তর্নির্মিত অনুসন্ধানের টেবিলের চেয়ে দ্রুততর তবে আমি আপনার সামগ্রিক পয়েন্টের সাথে একমত - অবশ্যই একটি অ-ইস্যু ?!
ববি জ্যাক

1
আমি মোটামুটি নিশ্চিত যে আপনি ঠিক ববি ঠিকই আছেন তবে আমি _অনসেসের উপরে সংজ্ঞায়নের পক্ষে পরামর্শ দিচ্ছি না। এটি কেবল একটি বিকল্প। কোডটি ব্যাখ্যা করতে যে সময় লাগবে এটি এটিকে সামান্য ধীর করে তুলতে পারে তবে এটি বলেছিল, অভ্যন্তরীণ পদ্ধতিটি কতটা নিখুঁত তা আমি জানি না। কোনও অনুলিপি নিশ্চিত করতে এটি অতিরিক্ত কাজ করতে পারে।
অলি

8
অন্য দিকটি হ'ল এপিসি অন্তর্ভুক্ত_এইচএসকে ক্যাশে করে না এবং প্রয়োজনীয়_আনসিকে আইআইআরসি কল করে
ডেকউসিনিউ

3
আমি মাত্র দুটি পদ্ধতির একটি খুব প্রাথমিক পরীক্ষা করেছি - আমি একটি ফাইল সহ 1000,000 পুনরাবৃত্তি করেছি যা কেবল একটি ধ্রুবককে 'টেস্টক্লিনেজড' হিসাবে সংজ্ঞায়িত করে। প্রথম পরীক্ষায়, আমি প্রয়োজনীয়_অনস ব্যবহার করলাম, দ্বিতীয়টি যদি আমি ব্যবহার করতাম ((সংজ্ঞায়িত ('টেস্টিনক্লিন')) এবং ফলাফলগুলি আকর্ষণীয় ছিল: প্রয়োজনীয়: 0.81639003753662 সংজ্ঞায়িত নয়: 0.17906713485718 সংজ্ঞায়িত 0.63732290267944 মাইক্রোসেকেন্ড দ্রুত হয়।
ট্র্যাভিস ওয়েস্টন

আপনি যে কোনও ধরণের অতিরিক্ত চেক যেমন রিয়েলপথ ব্যবহার করছেন না তাই সংজ্ঞায়নের ক্ষেত্রে কেসটি আরও দ্রুত হবে। এটি দুটি জিনিসের তুলনা করে না যা সত্যই একই।
jgmjgm

150

এই থ্রেডটি আমাকে ক্রিঞ্জ করে তোলে, কারণ ইতিমধ্যে একটি "সমাধান পোস্ট করা হয়েছে" এবং এটি সমস্ত উদ্দেশ্য এবং উদ্দেশ্যে, ভুল। আসুন গণনা করা যাক:

  1. সংজ্ঞাগুলি পিএইচপি-তে সত্যই ব্যয়বহুল। আপনি এটি সন্ধান করতে পারেন বা এটি নিজেই পরীক্ষা করতে পারেন তবে পিএইচপি-তে কোনও বিশ্বব্যাপী ধ্রুবক সংজ্ঞায়নের একমাত্র কার্যকর উপায় হ'ল একটি এক্সটেনশন। (ক্লাস ধ্রুবকগুলি প্রকৃতপক্ষে বেশ সজ্জিত পারফরম্যান্স অনুযায়ী, তবে এটি 2 এর কারণে একটি মোট পয়েন্ট)

  2. আপনি যদি require_once()যথাযথভাবে ব্যবহার করছেন , অর্থাত ক্লাস অন্তর্ভুক্তির জন্য, আপনার এমনকি একটি সংজ্ঞায়নেরও প্রয়োজন নেই; শুধু পরীক্ষা করে দেখুন class_exists('Classname')। আপনি যে ফাইলটি অন্তর্ভুক্ত করছেন সেটিতে কোড রয়েছে, অর্থাৎ আপনি এটি পদ্ধতিগত ফ্যাশনে ব্যবহার করছেন, require_once()আপনার পক্ষে প্রয়োজনীয় হওয়ার কোনও কারণ নেই ; প্রতিবার আপনি যে ফাইলটি সাব্রুটাইন কল করছেন বলে মনে করছেন তা অন্তর্ভুক্ত করুন।

কিছুক্ষণের জন্য, অনেক লোক class_exists()তাদের অন্তর্ভুক্তির জন্য পদ্ধতিটি ব্যবহার করেছিলেন । আমি এটি পছন্দ করি না কারণ এটি পলাতক, তবে তাদের পিছু require_once()পিএইচপি-র সাম্প্রতিক সংস্করণগুলির আগে বেশ অদক্ষ ছিল। তবে এটি স্থির করা হয়েছে, এবং এটি আমার যুক্তি যে শর্তসাপেক্ষে আপনাকে অতিরিক্ত বাইকোড এবং অতিরিক্ত পদ্ধতি কলটির জন্য কোনও অভ্যন্তরীণ হ্যাশটেবল চেককে ছাড়িয়ে যেতে হবে comp

এখন, একটি ভর্তি: এই স্টাফটির জন্য পরীক্ষা করা শক্ত, কারণ এটি কার্যকর করার জন্য খুব অল্প সময়ের জন্য দায়ী।

এখানে আপনার যে প্রশ্নটি ভাবা উচিত তা এখানে রয়েছে: পিএইচপি-তে একটি সাধারণ নিয়ম হিসাবে, ব্যয়বহুল, কারণ প্রতিবার অনুবাদক একটিটিকে আঘাত করলে এটি পার্স মোডে ফিরে যেতে হবে, অপকডগুলি তৈরি করতে হবে এবং তারপরে পিছনে ঝাঁপিয়ে পড়বে jump আপনার যদি একটি 100+ অন্তর্ভুক্ত থাকে তবে এটি অবশ্যই কার্য সম্পাদনের প্রভাব ফেলবে। প্রয়োজনীয়_অনস ব্যবহার বা ব্যবহার না করা কেন এমন গুরুত্বপূর্ণ প্রশ্ন কারণ এটি ওপকোড ক্যাশের জন্য জীবনকে কঠিন করে তোলে। এর একটি ব্যাখ্যা এখানে পাওয়া যাবে, তবে এটি কী উত্সাহ দেয় তা হ'ল:

  • পার্স সময় চলাকালীন, আপনি অনুরোধের পুরো জীবনের জন্য আপনার প্রয়োজনীয় ফাইলগুলির অন্তর্ভুক্ত ঠিক কী জানেন, require()খুব প্রথম দিকে ও অপকোড ক্যাশে আপনার জন্য সমস্ত কিছু পরিচালনা করবে।

  • আপনি যদি একটি অপকোড ক্যাশে না চালাচ্ছেন তবে আপনি একটি শক্ত জায়গায় রয়েছেন। আপনার সমস্তগুলি অন্তর্ভুক্ত করে একটি ফাইলে অন্তর্ভুক্ত করা (কেবলমাত্র উত্পাদনের ক্ষেত্রে বিকাশের সময় এটি করবেন না) সময় পার্স করতে অবশ্যই সহায়তা করতে পারে তবে এটি করার একটি ব্যথা এবং এছাড়াও, আপনাকে অবশ্যই ঠিক কীটি অন্তর্ভুক্ত করবেন তা জানতে হবে অনুরোধ।

  • অটোল্যাডটি খুব সুবিধাজনক, তবে ধীর কারণেই অটোল্যাড যুক্তিটি প্রতিবার অন্তর্ভুক্ত করার সময় চালানো উচিত। অনুশীলনে, আমি খুঁজে পেয়েছি যে একটি অনুরোধের জন্য বেশ কয়েকটি বিশেষায়িত ফাইল অটলয়েড করা খুব বেশি সমস্যার কারণ হয় না, তবে আপনার প্রয়োজনীয় সমস্ত ফাইল স্বয়ংক্রিয়ভাবে চালিত করা উচিত নয়।

  • আপনার যদি সম্ভবত 10 টি অন্তর্ভুক্ত থাকে ( এটি খামের গণনার একদম পিছনে), এই সমস্ত হুড়োহুড়ি মূল্যহীন নয়: কেবল আপনার ডাটাবেস অনুসন্ধান বা অন্য কিছুকে অনুকূলিত করুন।


14
এই 4 বছর বয়সী এবং অধিকাংশ অংশ জন্য আর প্রযোজ্য define(), require_once()এবং defined()মাইক্রোসেকেন্ড আমার মেশিনে প্রতিটি সব 1-2 সময় নেয়।
ড্যানিয়েল বিয়ার্ডসলে

72
তবে এটি 2 মাইক্রোসেকেন্ডের তাড়াতাড়ি ব্যবহারকারীর পৃষ্ঠাটি থাকবে। পৃষ্ঠা দর্শনগুলির এক বছরেরও বেশি সময় ধরে, এটি ব্যবহারকারীর পুরো 3 সেকেন্ডকে বাঁচাতে পারে! তারা সেই সময়ে ব্যবসায়ের এক দশমাংশ দেখতে পেত! ব্যবহারকারীর কথা চিন্তা করুন। মাইক্রোসেকেন্ডগুলি অপচয় করবেন না।
অ্যান্ড্রু এনসলে 18

15
সকলেই কটূক্তি সম্পর্কে সচেতন, একটি মাইক্রোসেকেন্ড সেকেন্ডের 1/1000000।
অ্যান্ডি চেজ

1
@ অ্যান্ড্রুএনস্লি আপনি কেবল নিজের সমস্ত বিদ্রূপ নিয়ে ভুল করেছেন। আপনি পিএইচপি মাইক্রোপ্রসেসরের উপরও চলে সে সম্পর্কে অজ্ঞ, আপনার পিসিতে 1 টি মাইক্রোসেকেন্ড একটি মাইক্রোপ্রসেসরের বেশ কয়েকটি মিলিসেকেন্ড। এখন ২০ টির মধ্যে একটি বড় প্রকল্প, ফাইল অন্তর্ভুক্ত কী হবে? এটি 20 বার কয়েক মিলিসেকেন্ড বিলম্বিত হয়েছে, সুতরাং আমরা ইতিমধ্যে একটি পয়েন্ট পৌঁছে যা একটি মানুষের কাছে লক্ষণীয়। যদি সেই স্ক্রিপ্টটি প্রায়শই বলা হয় তবে এটি সিস্টেমে পারফরম্যান্স সংক্রান্ত সমস্যার কারণ হতে পারে। অপ্টিমাইজেশন কোনও রসিকতা নয় এবং পুরো বিশ্ব আপনার পিসি ঘুরিয়ে দিচ্ছে না। সেখানে দশ হাজার সিপিইউ ব্যবহার হচ্ছে।
জন

2
@John। এটি ছিল ভাল আত্মার তৈরি একটি রসিকতা। কোন দূষিত উদ্দেশ্য। যদি আপনার অন্তর্ভুক্তগুলি অনুকূল করে তুলতে আপনার পক্ষে মূল্য হয় তবে ঠিক এগিয়ে যান।
অ্যান্ড্রু এনসলে

66

আমি কৌতূহলী হয়ে উঠলাম এবং অ্যাডাম ব্যাকস্ট্রমের টেক ইওর ইউনিভার্সের লিঙ্কটি পরীক্ষা করে দেখলাম । এই নিবন্ধটি প্রয়োজনীয়তাগুলির পরিবর্তে প্রয়োজনীয় ব্যবহারগুলির একটি কারণ বর্ণনা করে। যাইহোক, তাদের দাবিগুলি আমার বিশ্লেষণ ধরে রাখেনি। আমি কোথায় সমাধানটি অপ্রত্যাশিত করেছি তা দেখার আগ্রহী। আমি তুলনা করার জন্য পিএইচপি 5.2.0 ব্যবহার করেছি।

আমি 100 টি শিরোনাম ফাইল তৈরি করে শুরু করেছি যা অন্য শিরোলেখের ফাইল অন্তর্ভুক্ত করতে প্রয়োজনীয়_অনস ব্যবহার করে। এই ফাইলগুলির প্রতিটি দেখতে কিছুটা এমন দেখাচ্ছে:

<?php
    // /home/fbarnes/phpperf/hdr0.php
    require_once "../phpperf/common_hdr.php";

?>

আমি একটি দ্রুত বাশ হ্যাক ব্যবহার করে এটি তৈরি করেছি:

for i in /home/fbarnes/phpperf/hdr{00..99}.php; do
    echo "<?php
    // $i" > $i
    cat helper.php >> $i;
done

এইভাবে আমি প্রয়োজনীয়_অনসেস ব্যবহার করতে এবং শিরোলেখ ফাইলগুলি অন্তর্ভুক্ত করার সময় সহজেই পরিবর্তন করতে পারি। আমি তখন একশ ফাইল লোড করার জন্য একটি app.php তৈরি করেছি। এর মতো দেখতে:

<?php
    // Load all of the php hdrs that were created previously
    for($i=0; $i < 100; $i++)
    {
        require_once "/home/fbarnes/phpperf/hdr$i.php";
    }

    // Read the /proc file system to get some simple stats
    $pid = getmypid();
    $fp = fopen("/proc/$pid/stat", "r");
    $line = fread($fp, 2048);
    $array = split(" ", $line);

    // Write out the statistics; on RedHat 4.5 with kernel 2.6.9
    // 14 is user jiffies; 15 is system jiffies
    $cntr = 0;
    foreach($array as $elem)
    {
        $cntr++;
        echo "stat[$cntr]: $elem\n";
    }
    fclose($fp);
?>

আমি প্রয়োজনীয়_অ্যান্স শিরোলেখগুলির সাথে প্রয়োজনীয় শিরোনামগুলির বিপরীত হয়েছি যা একটি শিরোনাম ফাইল ব্যবহার করে:

<?php
    // /home/fbarnes/phpperf/h/hdr0.php
    if(!defined('CommonHdr'))
    {
        require "../phpperf/common_hdr.php";
        define('CommonHdr', 1);
    }
?>

প্রয়োজন বনাম প্রয়োজনীয়_একটি দিয়ে এটি চালানোর সময় আমি খুব বেশি পার্থক্য পাইনি। আসলে, আমার প্রাথমিক পরীক্ষাগুলি থেকে বোঝা যাচ্ছে যে প্রয়োজন_ও কিছুটা দ্রুত ছিল, তবে আমি অবশ্যই এটি বিশ্বাস করি না। আমি ১০০০০০ ইনপুট ফাইল দিয়ে পরীক্ষার পুনরাবৃত্তি করেছি। এখানে আমি একটি সামঞ্জস্যপূর্ণ পার্থক্য দেখতে পেলাম। আমি একাধিকবার পরীক্ষাটি চালিয়েছি, ফলাফলগুলি নিকটে রয়েছে তবে প্রয়োজনের জন্য ব্যবহার করে গড়ে 30.8 ব্যবহারকারীর জিফি এবং .6২..6 সিস্টেম জিফি ব্যবহার করা হয়; গড়ে 39.4 ব্যবহারকারীর জিফি এবং 72.0 সিস্টেম জিফিজ ব্যবহার করে অতএব, এটি উপস্থিত_অনসেস ব্যবহার করে বোঝাটি কিছুটা কম হয়েছে বলে মনে হয়। তবে দেয়ালের ঘড়ির সময় কিছুটা বাড়ানো হয়েছে। 10,000 প্রযোজনীয় কলগুলি গড়ে সম্পূর্ণ করতে 10.15 সেকেন্ড ব্যবহার করে এবং 10,000 টির জন্য কল গড়ে গড়ে 9.84 সেকেন্ড ব্যবহার করে।

পরবর্তী পদক্ষেপটি এই পার্থক্যগুলি সন্ধান করা। সিস্টেম কলগুলি যা করা হচ্ছে তা বিশ্লেষণ করতে আমি স্ট্রেস ব্যবহার করেছি ।

প্রয়োজন_অনসেস থেকে কোনও ফাইল খোলার আগে নিম্নলিখিত সিস্টেম কলগুলি করা হয়:

time(NULL)                              = 1223772434
lstat64("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat64("/home/fbarnes", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat64("/home/fbarnes/phpperf", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat64("/home/fbarnes/phpperf/h", {st_mode=S_IFDIR|0755, st_size=270336, ...}) = 0
lstat64("/home/fbarnes/phpperf/h/hdr0.php", {st_mode=S_IFREG|0644, st_size=88, ...}) = 0
time(NULL)                              = 1223772434
open("/home/fbarnes/phpperf/h/hdr0.php", O_RDONLY) = 3

এটি প্রয়োজনের সাথে বিপরীতে:

time(NULL)                              = 1223772905
lstat64("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat64("/home/fbarnes", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat64("/home/fbarnes/phpperf", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat64("/home/fbarnes/phpperf/h", {st_mode=S_IFDIR|0755, st_size=270336, ...}) = 0
lstat64("/home/fbarnes/phpperf/h/hdr0.php", {st_mode=S_IFREG|0644, st_size=146, ...}) = 0
time(NULL)                              = 1223772905
open("/home/fbarnes/phpperf/h/hdr0.php", O_RDONLY) = 3

আপনার ইউনিভার্সের প্রযুক্তিটি বোঝায় যে প্রয়োজনীয়_অনসেস আরও lstat64 কল করা উচিত। তবে, তারা উভয়ই একই সংখ্যায় lstat64 কল করে calls সম্ভবত, পার্থক্যটি হ'ল আমি উপরের কোডটি অপ্টিমাইজ করতে এপিসি চালাচ্ছি না। যাইহোক, পরবর্তী আমি স্ট্রেসের আউটপুটটিকে সম্পূর্ণ রানগুলির সাথে তুলনা করেছি:

[fbarnes@myhost phpperf]$ wc -l strace_1000r.out strace_1000ro.out
  190709 strace_1000r.out
  210707 strace_1000ro.out
  401416 total

প্রয়োজনে-ব্যবহার করার সময় কার্যকরভাবে প্রতি শিরোনাম ফাইলটিতে আরও দুটি সিস্টেম কল রয়েছে are একটি পার্থক্য হ'ল প্রয়োজনীয়_অনসের সময় () ফাংশনে একটি অতিরিক্ত কল রয়েছে:

[fbarnes@myhost phpperf]$ grep -c time strace_1000r.out strace_1000ro.out
strace_1000r.out:20009
strace_1000ro.out:30008

অন্যান্য সিস্টেম কলটি getcwd ():

[fbarnes@myhost phpperf]$ grep -c getcwd strace_1000r.out strace_1000ro.out
strace_1000r.out:5
strace_1000ro.out:10004

এটিকে বলা হয় কারণ আমি এইচডিআরএক্সএক্সএক্সএক্স ফাইলগুলিতে আপেক্ষিক পাথটি রেফারেন্স করার সিদ্ধান্ত নিয়েছিলাম। যদি আমি এটির একটি নিখুঁত রেফারেন্স করি তবে কেবলমাত্র পার্থক্যটি হ'ল কোডে করা অতিরিক্ত সময় (NUL) কল:

[fbarnes@myhost phpperf]$ wc -l strace_1000r.out strace_1000ro.out
  190705 strace_1000r.out
  200705 strace_1000ro.out
  391410 total
[fbarnes@myhost phpperf]$ grep -c time strace_1000r.out strace_1000ro.out
strace_1000r.out:20008
strace_1000ro.out:30008

এর থেকে বোঝা যাচ্ছে যে আপনি আপেক্ষিক পাথের চেয়ে নিখুঁত পাথ ব্যবহার করে সিস্টেম কলের সংখ্যা হ্রাস করতে পারবেন। এর বাইরে কেবলমাত্র পার্থক্য হল সময় (এনএলএল) কলগুলি যা দ্রুততর কি তা তুলনা করার জন্য কোডটি উপকরণের জন্য ব্যবহৃত হয় বলে মনে হয়।

অন্য একটি দ্রষ্টব্য হ'ল এপিসি অপ্টিমাইজেশন প্যাকেজের "apc.incolve_once_override" নামে একটি বিকল্প রয়েছে যা দাবি করে যে এটি প্রয়োজনীয়_অনসেস দ্বারা অন্তর্ভুক্ত হওয়া সিস্টেম কলগুলির সংখ্যা হ্রাস করে এবং অন্তর্ভুক্ত_সেস কলগুলি ( পিএইচপি ডকুমেন্টেশন দেখুন )।


6
এবং এমন একটি "বিয়োগাত্মক পার্থক্য" দেখতে আপনাকে 10,000 বার চালাতে হবে এমন কোনও "অপ্টিমাইজেশন" চিন্তারও উপযুক্ত নয়। একজন প্রোফাইলার ব্যবহার করুন এবং আপনার অ্যাপ্লিকেশনটিতে আসল বাধা কোথায় রয়েছে তা সন্ধান করুন। আমি সন্দেহ এই প্রশ্নটি বাধা।
ডিজিএম

1
এটির অর্থ কী তা এটি মোটেও গুরুত্ব দেয় না। আপনার পক্ষে যুক্তিযুক্তভাবে আরও ভাল যা কাজ করে তা ব্যবহার করুন।
বাটাল বাটকাস

ওয়াট
জিফি

21

আপনি কি এই কোডিং অনুশীলনগুলির কোনও লিঙ্ক দিতে পারেন যা এড়াতে বলে? যতদূর আমি উদ্বিগ্ন, এটি সম্পূর্ণ নন-ইস্যু । আমি নিজে সোর্স কোডটির দিকে নজর দিইনি, তবে আমি কল্পনা করতে পারি যে এর মধ্যে কেবলমাত্র তফাত includeএবং include_onceএটি সেই include_onceফাইলনামটিকে একটি অ্যারে যুক্ত করে এবং প্রতিটি সময় অ্যারে পরীক্ষা করে। এই অ্যারেটি বাছাই করা সহজ হবে, সুতরাং এটির অনুসন্ধান করা ও (লগ এন) হওয়া উচিত, এবং এমনকি একটি মাঝারি লার্জ অ্যাপ্লিকেশনটিতে কেবল কয়েক ডজন অন্তর্ভুক্ত থাকতে পারে।


একটি হ'ল চ্যাজ্জুকা.com / blog /? p=163 তারা সত্যই ' করণীয় ' করতে পারেনি, তবে অনেকগুলি 'ব্যয়বহুল' জিনিসগুলি যুক্ত করে। এবং প্রকৃতপক্ষে, সমস্ত অন্তর্ভুক্ত / প্রয়োজনীয় ফাইলগুলি একটি অভ্যন্তরীণ অ্যারেতে যুক্ত করা হয় (এটি ফিরিয়ে দেওয়ার জন্য একটি ফাংশন রয়েছে), আমি অনুমান করি যে _নসকে সেই অ্যারে লুপ করতে হবে এবং
স্ট্রিম্পের কাজ

7

জিনিসগুলি করার আরও ভাল উপায় হ'ল একটি অবজেক্ট-ভিত্তিক পদ্ধতির ব্যবহার এবং __autoload () ব্যবহার করা ।



আমি এই কিনতে না। অনেকগুলি পরিস্থিতি রয়েছে যেখানে ওও অন্যান্য দৃষ্টান্তগুলির মতো যথাযথভাবে খাপ খায় না, সুতরাং আপনাকে __autoload () এর সাথে যত ছোটখাটো সুবিধা থাকতে পারে তা অর্জন করার জন্য এটি জোর করা উচিত নয়।
ববি জ্যাক

1
আপনি ভাবেন যে অটোল্যাডটি আসলে * _আনসের চেয়ে বেশি সময় নিবে (ধরে নিবেন যে আপনি কেবল যা প্রয়োজন তার প্রয়োজন হয়)।
নিকফ

না এটি নয়, কমপক্ষে অবশ্যই নয়, অটোল্যাডকে এখনও কোনওভাবে অন্তর্ভুক্ত করা দরকার এবং ত্রুটি ব্যর্থ হওয়ার আগে পিএইচপি-র এটি একটি শেষ অবলম্বন - তাই বাস্তবে পিএইচপি আসলে সমস্ত জায়গাগুলির মধ্যে সম্ভাব্য অপ্রয়োজনীয় চেকগুলি সম্পাদন করে যা অন্তর্ভুক্ত / প্রয়োজনীয়তা এবং পরে প্রয়োগ করতে পারে যে এটা autoload কল করবে (যদি থাকে সংজ্ঞায়িত) ... দ্রষ্টব্য: __autoload()নিরুৎসাহিত এবং এটি ভবিষ্যতে উঠিয়ে নেওয়া পারে, আপনি ব্যবহার করা উচিত spl_autoload_register(...)এই দিন ... PS2 আমাকে ভুল বুঝবেন না, আমি ব্যবহারের autoload কার্যকারিতা কখনও কখনও; )
jave.web 21

6

এটি ফাংশনটি খারাপ ব্যবহার করছে না। সামগ্রিক কোড বেসে এটি কীভাবে এবং কখন ব্যবহার করতে হবে তার একটি ভুল বোঝাপড়া। আমি সম্ভবত এই ভুল বোঝাবুঝিতে আরও কিছু প্রসঙ্গ যুক্ত করব:

লোকেরা ভাবেন না যে প্রয়োজনীয়_অনসেস একটি ধীর ফাংশন। আপনাকে আপনার কোডটি একরকম বা অন্য কোনওভাবে অন্তর্ভুক্ত করতে হবে। require_once()বনামের require()গতি ইস্যু নয়। এটি সতর্কতা অবলম্বন করে এমন কার্য সম্পাদন সম্পর্কে যা এটি অন্ধভাবে ব্যবহারের জন্য তৈরি হতে পারে। যদি প্রসঙ্গের জন্য বিবেচনা না করে বিস্তৃতভাবে ব্যবহার করা হয় তবে এটি বিশাল মেমরির বর্জ্য বা অপব্যয় কোডের দিকে নিয়ে যেতে পারে।

আমি যা দেখেছি তা আসলেই খারাপ require_once(), বিশেষত কোনও জটিল অবজেক্ট-ওরিয়েন্টেড (ওও) পরিবেশে যখন সমস্ত একচেটিয়া ফ্রেমওয়ার্কগুলি সমস্ত ভুল উপায়ে ব্যবহার করে।

require_once()অনেক লাইব্রেরিতে যেমন দেখা যায় তেমন প্রতিটি ক্লাসের শীর্ষে ব্যবহারের উদাহরণ নিন :

require_once("includes/usergroups.php");
require_once("includes/permissions.php");
require_once("includes/revisions.php");
class User{
  // User functions
}

সুতরাং Userক্লাসটি অন্য তিনটি ক্লাস ব্যবহার করার জন্য ডিজাইন করা হয়েছে। যথেষ্ট ফর্সা!

তবে এখন যদি কোনও দর্শক সাইট ব্রাউজ করছে এবং লগইন না করে এবং ফ্রেমওয়ার্ক লোড করে: require_once("includes/user.php");প্রতিটি একক অনুরোধের জন্য।

এটি 1 + 3 অপ্রয়োজনীয় ক্লাস সহ এটি নির্দিষ্ট অনুরোধের সময় কখনও ব্যবহার করবে না। 5 এমবি বা তার চেয়ে কম বিপরীতে অনুরোধ অনুসারে 40 এমবি ব্যবহার করে ফোলে ফ্রেমওয়ার্কগুলি শেষ হয়।


অন্যান্য উপায়ে এটির অপব্যবহার করা যেতে পারে, যখন অন্য শ্রেণির দ্বারা কোনও শ্রেণি পুনরায় ব্যবহার করা হয়! বলুন আপনার প্রায় 50 টি ক্লাস রয়েছে যা helperফাংশন ব্যবহার করে। এই helpersক্লাসগুলি লোড হওয়ার পরে তাদের উপলব্ধ রয়েছে তা নিশ্চিত করার জন্য , আপনি পাবেন:

require_once("includes/helpers.php");
class MyClass{
  // Helper::functions(); // etc..
}

এখানে প্রতি সেয়ে কোনও ভুল নেই। তবে যদি একটি পৃষ্ঠার অনুরোধটি 15 টি একই শ্রেণীর অন্তর্ভুক্ত হয়। আপনি require_once15 বার চালাচ্ছেন , বা একটি দুর্দান্ত চাক্ষুষের জন্য:

require_once("includes/helpers.php");
require_once("includes/helpers.php");
require_once("includes/helpers.php");
require_once("includes/helpers.php");
require_once("includes/helpers.php");
require_once("includes/helpers.php");
require_once("includes/helpers.php");
require_once("includes/helpers.php");
require_once("includes/helpers.php");
require_once("includes/helpers.php");
require_once("includes/helpers.php");
require_once("includes/helpers.php");
require_once("includes/helpers.php");
require_once("includes/helpers.php");
require_once("includes/helpers.php");

প্রয়োজনীয়_অনস () এর ব্যবহার প্রযুক্তিগতভাবে সেই ফাংশনটি চালানোর জন্য 14 বার কার্য সম্পাদনকে প্রভাবিত করে, এই অপ্রয়োজনীয় লাইনগুলি বিশ্লেষণ করার শীর্ষে। একই ধরণের সমস্যা সহ মাত্র 10 টি ব্যবহৃত অতি উচ্চ শ্রেণীর সাথে এটি এর চেয়ে বরং অর্থহীন পুনরাবৃত্তি কোডের 100+ লাইনগুলির জন্য অ্যাকাউন্ট হতে পারে।

এটির পরিবর্তে এটি সম্ভবত require("includes/helpers.php");আপনার অ্যাপ্লিকেশন বা ফ্রেমওয়ার্কের বুটস্ট্র্যাপে ব্যবহার করার উপযুক্ত। তবে যেহেতু সবকিছু আপেক্ষিক, শ্রেণীর ওজন বনাম ব্যবহারের ফ্রিকোয়েন্সি 15-100 লাইন সংরক্ষণের উপযুক্ত কিনা তা সবই নির্ভর করে । তবে যদি কোনও প্রদত্ত অনুরোধে ফাইলটি ব্যবহার না করার সম্ভাবনা কোনও না হয়, তবে অবশ্যই তার পরিবর্তে আপনার প্রধান শ্রেণিতে থাকা উচিত। রয়ে প্রতিটি ক্লাসে আলাদাভাবে সম্পদ নষ্ট হয়ে যায়।helpersrequire_once()helpersrequirerequire_once


require_onceফাংশন দরকারী যখন প্রয়োজন হয়, কিন্তু হিসাবে একটি একশিলা সমাধান সব শ্রেণীর লোড জন্য সর্বত্র ব্যবহার করার জন্য এটি গণ্য করা যাবে না।


5

পিয়ার 2 উইকি (যখন এটি বিদ্যমান ছিল) কমপক্ষে লাইব্রেরি কোডের জন্য অটোল্যাড আইংয়ের পক্ষে সমস্ত প্রয়োজনীয় প্রয়োজন / নির্দেশাবলী অন্তর্ভুক্ত করার জন্য ভাল কারণগুলি তালিকাভুক্ত করত । যখন ফারের মতো বিকল্প প্যাকেজিং মডেলগুলি দিগন্তে থাকে তখন এগুলি আপনাকে কঠোর ডিরেক্টরি কাঠামোর সাথে সংযুক্ত করে।

আপডেট: উইকির ওয়েব সংরক্ষণাগারিত সংস্করণটি চিত্তাকর্ষক কুৎসিত হিসাবে, আমি নীচের সবচেয়ে বাধ্যতামূলক কারণগুলি অনুলিপি করেছি:

  • (পিয়ার) প্যাকেজটি ব্যবহার করার জন্য অন্তর্ভুক্ত_পথ প্রয়োজন। এটি তার নিজের অন্তর্ভুক্ত_পথের সাথে অন্য অ্যাপ্লিকেশনটির মধ্যে একটি পিয়ার প্যাকেজ বান্ডেল করা, প্রয়োজনীয় উত্সযুক্ত একটি একক ফাইল তৈরি করা, বিস্তৃত উত্স কোড পরিবর্তন ছাড়াই একটি পিয়ার প্যাকেজকে একটি ফার সংরক্ষণাগারে স্থানান্তরিত করতে অসুবিধা সৃষ্টি করে।
  • যখন শীর্ষ-স্তরের প্রয়োজনীয়তা_সটি শর্তসাপেক্ষে প্রয়োজনীয়_অনসেসের সাথে মিশ্রিত হয়, এর ফলস্বরূপ এপিসির মতো ওপকোড ক্যাশে যে কোডটি অপ্রচলযোগ্য হয় তার কোড হতে পারে, যা পিএইচপি 6 এর সাথে বান্ডেল হবে।
  • আপেক্ষিক প্রয়োজন_অনসের প্রয়োজন যে অন্তর্ভুক্ত_পথটি ইতিমধ্যে সঠিক মান হিসাবে সেট আপ করা উচিত, যথাযথ অন্তর্ভুক্ত_পথ ব্যতীত প্যাকেজ ব্যবহার করা অসম্ভব হয়ে পড়েছে

5

*_once()ফাংশন সূচনা প্রত্যেক পেরেন্ট ডাইরেক্টরি নিশ্চিত করার আপনি সহ করছি ফাইলটিতে একটি ইতোমধ্যেই অন্তর্ভুক্ত করা হয়েছে হিসাবে একই নয়। এটা মন্দার কারণ অংশ।

আমি সিঞ্চের মতো একটি সরঞ্জাম বেঞ্চমার্কিংয়ের জন্য ব্যবহার করার পরামর্শ দিচ্ছি । আপনি সমস্ত প্রস্তাবিত পদ্ধতি চেষ্টা করতে পারেন এবং প্রতিক্রিয়ার সময়ের তুলনা করতে পারেন।

আরো উপর require_once()টেক তোমার ইউনিভার্স


নিবন্ধের পয়েন্টারটির জন্য ধন্যবাদ। ডাবল-অন্তর্ভুক্ত ফাইলগুলির তুলনায় প্রয়োজনীয়_অনস () একটি ভাল সুরক্ষা বেল্ট এবং আমরা এটি ব্যবহার চালিয়ে যাব, তবে এটি পরিষ্কার করে রাখতে সক্ষম হওয়া দুর্দান্ত is
অ্যান্ডি লেস্টার

2

এমনকি যদি require_onceএবং include_once এর চেয়ে ধীরে ধীরে requireএবং include(অথবা যে কোনও বিকল্পের উপস্থিতি থাকতে পারে), আমরা এখানে মাইক্রো-অপ্টিমাইজেশনের ক্ষুদ্রতম স্তরের কথা বলছি। আপনার সময়টি এমন কিছু সম্পর্কে উদ্বিগ্ন হওয়ার চেয়ে খারাপভাবে লিখিত লুপ বা ডাটাবেস কোয়েরিটি অনুকূল করে তুলতে অনেক বেশি ভাল সময় ব্যয় করে require_once

এখন, কেউ একটি যুক্তি তৈরি করতে পারে যা require_onceদোষী কোডিং অনুশীলনের অনুমতি দেয় কারণ আপনার অন্তর্ভুক্তটিকে পরিষ্কার এবং সুসংহত রাখার জন্য আপনার মনোযোগ দেওয়ার দরকার নেই, তবে এতে ফাংশনটি নিজেই বিশেষত এর গতির সাথে কিছুই করার নেই ।

স্পষ্টতই, কোড সাফাই এবং রক্ষণাবেক্ষণের স্বাচ্ছন্দ্যের স্বার্থে অটলয়েডিং ভাল but তবে আমি এটি স্পষ্ট করে বলতে চাই যে এর গতির সাথে কোনও সম্পর্ক নেই ।


0

অলির বিকল্প এবং __autoload () অন্তর্ভুক্ত ব্যবহার করে আপনি পরীক্ষা করেন; এবং এটি এপিসি ইনস্টল করার মতো কিছু দিয়ে পরীক্ষা করুন ।

আমি সন্দেহ করি ধ্রুবক ব্যবহার করা জিনিসগুলিকে গতিময় করে তুলবে।


0

হ্যাঁ, এটি প্লেইন ওলের চেয়ে কিছুটা বেশি ব্যয়বহুল require আমার মতে এই কথাটি হ'ল আপনি যদি নিজের কোডটিকে নকল না করার জন্য যথেষ্ট পরিমাণে সংগঠিত রাখতে পারেন তবে * _once () ফাংশন ব্যবহার করবেন না, কারণ এটি আপনাকে কিছু চক্র সাশ্রয় করবে।

তবে _once () ফাংশনগুলি ব্যবহার করা আপনার অ্যাপ্লিকেশনটিকে মেরে ফেলবে না। মূলত, কেবল আপনার অন্তর্ভুক্তগুলি সংগঠিত না করার অজুহাত হিসাবে এটি ব্যবহার করবেন না । কিছু ক্ষেত্রে, এটি ব্যবহার করা এখনও অনিবার্য এবং এটি কোনও বড় বিষয় নয়।


-2

আমি মনে করি পিয়ার ডকুমেন্টেশনে, একটি প্রয়োজনীয়তা, প্রয়োজনীয়_অনসিস, অন্তর্ভুক্ত এবং অন্তর্ভুক্ত_র জন্য একটি প্রস্তাবনা রয়েছে। আমি সেই নির্দেশিকাটি অনুসরণ করি। আপনার আবেদন আরও স্পষ্ট হবে।


কিছু রেফারেন্স ক্রমযুক্ত হবে।
পিটার মর্টেনসেন

-3

গতির সাথে এর কোনও যোগসূত্র নেই। এটি নিখুঁতভাবে ব্যর্থ সম্পর্কে।

যদি প্রয়োজনীয়_অনস () ব্যর্থ হয় তবে আপনার স্ক্রিপ্টটি সম্পন্ন হবে। অন্য কিছুই প্রক্রিয়া করা হয় না। যদি আপনি অন্তর্ভুক্ত_অনস () ব্যবহার করেন তবে আপনার স্ক্রিপ্টের বাকী অংশ রেন্ডার করার চেষ্টা করবে, সুতরাং আপনার ব্যবহারকারীরা সম্ভবত আপনার স্ক্রিপ্টে ব্যর্থ হয়েছে এমন কোনও কিছুর জন্য জ্ঞানী হতে পারবেন না।


1
অগত্যা। ব্যবহারকারীকে একটি দুর্দান্ত ত্রুটি পৃষ্ঠা দেওয়ার জন্য আপনি আসলে একটি ত্রুটি হ্যান্ডলার বা শাটডাউন হ্যান্ডলারটিতে ঝুঁকতে পারেন (যদিও লোকেরা খুব কমই করেন)। বিকাশকারী হিসাবে, আমি তত্ক্ষণাত্ তত্ক্ষণাত্ ত্রুটিযুক্ত হতে চাই।
এডওয়ার্ড জেড ইয়াং

1
অথবা, ক্ষেত্রমত, না সঠিকভাবে প্রয়োজন হয় না যদি কিছু অত্যাবশ্যক ফাইল (); 'd, এটি একটি ভাল ধারণা হাল ছেড়ে দেবেন এবং স্থগিত - অত্যন্ত শৃঙ্খলার ব্যর্থ। তবে এর মধ্যে বনাম অন্তর্ভুক্ত হওয়া দরকার, যেখানে আমি মনে করি যে প্রশ্নটি বনাম প্রয়োজনীয়_অনসেসের উপর বেশি কেন্দ্রীভূত।
হোবোবেন

-4

আমার ব্যক্তিগত মতামতটি হ'ল প্রয়োজনীয়_অনসের ব্যবহার (বা অন্তর্ভুক্ত_অেন্স) খারাপ অভ্যাস কারণ কারণ আপনি যদি ইতিমধ্যে সেই ফাইলটি অন্তর্ভুক্ত করেন এবং মারাত্মক ত্রুটির ফলে ডাবল অন্তর্ভুক্ত ফাইলগুলির ত্রুটিগুলি দমন করে থাকেন (যেমন ফাংশন / শ্রেণি / ইত্যাদির সদৃশ ঘোষণা)) ।

আপনার যদি কোনও ফাইল অন্তর্ভুক্ত করার দরকার হয় তবে আপনার জানা উচিত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.