Как рассчитать время выполнения (директива php 'max_execution_time'?) - PullRequest
1 голос
/ 18 января 2012

Несколько дней назад написал сценарий php, который просматривает всю мою музыку и читает теги id3 для каждой песни и вставляет их в базу данных mysql.Вот фрагмент кода:

exec ( "find /songs -type f -iname '*mp3'", $song_path );
$number_of_songs = count($song_path);
for($i=0; $i<$number_of_songs; $i++){
    //read id3 tags
    //store id3 tags into database
}

Я изменил директиву php max_execution_time в apache2 / php.ini, чтобы лучше понять, что делает эта директива.

Когда я установил max_execution_time = 10, мой скрипт php работает около 45 секунд и успешно считывает теги id3 для 150 песен (из тысяч песен) и вставляет эти теги в базу данных mysql перед тем, как завершить скрипт и вывести на экран следующее:

Неустранимая ошибка: превышено максимальное время выполнения в 10 секунд в /websites/.../public_html/GetID3()/getid3/module.audio.mp3.php в строке 1894

Из документации 'Максимальное время выполнения не зависит от системных вызовов, потоковых операций и т. Д.' http://www.php.net/manual/en/info.configuration.php#ini.max-execution-time

  1. Что можно сделать из разницымежду maximum_execution_time, установленным на 10 секунд, и сценарием, работающим в общей сложности 45 секунд, прежде чем завершить?Означает ли это, что из 45 секунд 35 были потрачены на выполнение действий, не связанных с php, таких как чтение тегов id3, вставка данных в mysql и т. Д., А 10 были потрачены на выполнение действий, связанных с php, таких как итерация цикла?

  2. Можно ли рассчитать время выполнения и распечатать его на экране?

РЕДАКТИРОВАТЬ Используя таймер, предложенный Дагоном,Я вызвал функцию getTime () в конце цикла, было около 100+ итераций цикла.Вот вывод в мой браузер:

0,1163 секунды

0,8142 секунды

1,1379 секунды

1,55555 секунды

...

76,7847 секунд

77.2008 секунд

77.6071 секунд

Неустранимая ошибка: максимальное время выполнения в 10 секунд превышено в /websites/.../public_html/GetID3() /getid3/module.audio.mp3.php в строке 505

Ответы [ 4 ]

3 голосов
/ 18 января 2012
<!-- Paste this at the top of the page -->
<?php
   $mic_time = microtime();
   $mic_time = explode(" ",$mic_time);
   $mic_time = $mic_time[1] + $mic_time[0];
   $start_time = $mic_time;
?>

<!-- Write Your script(executable code) here  -->

enter code here

<!-- Paste  this code at the bottom of the page -->
<?php
   $mic_time = microtime();
   $mic_time = explode(" ",$mic_time);
   $mic_time = $mic_time[1] + $mic_time[0];
   $endtime = $mic_time;
   $total_execution_time = ($endtime - $start_time);
   echo "Total Executaion Time ".$total_execution_time." seconds";
?>
1 голос
/ 18 января 2012

Этот тип сценария действительно должен выполняться в среде CLI, а не в процессе php, выполняемом вашим веб-сервером. Согласно руководству по документации о том, как среда командной строки PHP отличается от других PHP SAPI:

PHP в оболочке обычно используется для более разнообразных диапазон целей, чем типичные веб-скрипты, и как они могут быть очень длительный, максимальное время выполнения не ограничено .

Хотя он не отвечает на ваш вопрос, он решает вашу проблему:)

1 голос
/ 18 января 2012

Похоже, вы не только пытаетесь измерить продолжительность скрипта, но и пытаетесь ограничить его. И в вашем случае max_execution_time не то, что вы хотите.

В основном, "Максимальное время выполнения не зависит от системных вызовов, потоковых операций и т. Д." является правильным. Если вам нужно ограничить длину скрипта в реальном времени, вам нужно реализовать собственное измерение времени. Люди обычно пишут какой-то класс для него, который, в конце концов, поможет оптимизировать сценарий, но простой

$timer['start'] = time();
$timer['max_exec_time'] = 10; // seconds

в начале и

if (time() > $timer['start'] + $timer['max_exec_time'])
    break; // or exit; etc

в конце цикла или в любом другом месте, которое вы хотите, должно быть достаточно.

1 голос
/ 18 января 2012

Я не верю, что скрипт работает в течение более 10 секунд, вам нужно установить соответствующий таймер

<!-- put this at the top of the page -->
<?php
function getTime() {
    $timer = explode( ' ', microtime() );
    $timer = $timer[1] + $timer[0];
    return $timer;
}

$start = getTime();
?> 

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

<!-- put this code at the bottom of the page -->
<?php
$end = getTime();
$time_took=  round($end - $start,4).' seconds';
echo $time_took;
?>
...