Pull to refresh
9
0
Евгений @bizzonaru

Пользователь

Send message
Изучаю как устроен PHP и вот для наглядности приведу пример, как увеличивается в 2 раза «Корзина».

static HashTable *sort(HashTable *ht)
{
   HashTable *result;

   zval *value;

   php_printf("size hashtable: %d used %d ", ht->nTableSize, ht->nNumUsed);
   php_printf("count: %d ", ht->nNumOfElements);
....
}


php > ms_sort([]);
size hashtable: 8 used 0 count: 0
php > ms_sort([0]);
size hashtable: 8 used 1 count: 1 item: 0.000000
php > ms_sort([0,1]);
size hashtable: 8 used 2 count: 2 item: 0.000000 item: 1.000000
php > ms_sort([0,1,2]);
size hashtable: 8 used 3 count: 3 item: 0.000000 item: 1.000000 item: 2.000000
php > ms_sort([0,1,2,3]);
size hashtable: 8 used 4 count: 4 item: 0.000000 item: 1.000000 item: 2.000000 item: 3.000000
php > ms_sort([0,1,2,3,4]);
size hashtable: 8 used 5 count: 5 item: 0.000000 item: 1.000000 item: 2.000000 item: 3.000000 item: 4.000000
php > ms_sort([0,1,2,3,4,5]);
size hashtable: 8 used 6 count: 6 item: 0.000000 item: 1.000000 item: 2.000000 item: 3.000000 item: 4.000000 item: 5.000000
php > ms_sort([0,1,2,3,4,5,6]);
size hashtable: 8 used 7 count: 7 item: 0.000000 item: 1.000000 item: 2.000000 item: 3.000000 item: 4.000000 item: 5.000000 item: 6.000000
php > ms_sort([0,1,2,3,4,5,6,7]);
size hashtable: 8 used 8 count: 8 item: 0.000000 item: 1.000000 item: 2.000000 item: 3.000000 item: 4.000000 item: 5.000000 item: 6.000000 item: 7.000000
php > ms_sort([0,1,2,3,4,5,6,7,8]);
size hashtable: 16 used 9 count: 9 item: 0.000000 item: 1.000000 item: 2.000000 item: 3.000000 item: 4.000000 item: 5.000000 item: 6.000000 item: 7.000000 item: 8.000000



Изучаю исходники PHP просто ради спортивного интереса.

https://wiki.php.net/phpng-upgrading

А что за расширение писали?

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

PHP_FUNCTION(array_sum)
{
        zval *input,
                 *entry,
                 entry_n;

        if (zend_parse_parameters(ZEND_NUM_ARGS(), "a", &input) == FAILURE) {
                return;
        }

        ZVAL_LONG(return_value, 0);

        ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(input), entry) {
                if (Z_TYPE_P(entry) == IS_ARRAY || Z_TYPE_P(entry) == IS_OBJECT) {
                        continue;
                }
                ZVAL_COPY(&entry_n, entry);
                convert_scalar_to_number(&entry_n);
                fast_add_function(return_value, return_value, &entry_n);
        } ZEND_HASH_FOREACH_END();
}

Просто смотрю расширения и потом если вижу что-то подходящее, то делаю grep по всему исходнику.
Да, не ясно. Так как это директория есть и она видна. Поэтому я максимально упростил config.m4. Configure генерируется с логической ошибкой, более того, там внутри него есть используемые флаги (-qversion, -V) которые мой локальный gcc не понимает.

gcc version 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC)
configure:2688: $? = 0
configure:2677: cc -V >&5
cc: error: unrecognized command line option '-V'
cc: fatal error: no input files
compilation terminated.
configure:2688: $? = 4
configure:2677: cc -qversion >&5
cc: error: unrecognized command line option '-qversion'

На мой взгляд не нужно бояться называть сумму зп и подстраиваться под отдельную компанию. На это нужно смотреть с рыночной точки зрения. Я продаю свои знания и время, говорю стоимость, покупатель либо соглашается либо идет дальше по рынку, подыскивая «помидоры» под свой бюджет. Каждый покупатель со своим кошельком. Единственный момент, что влияет на зп, это количество таких же торгашей как и ты с таким же продуктом, если твой помидор рядовой, то цену врятли можно коррелировать выше 25%.

Из детства, как то я приехал на рынок продавать картошку, вне рабочий для рынка день. Практически ни кого не было — ни продавцов, ни покупателей. Соответственно я цену установил в 2 раза выше чем в обычный день и картошку купили!

Не падает вроде бы, просто своего рода shell-оболочка.
Для всего приложения нет, он больше для отладки отдельного скрипта, например, библиотеки в виде классов. По крайней мере я этой особенности не увидел. Можно в нем поднимать сервер и делать удаленную отладку.
Удобней тем, что можно ту же точку останова делать не просто по номеру строки или наименованию, а с использованием условия breakpoint-а.
prompt> help aliases
Below are the aliased, short versions of all supported commands
 e     exec                  set execution context
 s     step                  step through execution
 c     continue              continue execution
 r     run                   attempt execution
 u     until                 continue past the current line
 F     finish                continue past the end of the stack
 L     leave                 continue until the end of the stack
 p     print                 print something
 p e   print exec            print out the instructions in the main execution context
 p o   print opline          print out the instruction in the current opline
 p c   print class           print out the instructions in the specified class
 p m   print method          print out the instructions in the specified method
 p f   print func            print out the instructions in the specified function
 p s   print stack           print out the instructions in the current stack
 b     break                 set breakpoint
 b @   break at              specify breakpoint by location and condition
 b ~   break del             delete breakpoint by identifier number
 t     back                  show trace
 f     frame                 switch to a frame
 l     list                  lists some code
 l l   list lines            lists the specified lines
 l c   list class            lists the specified class
 l m   list method           lists the specified method
 l f   list func             lists the specified function
 i     info                  displays some informations
 i b   info break            show breakpoints
 i F   info files            show included files
 i c   info classes          show loaded classes
 i f   info funcs            show loaded classes
 i e   info error            show last error
 i d   info constants        show user defined constants
 i v   info vars             show active variables
 i g   info globals          show superglobals
 i l   info literal          show active literal constants
 i m   info memory           show memory manager stats
 X     clean                 clean the execution environment
 C     clear                 clear breakpoints
 S     set                   set phpdbg configuration
 S p   set prompt            usage: set prompt [<string>]
 S P   set pagination        usage: set pagination [<on|off>]
 S c   set color             usage: set color  <element> <color>
 S C   set colors            usage: set colors [<on|off>]
 S O   set oplog             usage: set oplog  [<output>]
 S b   set break             usage: set break id [<on|off>]
 S B   set breaks            usage: set breaks [<on|off>]
 S q   set quiet             usage: set quiet [<on|off>]
 S s   set stepping          usage: set stepping [<line|op>]
 S r   set refcount          usage: set refcount [<on|off>]
 S l   set lines             usage: set lines [<number>]
 R     register              register a function
 <     source                execute a phpdbginit
 >     export                export breaks to a .phpdbginit script
 q     quit                  exit phpdbg
 W     wait                  wait for other process
 w     watch                 set watchpoint
 w a   watch array           create watchpoint on an array
 w d   watch delete          delete watchpoint
 w r   watch recursive       create recursive watchpoints
 n     next                  step over next line
 E     eol                   set EOL
 h     help                  show help menu

 h a   help aliases          show alias list


То есть инструмент, по быстрому проверить код логики.
Согласен, но не совсем. Я рассматриваю сравнение с точки зрения программиста. Для прикладного уровня проекта в принципе да, не имеет значение какая база данных. Под прикладным я понимаю, взять простым запросом небольшое количество данных и нарисовать в табличной форме. Другой вопрос, когда такая таблица из разряда middle/big table, то тут уже нужно понимать как строится запрос на уровне базы данных, как хранятся данные.
А как идет миграци индексов, тригеров и прочее? Зачастую индексы при нагрузке кастомизируешь под особенности mysql. Просто перелить данные можно и обычным скриптом.
А как происходит работа с индексами, с большими таблицами?

Information

Rating
Does not participate
Registered
Activity