Pull to refresh

Comments 16

А взяли бы SWIG, и повода для статьи не было.

Впрочем, за раздел с производительностью спасибо. Обычно на сайтах типа stackoverflow любой вопрос про производительность заканчивается заплюсованным ответом «А не взять ли тебе профайлер и не посмотреть самому?». Возможно оно и правильно, но меня злит невероятно.
Спасибо за ссылку, выглядит очень мощно. Правда не реализует весь функционал Zend API — например не нашел в документации ни слова про работу с массивам, хотя примеры работы с объектами впечатляют. Возможно, тоже когда-нибудь напишу об этом
а если использовать count_chars? почти все велосипеды придуманы до нас, а те, которые не придуманы, не нуждаются в них )
Вы задали хороший вопрос, обновил топик :)
В коде присутствует переполнение буфера, даже потенциально эксплоитируемое.
Переполнение здесь: table[(int)text[i]]++;, text это указатель на знаковый тип char, который может принимать отрицательные значения. Если text содержит отрицательные числа, то у нас будет доступ к памяти перед массивом table, а т.е. table лежит в стеке — мы имеем классическое переполнение стекового буфера с возможностью перезаписи адреса возврата.
Правильный код: table[((unsigned char*)text)[i]]++;
Пожалуй вы правы, мой C не очень хорош. Поправлю код. И конечно же я не призываю использовать этот код для production, хотя бы просто потому, что он не сможет работать с unicode строками, ну и потому, что не все хорошо с безопасностью, как оказывается
Вопрос немного не в тему, но может кто-нибудь знает. Есть апач в префорк режиме и модуль пхп. Возможно ли сделать так чтобы инициализация пхп модуля просиходила только один раз (трудоёмкие вычисления), а не в каждом инстансе. Или апач их всё же каждый раз с диска пускает, а не форком? Про mmap знаю ;)
Я думаю время в последнем тесте отличается из-за того, что все же автор не мастер в С, но если его подкрутить, время должно быть почти равным.
А вообще конечно верно выносить тяжелые обработки на языки более высокого уровня.
Наверное, имелось в виду «верно выносить тяжелые обработки на языки более низкого уровня»
Да, немного оговорился :)
Ну Вы понимаете, четверг, солнце за окном, а ты сидишь на своем чертовом стуле и пишешь код)))
Спасибо большое за статью.

Непонятно, конечно, почему надо еще какие-то файлы выдергивать из 5.2 и там править define. Выглядит как-то неубедительно.

Но в общем — очень хорошо, что все по полочкам разложено — то что надо начинающим )
Вот тут есть небольшое обсуждение вопроса по конфигурационному файлу. Он был в исходниках вплоть до 5.2.9, а потом был удален, и теперь разработчики рекомендуют генерировать его. Соответственно дефайны должны быть сгенерированы там тоже автоматически. Но самый простой путь — это скопировать его из предыдущих версий :)
Я тоже писал топик на тему расширений для PHP :)
Как раз описывал в том числе и работу с массивами, где-то выше спрашивали в комментах :)
habrahabr.ru/blogs/php/75696/
Каюсь, не нашел ваш топик через поиск. Но они вообщем-то дополняют друг друга по содержанию
Я попробовал собрать расширение для 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();» — авторский вариант ничего никуда не выводит

Опечатка в коде: имя параметра «text_lenght»
char* text;
int text_length;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &text, &text_lenght) == FAILURE) { 
   return;
}
Sign up to leave a comment.

Articles