Комментарии 16
А взяли бы SWIG, и повода для статьи не было.
Впрочем, за раздел с производительностью спасибо. Обычно на сайтах типа stackoverflow любой вопрос про производительность заканчивается заплюсованным ответом «А не взять ли тебе профайлер и не посмотреть самому?». Возможно оно и правильно, но меня злит невероятно.
Впрочем, за раздел с производительностью спасибо. Обычно на сайтах типа stackoverflow любой вопрос про производительность заканчивается заплюсованным ответом «А не взять ли тебе профайлер и не посмотреть самому?». Возможно оно и правильно, но меня злит невероятно.
+12
а если использовать count_chars? почти все велосипеды придуманы до нас, а те, которые не придуманы, не нуждаются в них )
+1
В коде присутствует переполнение буфера, даже потенциально эксплоитируемое.
Переполнение здесь:
Правильный код:
Переполнение здесь:
table[(int)text[i]]++;
, text это указатель на знаковый тип char, который может принимать отрицательные значения. Если text содержит отрицательные числа, то у нас будет доступ к памяти перед массивом table, а т.е. table лежит в стеке — мы имеем классическое переполнение стекового буфера с возможностью перезаписи адреса возврата.Правильный код:
table[((unsigned char*)text)[i]]++;
+9
Вопрос немного не в тему, но может кто-нибудь знает. Есть апач в префорк режиме и модуль пхп. Возможно ли сделать так чтобы инициализация пхп модуля просиходила только один раз (трудоёмкие вычисления), а не в каждом инстансе. Или апач их всё же каждый раз с диска пускает, а не форком? Про mmap знаю ;)
0
Я думаю время в последнем тесте отличается из-за того, что все же автор не мастер в С, но если его подкрутить, время должно быть почти равным.
А вообще конечно верно выносить тяжелые обработки на языки более высокого уровня.
А вообще конечно верно выносить тяжелые обработки на языки более высокого уровня.
+1
Спасибо большое за статью.
Непонятно, конечно, почему надо еще какие-то файлы выдергивать из 5.2 и там править define. Выглядит как-то неубедительно.
Но в общем — очень хорошо, что все по полочкам разложено — то что надо начинающим )
Непонятно, конечно, почему надо еще какие-то файлы выдергивать из 5.2 и там править define. Выглядит как-то неубедительно.
Но в общем — очень хорошо, что все по полочкам разложено — то что надо начинающим )
0
Вот тут есть небольшое обсуждение вопроса по конфигурационному файлу. Он был в исходниках вплоть до 5.2.9, а потом был удален, и теперь разработчики рекомендуют генерировать его. Соответственно дефайны должны быть сгенерированы там тоже автоматически. Но самый простой путь — это скопировать его из предыдущих версий :)
0
Я тоже писал топик на тему расширений для PHP :)
Как раз описывал в том числе и работу с массивами, где-то выше спрашивали в комментах :)
habrahabr.ru/blogs/php/75696/
Как раз описывал в том числе и работу с массивами, где-то выше спрашивали в комментах :)
habrahabr.ru/blogs/php/75696/
0
Я попробовал собрать расширение для php 5.4.7 для Win32 (xampp) по этим инструкциям — и у меня получилось! Автору — спасибо!!! :-)
Только по дороге пришлось споткнуться о несколько камушков, хочу поделиться для автора и тех, кто захочет повторить мой эксперимент:
1. батника configure.bat изначально нет, он собирается другим батником — buildconf.bat, который требует наличия утилиты bison.exe (которая вроде бы должна находиться в папке %WINDIR%\system32\, но мне пришлось скачать ее отсюда: www.freewareweb.com/download/?f=bison.exe)
2. Директива #define PHP_COMPILER_ID «VC9» не помогает, так как после нее стоит директива #include «zend_config.w32.h», переопределяющая макрос PHP_COMPILER_ID в значение «VC10» (у меня используется именно такой компилятор) — мне пришлось еще закомментировать эту директиву в сгенерированном файле config.w32.h
3. проверять работоспособность расширения надо не командой php -r «test();» как рекомендует автор, а командой php -r «echo test();» — авторский вариант ничего никуда не выводит
Только по дороге пришлось споткнуться о несколько камушков, хочу поделиться для автора и тех, кто захочет повторить мой эксперимент:
1. батника configure.bat изначально нет, он собирается другим батником — buildconf.bat, который требует наличия утилиты bison.exe (которая вроде бы должна находиться в папке %WINDIR%\system32\, но мне пришлось скачать ее отсюда: www.freewareweb.com/download/?f=bison.exe)
2. Директива #define PHP_COMPILER_ID «VC9» не помогает, так как после нее стоит директива #include «zend_config.w32.h», переопределяющая макрос PHP_COMPILER_ID в значение «VC10» (у меня используется именно такой компилятор) — мне пришлось еще закомментировать эту директиву в сгенерированном файле config.w32.h
3. проверять работоспособность расширения надо не командой php -r «test();» как рекомендует автор, а командой php -r «echo test();» — авторский вариант ничего никуда не выводит
0
Опечатка в коде: имя параметра «text_lenght»
char* text;
int text_length;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &text, &text_lenght) == FAILURE) {
return;
}
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Пишем PHP extension