Форум программистов, компьютерный форум, киберфорум
Наши страницы

PHP для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
Symba
5 / 5 / 3
Регистрация: 10.03.2011
Сообщений: 83
#1

Обработка большого массива функцией в цикле foreach занимает много времени - PHP

04.09.2012, 15:50. Просмотров 1545. Ответов 6
Метки нет (Все метки)

Здравствуйте! Суть скрипта заключается в том, чтоб пинговать в локалке компы и показывать их OFF или ON статусы. Реализовать идею удалось, но вот беда! обработка скрипта с массивом в 30 строк составляет 5-7 секунд + проц грузит на 16 %. Необходимо обрабатывать массив длиной около 300 строк O_O!Подскажите, как оптимизировать это дело? куда копать?
Система: винда 7-ка х 32, Денвер-3 2012-06-27 (локальный сервер)
код:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
function pingIP($ip, $namecomp)
{
 $trans = array("а"=>"a","б"=>"b","в"=>"v","г"=>"g","д"=>"d","е"=>"e", "ё"=>"yo",
                "ж"=>"j","з"=>"z","и"=>"i","й"=>"i","к"=>"k","л"=>"l", "м"=>"m",
                "н"=>"n","о"=>"o","п"=>"p","р"=>"r","с"=>"s","т"=>"t", "у"=>"y",
                "ф"=>"f","х"=>"h","ц"=>"c","ч"=>"ch", "ш"=>"sh","щ"=>"sh","ы"=>"i",
                "э"=>"e","ю"=>"u","я"=>"ya",
                "А"=>"A","Б"=>"B","В"=>"V","Г"=>"G","Д"=>"D","Е"=>"E", "Ё"=>"Yo",
                "Ж"=>"J","З"=>"Z","И"=>"I","Й"=>"I","К"=>"K", "Л"=>"L","М"=>"M",
                "Н"=>"N","О"=>"O","П"=>"P", "Р"=>"R","С"=>"S","Т"=>"T","У"=>"Y",
                "Ф"=>"F", "Х"=>"H","Ц"=>"C","Ч"=>"Ch","Ш"=>"Sh","Щ"=>"Sh", "Ы"=>"I",
                "Э"=>"E","Ю"=>"U","Я"=>"Ya","ь"=>"","Ь"=>"","ъ"=>"","Ъ"=>""," "=>"_","."=>"_");
$idstr = strtr($namecomp, $trans); 
exec("ping -n 1 -w 1 $ip",$output, $status); 
if ($status==0) 
 
echo ("<html>
        <head>
            <title>
                ping IP
            </title>
        <meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
        </head>
        <body>
        <p id=".$idstr.">$namecomp -
            <font color=#00ff33><b>ONLINE!</b></font></p>
        </body>
        </html>"); 
else  
echo ("<html>
        <head>
        <title>
                ping IP
        </title>
        <meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
        </head>
        <body>
        <p id=".$idstr.">$namecomp -
            <font color=#FF0000><b>OFFLINE!</b></font></p>
        </body>
        </html>"); 
        unset($idstr);
        unset($ip);
        unset($namecomp);
        
}
include("array_ip.php"); //подключаю внешний файлик с ассоциативным массивом ИП адресов и 
                                         //имён компьютеров 
                    
foreach ($ipaddres as $key=>$value) 
  {
    pingIP($key,$value);
  }
header('Refresh: 20; url=' .$_SERVER['PHP_SELF']);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.09.2012, 15:50
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Обработка большого массива функцией в цикле foreach занимает много времени (PHP):

Функция занимает много времени - PHP
Добрый день. Есть функция по уменьшению картинки: function image_resize( $source_path, $destination_path, $newwidth, ...

Ошибка с функцией foreach - PHP
Нужно найти максимальный элемент массива по модулю. Код странички ввода: &lt;form method=&quot;GET&quot; action=&quot;script_1.php&quot;&gt; &lt;p&gt;Введите...

Ошибка в цикле foreach - PHP
Добрый день, уважаемые форумчане. Помогите, пожалуйста, разобраться с ошибкой в строке 46 foreach ($items as &amp;$item) Invalid...

Ошибка в цикле foreach - PHP
Помогите найти ошибку в цикле, говорит,то что неверный аргумент &lt;!DOCTYPE html&gt; &lt;html lang=&quot;en&quot;&gt; &lt;head&gt; &lt;meta...

Доступ к переменной в цикле foreach - PHP
Здравствуйте! Есть ассоциативный массив $Arr = array('k1'=&gt;$V1, 'k2'=&gt;$V2, 'k3'=&gt;$V3...); В этом массиве ключом является строка, а...

Вернуться на шаг назад в цикле foreach - PHP
можно ли в цикле foreach вернуться на шаг назад? в нете полезного ничего ненашел, один только посоветовал при условии использовать...

6
KOPOJI
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16713 / 6635 / 434
Регистрация: 12.06.2012
Сообщений: 19,880
Завершенные тесты: 1
04.09.2012, 15:52 #2

Не по теме:

на ООП здесь нет и намека


для этого есть другие языки, например C и т.п.
0
Symba
5 / 5 / 3
Регистрация: 10.03.2011
Сообщений: 83
04.09.2012, 16:15  [ТС] #3

Не по теме:

пардон, что не туда запостил сначала


Цитата Сообщение от KOPOJI Посмотреть сообщение
для этого есть другие языки, например C и т.п.
всё же хотелось бы узнать, можно решить этот вопрос именно средствами PHP?
0
KOPOJI
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16713 / 6635 / 434
Регистрация: 12.06.2012
Сообщений: 19,880
Завершенные тесты: 1
04.09.2012, 16:31 #4
1. использовать числовые индексы вместо строковых в массиве (ключи вообще можно не писать, просто через запятую перечислять значения) не рассмотрел толком код
2. использовать одинарные кавычки (апострофы) вместо двойных апострофов (вместо кавычек)
3. в операторе echo использовать вместо конкатенации возможность оператора echo выводить несколько операндов (заменить точки на запятые) и убрать скобки из echo - это не функция и такое использование неверно.
По идее, пару секунд должно дать
0
Vovan-VE
13148 / 6531 / 188
Регистрация: 10.01.2008
Сообщений: 15,071
04.09.2012, 16:35 #5
Symba, Так, может, у Вас сам ping делает таймаут? Засеките время с помощью microtime().
0
KOPOJI
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16713 / 6635 / 434
Регистрация: 12.06.2012
Сообщений: 19,880
Завершенные тесты: 1
04.09.2012, 16:41 #6
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
function pingIP($ip, $namecomp)
{
 $trans = array('а'=>'a','б'=>'b','в'=>'v','г'=>'g','д'=>'d','е'=>'e', 'ё'=>'yo',
                'ж'=>'j','з'=>'z','и'=>'i','й'=>'i','к'=>'k','л'=>'l', 'м'=>'m',
                'н'=>'n','о'=>'o','п'=>'p','р'=>'r','с'=>'s','т'=>'t', 'у'=>'y',
                'ф'=>'f','х'=>'h','ц'=>'c','ч'=>'ch', 'ш'=>'sh','щ'=>'sh','ы'=>'i',
                'э'=>'e','ю'=>'u','я'=>'ya',
                'А'=>'A','Б'=>'B','В'=>'V','Г'=>'G','Д'=>'D','Е'=>'E', 'Ё'=>'Yo',
                'Ж'=>'J','З'=>'Z','И'=>'I','Й'=>'I','К'=>'K', 'Л'=>'L','М'=>'M',
                'Н'=>'N','О'=>'O','П'=>'P', 'Р'=>'R','С'=>'S','Т'=>'T','У'=>'Y',
                'Ф'=>'F', 'Х'=>'H','Ц'=>'C','Ч'=>'Ch','Ш'=>'Sh','Щ'=>'Sh', 'Ы'=>'I',
                'Э'=>'E','Ю'=>'U','Я'=>'Ya','ь'=>'','Ь'=>'','ъ'=>'','Ъ'=>'',' '=>'_','.'=>'_');
$idstr = strtr($namecomp, $trans); 
exec('ping -n 1 -w 1 '.$ip,$output, $status); 
if ($status==0) 
 
echo '<html>
        <head>
            <title>
                ping IP
            </title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        </head>
        <body>
        <p id="',$idstr,'">',$namecomp,' -
            <font color=#00ff33><b>ONLINE!</b></font></p>
        </body>
        </html>'; 
else  
echo '<html>
        <head>
        <title>
                ping IP
        </title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        </head>
        <body>
        <p id="',$idstr,'">',$namecomp,' -
            <font color=#FF0000><b>OFFLINE!</b></font></p>
        </body>
        </html>'; 
        unset($idstr);
        unset($ip);
        unset($namecomp);
        
}
include('array_ip.php'); //подключаю внешний файлик с ассоциативным массивом ИП адресов и 
                                         //имён компьютеров 
                    
foreach ($ipaddres as $key=>$value) 
  {
    pingIP($key,$value);
  }
header('Refresh: 20; url=' .$_SERVER['PHP_SELF']);
Добавлено через 23 секунды
и у вас код одинаковый почти, логичнее его заменять

Добавлено через 3 минуты
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
function pingIP($ip, $namecomp)
{
 $trans = array('а'=>'a','б'=>'b','в'=>'v','г'=>'g','д'=>'d','е'=>'e', 'ё'=>'yo',
                'ж'=>'j','з'=>'z','и'=>'i','й'=>'i','к'=>'k','л'=>'l', 'м'=>'m',
                'н'=>'n','о'=>'o','п'=>'p','р'=>'r','с'=>'s','т'=>'t', 'у'=>'y',
                'ф'=>'f','х'=>'h','ц'=>'c','ч'=>'ch', 'ш'=>'sh','щ'=>'sh','ы'=>'i',
                'э'=>'e','ю'=>'u','я'=>'ya',
                'А'=>'A','Б'=>'B','В'=>'V','Г'=>'G','Д'=>'D','Е'=>'E', 'Ё'=>'Yo',
                'Ж'=>'J','З'=>'Z','И'=>'I','Й'=>'I','К'=>'K', 'Л'=>'L','М'=>'M',
                'Н'=>'N','О'=>'O','П'=>'P', 'Р'=>'R','С'=>'S','Т'=>'T','У'=>'Y',
                'Ф'=>'F', 'Х'=>'H','Ц'=>'C','Ч'=>'Ch','Ш'=>'Sh','Щ'=>'Sh', 'Ы'=>'I',
                'Э'=>'E','Ю'=>'U','Я'=>'Ya','ь'=>'','Ь'=>'','ъ'=>'','Ъ'=>'',' '=>'_','.'=>'_');
$idstr = strtr($namecomp, $trans); 
exec('ping -n 1 -w 1 '.$ip,$output, $status); 
$text = '<html>
        <head>
            <title>
                ping IP
            </title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        </head>
        <body>
        <p id="'.$idstr.'">'.$namecomp.' -
            <font color=#00ff33><b>{status}</b></font></p>
        </body>
        </html>';
if ($status==0) $text = str_replace('{status}','ONLINE!',$text);
else $text = str_replace('{status}','OFFLINE!',$text);
echo $text;
        unset($idstr);
        unset($text);
        unset($ip);
        unset($namecomp);
        
}
include('array_ip.php'); //подключаю внешний файлик с ассоциативным массивом ИП адресов и 
                                         //имён компьютеров 
                    
foreach ($ipaddres as $key=>$value) 
  {
    pingIP($key,$value);
  }
header('Refresh: 20; url=' .$_SERVER['PHP_SELF']);
0
Symba
5 / 5 / 3
Регистрация: 10.03.2011
Сообщений: 83
05.09.2012, 08:52  [ТС] #7
Цитата Сообщение от KOPOJI Посмотреть сообщение
и у вас код одинаковый почти, логичнее его заменять
спасибо! слегка подправил), ато все одним цветом
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$text = '<html>
        <head>
            <title>
                ping IP
            </title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        </head>
        <body>
        <p id="'.$idstr.'">'.$namecomp.' - {status}</p>
        </body>
        </html>';
if ($status==0) $text = str_replace('{status}','<font color=#00ff33><b>ONLINE!</b></font>',$text);
else $text = str_replace('{status}','<font color=#FF0000><b>OFFLINE!</b></font>',$text);
echo $text;
тока все не сократилось время визуально....хотя может попробовать с большим массивом...попробую, отпишусь, а так жду еще предложений.
Или на php это не реализуемо?
0
05.09.2012, 08:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.09.2012, 08:52
Привет! Вот еще темы с ответами:

Вывод карусели bootstrap в цикле foreach - PHP
Все здравствуйте. Столкнулся с проблемой вывода бутстраповской карусели в цикле foreach, если конкретнее, в блоке div сейчас стоит класс...

Разделитель в конце имён в цикле foreach - PHP
Здравствуйте уважаемые программисты, помогите решить одну проблемку:)есть список имён в массиве (Алёна, Александра, Вася, Виктор, Виктория,...

Пожалуйста подскажите о цикле перебора массивов foreach - PHP
Не могу найти материал который бы точно изложил суть цикла перебора массива foreach Вот пример: function _Html ($path){ ...

Как сделать вывод в три колонки в цикле foreach - PHP
Здравствуйте! Подскажите как вывести в цикле таблицу в три столбика, а тут только в одной ячейке td Я понимаю что нужно сделать как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru