Предложения/Приемы для Регулировки Сценария PHP

Чтобы иметь возможность обновлять переменную по вашему желанию, вы должны поместить ее вне функции. Теперь вы инициализируете новое значение каждый раз, когда добавляете к нему каждый раз, когда вызывается функция.

Например, вы можете сделать это следующим образом:

class Number(changeNum: ChangeNum, number: Int) extends 
EventHandler[ActionEvent] {
var changeNumber = changeNum.toString
override def handle(event: ActionEvent): Unit = {
changeNumber.append(number.toString)
}

Кроме того, вы хотите добавить каждый номер в конец. Простой способ сделать это - просто поместить его в строку и использовать функцию добавления.

7
задан Mike B 15 April 2009 в 17:13
поделиться

9 ответов

Это сложная проблема. Если вы запускаете скрипт PHP через командную строку, вы можете установить низкий приоритет планирования процесса (я полагаю, start / low php.exe myscript.php ). Если ваш PHP-скрипт сам выполняет большую часть обработки, потребляющей ваш процессор, это может сработать. Тем не менее, вы сказали, что выполняете тяжелое взаимодействие с базой данных и файловой системой, но это решение не поможет. Похоже, в MySQL есть подсказка «LOW_PRIORITY» для запросов INSERT и UPDATE, которая может вам помочь, но я не пробовал их.

8
ответ дан 6 December 2019 в 08:45
поделиться

Вы можете установить процессы в Windows как более низкий приоритет. Я не уверен, как этот процесс запускается, но если вы установите процесс с низким приоритетом, все, что захочет, будут получать ресурсы процессора, если вы установите приоритет очень низким.

3
ответ дан 6 December 2019 в 08:45
поделиться

В 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 (активные соединения?)

3
ответ дан 6 December 2019 в 08:45
поделиться

Можете ли вы изменить запись cron для запуска вашего скрипта, используя nice ?

2
ответ дан 6 December 2019 в 08:45
поделиться

Не очень хорошая идея использовать сервер для обслуживания клиентов и анализа данных.

Поэтому, если вы ищете окончательное решение, сделайте несколько редизайн вашего приложения и перенести анализ данных из внешних интерфейсов и действующей базы данных в другую систему, предназначенную для этой задачи.

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

2
ответ дан 6 December 2019 в 08:45
поделиться

Это может быть сложное изменение, но оно может стоить того, чтобы преобразовать ваши структуры данных в итераторы. Кроме того, если в вашем коде есть циклические ссылки, предоставьте такой метод, как 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;
    }
}

Это все, что я могу придумать на данный момент.

1
ответ дан 6 December 2019 в 08:45
поделиться

У меня есть несколько скриптов, которые я запускаю из cron аналогичным образом, используя nice:

0 * * * * nice -n19 php myscript.php

Это не поможет использованию оперативной памяти (это может сделать только изменение способа написания скрипта), но использует только процессор, который в противном случае был бы бездействующим.

РЕДАКТИРОВАТЬ : не видел, чтобы вопрос касался среды Windows, извините ... оставил это для любых пользователей * nix, имеющих такую ​​же проблему ..

1
ответ дан 6 December 2019 в 08:45
поделиться

Возможно, что ваш сценарий просто пытается сделать слишком много всего сразу. Будет ли он работать меньше, если он будет запускаться три раза в час?

Другое решение может заключаться в настройке дополнительного сервера только для выполнения такого рода «серверной» обработки. Это было бы особенно эффективно, если бы оно не создавало чрезмерную нагрузку на базу данных, а только на веб-сервер.

Еще один подход к рассмотрению - можно ли разделить работу в другом направлении. У таких сценариев часто есть несколько больших операторов SQL, которые генерируют результаты, используемые для генерации множества маленьких операторов SQL. Если последние могут быть где-то отложены, они могут быть запущены для базы данных в качестве более позднего шага.

1
ответ дан 6 December 2019 в 08:45
поделиться

Если у вас он (Apache) работает как служба, вы можете изменить приоритет настройки в Win control center / services. Ваше использование ЦП в любом случае резко возрастет, но другие программы будут предпочтительнее по планировщику. Также попробуйте поставить базу данных / сервер на другой жесткий диск, чем ваш Область применения.

0
ответ дан 6 December 2019 в 08:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: