Чтобы иметь возможность обновлять переменную по вашему желанию, вы должны поместить ее вне функции. Теперь вы инициализируете новое значение каждый раз, когда добавляете к нему каждый раз, когда вызывается функция.
Например, вы можете сделать это следующим образом:
class Number(changeNum: ChangeNum, number: Int) extends
EventHandler[ActionEvent] {
var changeNumber = changeNum.toString
override def handle(event: ActionEvent): Unit = {
changeNumber.append(number.toString)
}
Кроме того, вы хотите добавить каждый номер в конец. Простой способ сделать это - просто поместить его в строку и использовать функцию добавления.
Это сложная проблема. Если вы запускаете скрипт PHP через командную строку, вы можете установить низкий приоритет планирования процесса (я полагаю, start / low php.exe myscript.php
). Если ваш PHP-скрипт сам выполняет большую часть обработки, потребляющей ваш процессор, это может сработать. Тем не менее, вы сказали, что выполняете тяжелое взаимодействие с базой данных и файловой системой, но это решение не поможет. Похоже, в MySQL есть подсказка «LOW_PRIORITY» для запросов INSERT и UPDATE, которая может вам помочь, но я не пробовал их.
Вы можете установить процессы в Windows как более низкий приоритет. Я не уверен, как этот процесс запускается, но если вы установите процесс с низким приоритетом, все, что захочет, будут получать ресурсы процессора, если вы установите приоритет очень низким.
В UNIX (LAMP) мне удалось решить проблему, проверив загрузку сервера перед продолжением цикла
function get_server_load($windows = 0) {
$os = strtolower(PHP_OS);
if(strpos($os, "win") === false) {
if(file_exists("/proc/loadavg")) {
$load = file_get_contents("/proc/loadavg");
$load = explode(' ', $load);
return $load;
}
elseif(function_exists("shell_exec")) {
$load = explode(' ', `uptime`);
return $load;
}
else {
return "";
}
}
}
for(... ... ...){
$data = get_server_load();
if($data[0] < 0.2){
// continue
}else{
sleep(1);
}
}
Эта функция должна работать также на окнах, но я не могу этого гарантировать. В linux он возвращает массив с загрузкой за последние 1 минуту, 5 минут и 15 минут
Кроме того, рассмотрите возможность запуска ваших сценариев (если CLI) с более низким приоритетом (в Linux используйте «nice»)
Вы также можете использовать другие значения перед продолжением цикла, например, число активных процессов Apache (вы можете проанализировать страницу 127.0.0.1/server_status?auto, если вы включили mod_status в httpd.conf), или также ситуацию MySQL (активные соединения?)
Можете ли вы изменить запись cron для запуска вашего скрипта, используя nice ?
Не очень хорошая идея использовать сервер для обслуживания клиентов и анализа данных.
Поэтому, если вы ищете окончательное решение, сделайте несколько редизайн вашего приложения и перенести анализ данных из внешних интерфейсов и действующей базы данных в другую систему, предназначенную для этой задачи.
Даже если вы сможете успешно управлять анализатором, он израсходует драгоценные ресурсы, в противном случае он будет доступен для обслуживания пользователей.
Это может быть сложное изменение, но оно может стоить того, чтобы преобразовать ваши структуры данных в итераторы. Кроме того, если в вашем коде есть циклические ссылки, предоставьте такой метод, как clearReferences (), который отменяет установку этих объектов. Кстати, эта проблема решена в PHP 5.3.
Итак, если у вас есть:
class Row
{
protected $_table;
public function __construct($table)
{
$this->_table = $table;
}
}
class Table
{
protected $_row;
public function __construct()
{
$this->_row = new Row($this);
}
}
Добавьте метод clearReferences () в класс Row:
class Row
{
public function clearReferences()
{
$this->_table = null;
}
}
Это все, что я могу придумать на данный момент.
У меня есть несколько скриптов, которые я запускаю из cron аналогичным образом, используя nice:
0 * * * * nice -n19 php myscript.php
Это не поможет использованию оперативной памяти (это может сделать только изменение способа написания скрипта), но использует только процессор, который в противном случае был бы бездействующим.
РЕДАКТИРОВАТЬ : не видел, чтобы вопрос касался среды Windows, извините ... оставил это для любых пользователей * nix, имеющих такую же проблему ..
Возможно, что ваш сценарий просто пытается сделать слишком много всего сразу. Будет ли он работать меньше, если он будет запускаться три раза в час?
Другое решение может заключаться в настройке дополнительного сервера только для выполнения такого рода «серверной» обработки. Это было бы особенно эффективно, если бы оно не создавало чрезмерную нагрузку на базу данных, а только на веб-сервер.
Еще один подход к рассмотрению - можно ли разделить работу в другом направлении. У таких сценариев часто есть несколько больших операторов SQL, которые генерируют результаты, используемые для генерации множества маленьких операторов SQL. Если последние могут быть где-то отложены, они могут быть запущены для базы данных в качестве более позднего шага.
Если у вас он (Apache) работает как служба, вы можете изменить приоритет настройки в Win control center / services. Ваше использование ЦП в любом случае резко возрастет, но другие программы будут предпочтительнее по планировщику. Также попробуйте поставить базу данных / сервер на другой жесткий диск, чем ваш Область применения.