Это не первый случай, когда я получаю слишком много сообщений о загрузке процессора с моего хостинга. Код – это всего лишь некоторый случайный php-скрипт с запросами mysql, ничего необычного. (В таблицах нет ничего экстраординарного, максимум несколько сотен строк, и я всегда ограничиваю их, если потребуется.
Я не возражаю, если он работает в течение 0,15 секунды вместо 0,05, так есть ли способ контролировать приоритет процесса или ограничивать загрузку процессора?
Благодаря!
Если это dameon или программа, которая длится долгое время, добавьте sleep()
/ usleep()
. Небольшой сон значительно сократит использование вашего процессора .
Следующий код будет потреблять много процессора
while(...){ //do stuff }
Потому что вы не уступаете место CPU для выполнения других задач здесь. измените его на
while(...){ //do stuff sleep(1); }
Это значительно снизит использование вашего процессора. 1 секунда для CPU – это много времени для выполнения другой задачи .
Чтобы спать лишние 0.1
секунды ( 0.15 - 0.05
), используйте usleep ().
usleep(100000);
В принципе, в системе Unixish (Linux, BSD и т. Д.) Вы можете использовать proc_nice()
для изменения приоритета процесса, например:
proc_nice( 20 ); // now this process has very low priority
Однако здесь есть несколько серьезных препон, которые делают его менее полезным на практике:
proc_nice()
может быть отключен по соображениям безопасности даже в системах, которые могут технически поддерживать его. То, что вы могли бы попытаться сделать, если ваш веб-хост позволяет это, – это запустить фоновый процесс для долговременной задачи, чтобы ваш веб-сервер мог вернуться к обслуживающим запросам во время работы. Вы даже можете использовать команду nice
shell, чтобы снизить приоритет фонового процесса, например:
exec( "nice nohup php -f slow_script.php < /dev/null > output.txt 2>&1 &" );
Как только медленный скрипт закончится, вы можете получить его вывод, загрузив файл output.txt
.
В дополнение к ответу Илмари Каронена:
Если вы хотите увеличить или уменьшить тонкость текущего процесса, используйте renice
вместе с текущим идентификатором процесса:
function custom_proc_nice($priority) { exec("renice +$priority ".getmypid()); }
Если вы хотите не допустить, чтобы приятность сохранялась после выхода PHP-процесса, вам понадобится функция выключения:
function exit_func(){ // Restore priority proc_nice(0); } register_shutdown_function('exit_func');
Ресурсы