Feb 16

Столкнулся с проблемой, при попытке заапдейтить большой массив айдишек. Searchd ругается на 8кб с копейками запрос и клозит соединение.. Решение - разбить массив айди на несколько частей :)

Например вот так:

/*................................*/
            if(count($id) > 500) {
                $id = array_chunk($id, 500, true);
                foreach($id as $v)
                    $cl->UpdateAttributes('shop', array($this->table), $v);
            } else
                $cl->UpdateAttributes('shop', array($this->table), $id);
/*................................*/
Feb 12
<?php
$key = explode(' ', 'testword');
foreach($key as &$v) $v = trim($v);

foreach(array('store', 'brand') as $v){
    /*.......*/
}
print_r($key);
?>

Как может показаться в массиве $key должно быть ‘testword’ :) но это не так. Проблему решает только unset($v) после первого foreach’a.

Feb 10

Почему-то при изучении и работе с пхп в мане нираз не видел упоминаний про работу с большими файлами (2гб+), хотя оно там есть :) и по ошибке, выдаваемой интерпретатором (File size limit exceeded), этот ман не гуглится ;)

Для работы с большими файлами требуется пересобрать PHP с флагами CFLAGS=”-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64″

CFLAGS="-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64" \
./configure .....

Ахтунг, если поддержка нужна для веба, необходимо также пересобрать апач и мод_ссл с теми же флагами. Для консоли сойдет пересобрать пхп в другое место :)

Интересный факт, что после сборки PHP с такими флагами, время работы с файлами увеличилось ровно в 2 раза, по сравнению со сборкой без флагов. Добавляем -O2 или -O3 к флагам и радуемся результату :) при -O3 работает чуть-чуть быстрей дефолтной сборки (gcc 4.1.1).

Feb 10

Перенапрягся в тренажерном зале так, что не мог уснуть 3 ночи. Чугунная бошка+антибиотики сделали свое дело, неделя пролетела без работы.. :(

Вот к чему приводит сранная безвылазная сидячка за компом.

Feb 04

Прочитал тут недавно у одного адепта, что не имеет смысла оптмизировать строки и писать в ординарных кавычках, что лучше строить боинги :) которые видимо развалятся не взелетев с таким подходом :D ПОХАПЕ сам по себе гавноязык, который нужно оптимизровать везде насколько можно, если нужна максимальаня производительность, что особо сказывается на крупных проектах. Слово крупный тут не значит использование всевозможных фреймворков и больших денег за работу, слово крупный тут имеет смысл большой нагрузки, где каждый выигранный % производительности на счету.

Не поленился написать нубоскрипт, вот результаты:

# vars    time with "       time with '       performance
1         3.6974380016327   2.5139710903168   147.08%
2         6.0501251220703   5.0527441501617   119.74%
3         8.2543439865112   7.8380331993103   105.31%
4         10.672549962997   10.420034885406   102.42%
total     28.674457073212   25.824783325195   111.03%  

Отсюда видно, что максимальный отрыв наблюдается при подстановке 1ой переменной :) и даже при падении скорости при подстановке 4х переменных, общая производительность выше. Поэтому не ленитесь и пишите все строки сразу с 1ой кавычкой, тем более если нужно подставить всего 1ну переменную.
Continue reading »

Feb 02

Очень полезная и чесно пизженная функция с каментов на php.net с минимальными изменениями, помогает для отлова узких мест в скрипте и настройки производительности функций/методов

<?php
function debug() {
   static $start_time = NULL;
   static $start_code_line = 0;

   $call_info = array_shift( debug_backtrace() );
   $code_line = $call_info['line'];
   $file = array_pop( explode('/', $call_info['file']));

   if( $start_time === NULL ) {
       print 'debug '.$file.'> initialize'."\n";
       $start_time = time() + microtime();
       $start_code_line = $code_line;
       return 0;
   }

   printf('debug %s> code-lines: %d-%d time: %.4f mem: %d/%d KB'."\n", $file, $start_code_line, $code_line, (time() + microtime() - $start_time), ceil(memory_get_usage()/1024), ceil(memory_get_usage(1)/1024));
   $start_time = time() + microtime();
   $start_code_line = $code_line;
}
?>

Continue reading »

Feb 01

В ходе недавних тестов выявил, что memory_get_usage() не показывает используемую память под буфферизацию вывода MySQL в самом PHP скрипте, из-за чего вполне можно упереться в memory_limit и долго ругаться, почему вылетает скрипт, находясь далеко от мемори_лимита. (PHP 5.2.5)

Поэтому, чтобы не наступить на грабли, советую использовать mysql_unbuffered_query(). Это сократит время выполнения и потребляемые ресурсы скрипта.

Из минусов только отсутсвие возможности повторного mysql запроса до полной выборки предыдущего (так думает PHP и ругается по этому поводу :)), нельзя юзать mysql_num_rows() (замена SQL_CALC_ROWS, либо в скрипте по ходу выборки) и не будет пахать убер mysql_data_seek().