পিএইচপি-তে স্ক্রিপ্ট প্রয়োগের সময় ট্র্যাক করা


289

পিএইচপি অবশ্যই সর্বোচ্চ_পরিবর্তন_কাল সীমা প্রয়োগের জন্য নির্দিষ্ট স্ক্রিপ্টের কতটা সিপিইউ সময় ব্যবহার করেছে তা ট্র্যাক করবে।

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

আমি একটি লিনাক্স বাক্স ব্যবহার করছি।

উত্তর:


237

Unixoid সিস্টেমে (এবং পাশাপাশি Windows এ পিএইচপি 7+), তবে আপনি ব্যবহার করতে পারেন getrusage মত:

// Script start
$rustart = getrusage();

// Code ...

// Script end
function rutime($ru, $rus, $index) {
    return ($ru["ru_$index.tv_sec"]*1000 + intval($ru["ru_$index.tv_usec"]/1000))
     -  ($rus["ru_$index.tv_sec"]*1000 + intval($rus["ru_$index.tv_usec"]/1000));
}

$ru = getrusage();
echo "This process used " . rutime($ru, $rustart, "utime") .
    " ms for its computations\n";
echo "It spent " . rutime($ru, $rustart, "stime") .
    " ms in system calls\n";

মনে রাখবেন যে আপনি যদি প্রতিটি পরীক্ষার জন্য পিএইচপি ইনস্ট্যান্স করে থাকেন তবে আপনাকে কোনও পার্থক্য গণনা করার দরকার নেই।


স্ক্রিপ্টের শুরুতে মানটি কি শেষে থেকে বিয়োগ করা উচিত? আমি না দিলে কিছু সত্যই অদ্ভুত নম্বর পাচ্ছি। উত্পন্ন করতে ০.০৫ সেকেন্ড সময় লেগেছিল এমন একটি পৃষ্ঠার মতো বলছেন যে এটি সিপিইউয়ের s সেকেন্ড সময় নিয়েছে ... এটি কি সঠিক? এখানে দেখুন: blog.rompe.org/node/85
ড্যারিল হেইন

@ ড্যারিল হেইন: ওহ, এবং আপনি অদ্ভুত ফলাফল পেয়েছেন কারণ আপনি সংযোজনের পরিবর্তে স্ট্রিং
কনটেন্টেশন

@ ফিহাগ আমাকে আরও অদ্ভুত সময় দেয়, যে একটি পৃষ্ঠা গতিতে 40 সেকেন্ড সময় নিয়েছিল তবে 2 সেকেন্ডে লোড হয়েছিল। সংখ্যাটি 1.4 সেকেন্ড এবং 40 সেকেন্ডের মধ্যে লাফিয়ে যায়
টিমো হুভিনেন

1
@ টিমোহুভিনেন utime/ stime/ প্রাচীরের ঘড়ির সময় আপনি সঠিকভাবে কী পেতে পারেন ? এবং আপনি কি পুনরুত্পাদনযোগ্য উদাহরণের একটি লিঙ্ক পোস্ট করতে পারেন যা এই আচরণটি দেখায়? আপনি কোন ওএস / পিএইচপি সংস্করণ / ওয়েবসার্ভার সংস্করণে আছেন? যাই হোক না কেন, আপনি একটি নতুন প্রশ্ন পোস্ট করতে এবং এটিতে এখানে লিঙ্ক করতে চাইতে পারেন।
ফিহাগ

4
কেবল একটি ছোট আপডেট যুক্ত করুন: এই ফাংশনটি এখন উইন্ডোজেও সমর্থিত।
ankush981

521

আপনার যদি প্রয়োজন কেবল প্রাচীর-ঘড়ির সময়, সিপিইউ এক্সিকিউশন সময়ের চেয়ে, তবে গণনা করা সহজ:

//place this before any script you want to calculate time
$time_start = microtime(true); 

//sample script
for($i=0; $i<1000; $i++){
 //do anything
}

$time_end = microtime(true);

//dividing with 60 will give the execution time in minutes otherwise seconds
$execution_time = ($time_end - $time_start)/60;

//execution time of the script
echo '<b>Total Execution Time:</b> '.$execution_time.' Mins';
// if you get weird results, use number_format((float) $execution_time, 10) 

মনে রাখবেন যে এই সময়ে পিএইচপি বাহ্যিক সংস্থান যেমন ডিস্ক বা ডাটাবেসগুলির জন্য অপেক্ষা করে বসে থাকবে, যা সর্বোচ্চ_অ্যাকশন_টাইমের জন্য ব্যবহৃত হয় না।


38
হাই - এটি 'প্রাচীরের ঘড়ির সময়' ট্র্যাক করে - সিপিইউয়ের সময় নয়।
twk

18
নিখুঁত, আমি একটি প্রাচীরের ঘড়ির সময় ট্র্যাকিং সমাধানের সন্ধান করছিলাম।
সামিল

118

তালাল 7860 এর উত্তরের সংক্ষিপ্ত সংস্করণ

<?php
// At start of script
$time_start = microtime(true); 

// Anywhere else in the script
echo 'Total execution time in seconds: ' . (microtime(true) - $time_start);

উল্লিখিত হিসাবে, এটি 'সিপিইউ সময় নয়' প্রাচীরের সময়


74

সহজতম পথ:

<?php

$time1 = microtime(true);

//script code
//...

$time2 = microtime(true);
echo 'script execution time: ' . ($time2 - $time1); //value in seconds

9
এটি তালাল 7860 এর উত্তর থেকে কীভাবে আলাদা ...?
benomatis

@ ওয়েবেনো সে ভাগ করে নিবে না 60.. আসলেই কোনও পার্থক্য নেই
আরপুন

[কীভাবে 2] কীভাবে এই উত্তরের কোনও ডাউনওয়োটস নেই? এটা উপরের উত্তর মত।
টুডো

36
<?php
// Randomize sleeping time
usleep(mt_rand(100, 10000));

// As of PHP 5.4.0, REQUEST_TIME_FLOAT is available in the $_SERVER superglobal array.
// It contains the timestamp of the start of the request with microsecond precision.
$time = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"];

echo "Did nothing in $time seconds\n";
?>

আমি সেকেন্ডে ফলাফল পেলাম না

আপনার পিএইচপি 5.4.0 ব্যবহার করা উচিত
জোয়াল

29

আমি ফিগগ উত্তরের বাইরে একটি এক্সিকিউশনটাইম ক্লাস তৈরি করেছি যা আপনি বক্সের বাইরে ব্যবহার করতে পারেন:

class ExecutionTime
{
     private $startTime;
     private $endTime;

     public function start(){
         $this->startTime = getrusage();
     }

     public function end(){
         $this->endTime = getrusage();
     }

     private function runTime($ru, $rus, $index) {
         return ($ru["ru_$index.tv_sec"]*1000 + intval($ru["ru_$index.tv_usec"]/1000))
     -  ($rus["ru_$index.tv_sec"]*1000 + intval($rus["ru_$index.tv_usec"]/1000));
     }    

     public function __toString(){
         return "This process used " . $this->runTime($this->endTime, $this->startTime, "utime") .
        " ms for its computations\nIt spent " . $this->runTime($this->endTime, $this->startTime, "stime") .
        " ms in system calls\n";
     }
 }

ব্যবহার:

$executionTime = new ExecutionTime();
$executionTime->start();
// code
$executionTime->end();
echo $executionTime;

দ্রষ্টব্য: পিএইচপি 5-এ, গ্রোরাসেজ ফাংশনটি কেবল ইউনিক্স-ওইড সিস্টেমে কাজ করে। পিএইচপি 7 এর পরে এটি উইন্ডোজেও কাজ করে।


2
দ্রষ্টব্য: উইন্ডোজ getrusageশুধুমাত্র পিএইচপি 7 এর পরে কাজ করে
মার্টিন ভ্যান ড্রিল

@ মার্টিনভানড্রিয়েল আমি নোটটি সংযুক্ত করেছি। ধন্যবাদ
হামিদ তাভাকোলি

3
আমার ধারণা আপনি যদি কন্সট্রাক্টর শুরু করেন এবং টাস্ট্রিংয়ের শেষে, প্রতিটি ব্যবহারের জন্য কোডের 2 টি কম লাইনের প্রয়োজন হবে। OOP এর জন্য +1
টডডমো

13

ডেভেলপফ্রিউশন.কম এ গ্রিংড এই উত্তম উত্তর দেয়:

<!-- put this at the top of the page --> 
<?php 
   $mtime = microtime(); 
   $mtime = explode(" ",$mtime); 
   $mtime = $mtime[1] + $mtime[0]; 
   $starttime = $mtime; 
;?> 

<!-- put other code and html in here -->


<!-- put this code at the bottom of the page -->
<?php 
   $mtime = microtime(); 
   $mtime = explode(" ",$mtime); 
   $mtime = $mtime[1] + $mtime[0]; 
   $endtime = $mtime; 
   $totaltime = ($endtime - $starttime); 
   echo "This page was created in ".$totaltime." seconds"; 
;?>

( Http://www.developerfusion.com/code/2058/determine-execution-time-in-php/ ) থেকে


11

আপনি যেমন সেকেন্ডের আউটপুটটি ফর্ম্যাট করেন তা সুন্দর হতে চলেছে:

echo "Process took ". number_format(microtime(true) - $start, 2). " seconds.";

মুদ্রণ করবে

Process took 6.45 seconds.

এটি এর চেয়ে অনেক ভাল

Process took 6.4518549156189 seconds.

9

এটি করার সবচেয়ে সস্তা এবং নিখুঁত উপায় হ'ল microtime()আপনার কোডের যে কোনও জায়গায় আপনি বেঞ্চমার্ক করতে চান এমন জায়গায় কল করা। এটি ডাটাবেস অনুসন্ধানগুলির ঠিক আগে এবং ঠিক পরে করুন এবং আপনার স্ক্রিপ্টের বাকী সময় কার্যকর করার সময় থেকে সেই সময়সীমাগুলি সরানো সহজ।

একটি ইঙ্গিত: আপনার পিএইচপি এক্সিকিউশন সময় খুব কমই আপনার স্ক্রিপ্টের মেয়াদ উত্তীর্ণ করে তোলে। যদি কোনও স্ক্রিপ্ট সময়সাপেক্ষ হয় তবে এটি প্রায় সর্বদা একটি বাহ্যিক উত্সের কল হতে চলেছে।

পিএইচপি মাইক্রোটাইম ডকুমেন্টেশন: http://us.php.net/microtime


8

আমি মনে করি আপনার xdebug তাকানো উচিত। প্রোফাইলিং বিকল্পগুলি আপনাকে অনেকগুলি প্রক্রিয়া সম্পর্কিত আইটেমগুলি জানার দিকে শুরু করে দেয়।

http://www.xdebug.org/


1
কেবলমাত্র নিশ্চিত হয়ে নিন যে আপনি প্রচুর ওয়েবসাইটের সাথে কোনও প্রোডাকশন সার্ভারে xdebug ইনস্টল করেন না। এটি প্রচুর পরিমাণে লগিং তৈরি করে এবং একটি ছোট এসএসডি ড্রাইভকে পরাভূত করতে পারে।
Corgalore

8

কয়েক মিনিট এবং সেকেন্ড প্রদর্শন করতে আপনি ব্যবহার করতে পারেন:

    $startTime = microtime(true);
    $endTime = microtime(true);
    $diff = round($endTime - $startTime);
    $minutes = floor($diff / 60); //only minutes
    $seconds = $diff % 60;//remaining seconds, using modulo operator
    echo "script execution time: minutes:$minutes, seconds:$seconds"; //value in seconds

2

আমি একটি ফাংশন লিখেছি যা কার্যকর করার সময় বাকি সময় পরীক্ষা করে।

সতর্কতা: উইন্ডোজ এবং লিনাক্স প্ল্যাটফর্মে সম্পাদনের সময় গণনা আলাদা different

/**
 * Check if more that `$miliseconds` ms remains
 * to error `PHP Fatal error:  Maximum execution time exceeded`
 * 
 * @param int $miliseconds
 * @return bool
 */
function isRemainingMaxExecutionTimeBiggerThan($miliseconds = 5000) {
    $max_execution_time = ini_get('max_execution_time');
    if ($max_execution_time === 0) {
        // No script time limitation
        return true;
    }
    if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
        // On Windows: The real time is measured.
        $spendMiliseconds = (microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"]) * 1000;
    } else {
        // On Linux: Any time spent on activity that happens outside the execution
        //           of the script such as system calls using system(), stream operations
        //           database queries, etc. is not included.
        //           @see http://php.net/manual/en/function.set-time-limit.php
        $resourceUsages = getrusage();
        $spendMiliseconds = $resourceUsages['ru_utime.tv_sec'] * 1000 + $resourceUsages['ru_utime.tv_usec'] / 1000;
    }
    $remainingMiliseconds = $max_execution_time * 1000 - $spendMiliseconds;
    return ($remainingMiliseconds >= $miliseconds);
}

ব্যবহার:

while (true) {
    // so something

    if (!isRemainingMaxExecutionTimeBiggerThan(5000)) {
        // Time to die.
        // Safely close DB and done the iteration.
    }
}

1

আপনি কেবল আপনার স্ক্রিপ্টের অংশগুলির প্রয়োগের সময় জানতে চাইতে পারেন। সময়ের যন্ত্রাংশ বা সম্পূর্ণ স্ক্রিপ্টের সর্বাধিক নমনীয় উপায় হ'ল 3 সহজ ফাংশন (এখানে প্রদত্ত পদ্ধতিগত কোড তৈরি করা তবে আপনি এটির চারপাশে ক্লাস টাইমার} putting রেখে এবং কয়েকটি টুইট তৈরি করে একটি শ্রেণিতে পরিণত করতে পারেন)। এই কোডটি কাজ করে, কেবল অনুলিপি করুন এবং পেস্ট করুন এবং চালান:

$tstart = 0;
$tend = 0;

function timer_starts()
{
global $tstart;

$tstart=microtime(true); ;

}

function timer_ends()
{
global $tend;

$tend=microtime(true); ;

}

function timer_calc()
{
global $tstart,$tend;

return (round($tend - $tstart,2));
}

timer_starts();
file_get_contents('http://google.com');
timer_ends();
print('It took '.timer_calc().' seconds to retrieve the google page');

1

$_SERVER['REQUEST_TIME']

এটাও পরীক্ষা করে দেখুন অর্থাত

...
// your codes running
...
echo (time() - $_SERVER['REQUEST_TIME']);

0

বিকল্প হিসাবে আপনি কেবল এই কোডটি আপনার কোড ব্লকে রেখে দিতে পারেন এবং পিএইচপি লগগুলি পরীক্ষা করতে পারেন, সত্যই ধীর গতির জন্য এটি বেশ কার্যকর:

trigger_error("Task done at ". strftime('%H:%m:%S', time()), E_USER_NOTICE); 

গুরুতর ডিবাগিং ব্যবহারের জন্য এক্সডেবাগ + ক্যাশেগ্রিন্ড, https://blog.nexcess.net/2011/01/29/diagnosing-slow-php-execution-with-xdebug-and-kcachegrind/ দেখুন


0

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

   class ExecutionTime
   {
      private $startTime;
      private $endTime;
      private $compTime = 0;
      private $sysTime = 0;

      public function Start(){
         $this->startTime = getrusage();
      }

      public function End(){
         $this->endTime = getrusage();
         $this->compTime += $this->runTime($this->endTime, $this->startTime, "utime");
         $this->systemTime += $this->runTime($this->endTime, $this->startTime, "stime");
      }

      private function runTime($ru, $rus, $index) {
         return ($ru["ru_$index.tv_sec"]*1000 + intval($ru["ru_$index.tv_usec"]/1000))
         -  ($rus["ru_$index.tv_sec"]*1000 + intval($rus["ru_$index.tv_usec"]/1000));
      }

      public function __toString(){
         return "This process used " . $this->compTime . " ms for its computations\n" .
                "It spent " . $this->systemTime . " ms in system calls\n";
      }
   }

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