Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Подключение внешнего кода [2]

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): « 1 [2]   

> Описание: Необходима помощь или консультация. Помогите, пожалуйста.
MoZart
Отправлено: 22 Июня, 2010 - 14:53:28
Post Id


Новичок


Покинул форум
Сообщений всего: 31
Дата рег-ции: Июнь 2010  


Помог: 0 раз(а)




JustUserR пишет:
просто ваша МПГ будет записывать данные в разделенную область памяти а PHP-скрипт будет считывать их в режиме реального времени


Да, я это понял, спасибо.
Но Как это реализуется? Какой функцией/процедурой? Я не программист С++, не знаю.
Я пытаюсь разобраться с РНР. Подскажите, что и где писать, пожалуйста.

И что насчёт БД?
 
 Top
JustUserR
Отправлено: 23 Июня, 2010 - 13:36:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




MoZart пишет:
Да, я это понял, спасибо.
Но Как это реализуется? Какой функцией/процедурой? Я не программист С++, не знаю.
Я пытаюсь разобраться с РНР. Подскажите, что и где писать, пожалуйста.
И что насчёт БД?
Пожалуйста! Если для реализации такого межпроцессного обмена данными вы будете использовать сервис memcached - то в принципе работу с ним можно осуществить через обычные сетевые функции поскольку он привязывается к некоторому IP-адресу и порту - и все команды пересылаемые ему и значения возвращаемые им передаются без всякого зашифрованного вида то есть с ним можно работать напрямую через telnet Список данных в memcached хранится как в хеш-массиве то есть в ассоциативном массиве с доступом по ключу - и так как сохраняемым типом данных могут быть стороки то придется использовать некоторый механизм сериализации - такой чтобы данные некоторых общих заранее описанных типов можно было передавать из C/C++ в PHP и обратно При этом могут использоваться такие команды которые позволяют блокировать и разблокировать изменение определенных данных - как раз для распределенного доступа к этом данных от нескольких процессов
Для работы с memcahced со стороны PHP можно использовать специальную библиотеку из PECL которая позволяет работать с ним без явного применения сетевых функций - об ее установке и настройке можете почитать здесь http://abrdev[dot]com/?p=91 Для примера на C/C++ можете скачать дистрибутив memcahced http://memcached[dot]org/ и в папке tests посмотреть соответствующий пример
Как более сложный вариант с односторонним взаимодействием можно было бы рассмотреть C/C++-программу которая бы ослеживала PHP-процессы в памяти и сама подставляла бы туда значения - такая возможность разумеется имеется но реализация такой программы является сложной задачей если речь не идет о CLR-приложениях
Что касается использование БД то это также может быть хорошим вариантом - особенно если использовать БД Oracle с улучшенной поддержкой транзакций что позволяет осуществить разделения одновременного доступа к данным - и кроме того за счет возможности написания пользоватеьских функций на Java можно часть работы перенести на сервер БД


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
MoZart
Отправлено: 23 Июня, 2010 - 16:27:44
Post Id


Новичок


Покинул форум
Сообщений всего: 31
Дата рег-ции: Июнь 2010  


Помог: 0 раз(а)




Спасибо. Понял не много, но буду разбираться.

Теперь следующий вопрос: Я перерыл просторы интернета в поисках руководства/алгоритма по созданию расширения для РНР. Толком ничего не нашёл.

Поясняю. Существует набор РЕАЛИЗОВАНнЫХ И ПРОТЕСТИРОВАННЫХ функций/алгоритмов, написаных на С++. Необходимо собрать их в DLL так, чтобы к ней можно было обратиться из РНР. По сути - создать собственное расширение.

Вопрос. Как и каким образом это можно сделать? Если это возможно, то как именно её надо компилировать? Как подключить? Как обращаться к реализованным в ней функциям/процедурам?

Сейчас это для меня особенно важно. Разработчики МГП настаивают именно на таком подходе к решению задачи. И время поджимает...
(Добавление)
JustUserR пишет:
Здесь можно конкретно посмотреть данный интерфейс и пример написания собтсвенного расшинения http://www[dot]samag[dot]ru/cgi-bin/go[dot]p[dot][dot][dot]s;n=11[dot]2005;a=13


В статье много всего написано, однако у меня самый простой вопрос: А где прописывать необходимые команды? в какой программе?

Цитата:"Запуск скрипта без параметров приведет к выдаче на консоль перечня всех параметров:..." - Это в чём запускается?

Я работаю ис-под винды... Помогите разобраться, пожалуйста!
 
 Top
JustUserR
Отправлено: 24 Июня, 2010 - 15:12:04
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




MoZart пишет:
Спасибо. Понял не много, но буду разбираться.
Теперь следующий вопрос: Я перерыл просторы интернета в поисках руководства/алгоритма по созданию расширения для РНР. Толком ничего не нашёл.
Поясняю. Существует набор РЕАЛИЗОВАНнЫХ И ПРОТЕСТИРОВАННЫХ функций/алгоритмов, написаных на С++. Необходимо собрать их в DLL так, чтобы к ней можно было обратиться из РНР. По сути - создать собственное расширение.
Пожалуйста! Если у вас имеется набор реализованный и протестированных алгоритмов на C/C++ то для подключения к PHP в виде динамической библиотеки вовсе не придется их изменять - нужны только их исходные коды и несколько специальные структур и функций которые будут связывать функциональность МПГ и семантику их PHP-вызовов
MoZart пишет:
В статье много всего написано, однако у меня самый простой вопрос: А где прописывать необходимые команды? в какой программе?
Цитата:"Запуск скрипта без параметров приведет к выдаче на консоль перечня всех параметров:..." - Это в чём запускается?
Я работаю ис-под винды... Помогите разобраться, пожалуйста!
В данной статье имеется в виду создание и компалияция расширения PHP из-под linux - однако это не мешает использовать ее как руководство для разработки расширений под windows - поскольку имеются в открытом доступе исходники PHP и функицональности вашей МПГ Если вы поставите обычную Visual Studio с полным SDK для программирования на C/C++ то получите также консольный компилятор аналигичный linux - только например заместо команды make в консоли нужно будет набирать nmake Но сам API интерпретатора PHP останется таким же - поскольку Zend является кросс-платформенным и вся разница между расширением под windows и linux заключается только в последней стадии компиляции - если вы конечно не используете специфические вызовы ОС


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
MoZart
Отправлено: 28 Июня, 2010 - 08:53:40
Post Id


Новичок


Покинул форум
Сообщений всего: 31
Дата рег-ции: Июнь 2010  


Помог: 0 раз(а)




JustUserR пишет:
однако это не мешает использовать ее как руководство для разработки расширений под windows - поскольку имеются в открытом доступе исходники PHP и функицональности вашей МПГ Если вы поставите обычную Visual Studio с полным SDK для программирования на C/C++ то получите также консольный компилятор аналигичный linux - только например заместо команды make в консоли нужно будет набирать nmake Но сам API интерпретатора PHP останется таким же - поскольку Zend является кросс-платформенным и вся разница между расширением под windows и linux заключается только в последней стадии компиляции - если вы конечно не используете специфические вызовы ОС


Мы с разработчиком МГП попробовали что-либо сделать из вышенаписанного. Однако у нас не получилось. Проблема в том, что я ничего не понимаю в С, а он в РНР. Он работает из-под C++ Builder, как я понимаю там нет консольного компилятора, или если есть, то мы не знаем, где его искать. Мы пробовали стандартными методами - на выходе получается 2 файла: .lib и .dll. всё бы ничего, но второй без первого не работает. А в РНР подключается только длл...

Не могли бы Вы дать подробные инструкции и указания по сборке и компиляции длл для РНР из-под винды? Очень будем благодарны!
 
 Top
JustUserR
Отправлено: 28 Июня, 2010 - 15:12:15
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




MoZart пишет:
Мы пробовали стандартными методами - на выходе получается 2 файла: .lib и .dll. всё бы ничего, но второй без первого не работает. А в РНР подключается только длл...
Не могли бы Вы дать подробные инструкции и указания по сборке и компиляции длл для РНР из-под винды? Очень будем благодарны!
Для начала необходимо уточнить какой C++-код вы компилировали в dll-библиотеку - то есть являестся ли простой библиотекой с набором функций для вызова или же сделан как модуль PHP с учетом указанного API Таким образом вам сначала необходимо скачать заголовочные h-файлы с набором прототипов функций и структур данного API - после чего реализовать по шаблону описания вызовов функций для PHP-скриптов и подключить вызов уже ваших реальных функций из МПГ
После написания такого C++-кода по шаблону необходимо его праильно скомпилировать - сложность заключается в том чтобы получить на выходе независимую от нестандартных вызовов dll-библиотеку - иначе придется вместе с ее использованем указывать include_path для ее зависимостей В общем случае C++-компилятор при установке должен был прописать свои основые утилиты в PATH - соответственно вы должны зайти из командной строки в каталог с проектов и запустить компиляцию с помощью make/nmake - но для этого у вас конечно же должен быть конфигурационный скрипт который содержит настройку параметров запуска компилятора - и также последующий запуск linker-а для получившихся obj-объектов
Задача написать все это вручную и учесть все необходимые параметры и флаги компиляции является достаточно сложной - тем более что придется вручную указывать пути к используемым h-файлам и другим библиотекам и тд По этой причине имеет смысл выполнить все необходимые настройки внутри самой IDE - посмотрите опции компиляции и попробуйте найти и установить в соответствующее положение те из них которые отвечают за создание независимого dll-файла и правила использования зависимостей


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
MoZart
Отправлено: 01 Июля, 2010 - 09:14:41
Post Id


Новичок


Покинул форум
Сообщений всего: 31
Дата рег-ции: Июнь 2010  


Помог: 0 раз(а)




Вот что я попробовал сделать и что из этого получилось.
1. поставил MS Visual 2005;
2. Исходники РНР у меня были;
3. Скопировал и переименовал каталог skeleton на navext в папке ext;
4. Открыл в MS Visual 2005 файл skeleton.dsp. Это проект.
5. Переименовал файлы skeleton.c в navext.c и php_skeleton.h в php_navext.h, добавил их в проект;
6. Переименовываете во всех местах где нашёл extname и EXTNAME на navext соблюдая регистр;
7. Положил файл php5ts.dll в каталог проекта;
8. На вкладке Build зашёл в Configuration Manager. Выбрал значение Active Solution Configuration равное Debug_TS. Нажал Build;
9. Повторил эту же процедуру со значением Active Solution Configuration равное Reliese_TS;
10. В Error-list появились ошибки Error C2466: Cannot allocate an array of constant size 0 в юнитах stat.inl (строки 44, 49) и utime.inl (строки 39, 44, 49, 78);
11. На этом процесс застопорился. Файл php5ts_debug.lib не появился. Не появилась и нужная библиотека.

В связи с этим у меня конкретные вопросы:
1. Что неправильно в моих действиях?
2. Что это за ошибки? Отчего они? Как их избежать?
3. Как исправить ситуацию? что делать дальше?

Заранее благодарен за помощь!

Прилагаю Лог-файлы.

Лог 1.
Спойлер (Отобразить)
Лог 2.
Спойлер (Отобразить)


Отредактировано модератором: JustUserR, 01 Июля, 2010 - 13:18:00
Положил приведенные тексты логов в спойлеры
 
 Top
JustUserR
Отправлено: 01 Июля, 2010 - 13:29:38
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




MoZart пишет:
В связи с этим у меня конкретные вопросы:
1. Что неправильно в моих действиях?
2. Что это за ошибки? Отчего они? Как их избежать?
3. Как исправить ситуацию? что делать дальше?
В процессе компиляции у вас возникает достаточно большой набор ошибок и скорее всего разные их части связаны с различными проблемами - это может быть как различие требуемых опций компилятора так и отсутствие или неправильные пути к подключаемым файлам
Конкретно ошибка cannot allocate an array of constant size 0 возникает в том случае когда происходит попытка инициализации статического массива на основе переменной/константы которая равна нулю - причем компилятор VS по умолчанию вообще не позволяет использовать неконстантные переменные в качестве индекса статического массива В вашем случае ошибка может возникать напрмер из-за того что какие-то файлы были подключены в неправильном порядке - и костанта имела неверное значение По возможности приведите конкретную строку например 44 строку из файла sys/stat.inl - чтобы посмотреть что за инструкция там используется
Остальные ошибки являются warning-ами и при желании убираются с помощью соответствующей директивы


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
MoZart
Отправлено: 01 Июля, 2010 - 13:56:11
Post Id


Новичок


Покинул форум
Сообщений всего: 31
Дата рег-ции: Июнь 2010  


Помог: 0 раз(а)




JustUserR пишет:
По возможности приведите конкретную строку например 44 строку из файла sys/stat.inl - чтобы посмотреть что за инструкция там используется

stat.inl:
Спойлер (Отобразить)

utime.inl:
Спойлер (Отобразить)


Только подсветка текста в С другая.

(Отредактировано автором: 01 Июля, 2010 - 14:04:31)

 
 Top
JustUserR
Отправлено: 01 Июля, 2010 - 14:11:34
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




MoZart пишет:
3-я строка и есть 44-ая.
Судя по приведенному коду 44 строки ошибка генерируется специально в _STATIC-ASSERT-макросе по той причине что размеры структур stat и __stat32 не равны - это используется далее в коде при преобразовании типов указателей на эти структуры Конкретно дело заклчается в том что структура __stat32 в библиотеках VS обладает другим форматом по сравнению с тем который требуется в данном коде - можно попробовать найти более старую реализацию библиотеки файловых функций и использовать ее заместо стандартной


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
MoZart
Отправлено: 01 Июля, 2010 - 14:20:54
Post Id


Новичок


Покинул форум
Сообщений всего: 31
Дата рег-ции: Июнь 2010  


Помог: 0 раз(а)




Прошу меня извинить, но я уже совсем запутался.

Вы можете написать конкретный порядок действий по созданию пустого расширения для РНР для уже отупевшего меня? Просто создать ДЛЛ без функций. По пунктам, типа взять это и сделать это.
 
 Top
JustUserR
Отправлено: 01 Июля, 2010 - 14:31:45
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




MoZart пишет:
Вы можете написать конкретный порядок действий по созданию пустого расширения для РНР для уже отупевшего меня? Просто создать ДЛЛ без функций. По пунктам, типа взять это и сделать это.
Как правило макросы ASSERT предназначаются для указания ошибок и несовместимостей при компиляции и исполнеии кода - в данном случае макрос STATIC_ASSERT является очень простым и проверяет некоторое значение на истинность в int-овых значениях - и если оно получается ложным то пытается создать статический массив рамезром 0 которое является значением false из-за чего компиляция и прекращается
Конечно может работать и не будет - по попробуйте убрать этот assert путем временной замены __static_assert_t[ (expr) ] в коде на __static_assert_t[ (expr) +1 ] - в таком случае проверка assert-а выполняться не будет но может быть все и скомпилируется благодаря некоторым автоматическим механизмам в компиляторе


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
MoZart
Отправлено: 01 Июля, 2010 - 14:44:32
Post Id


Новичок


Покинул форум
Сообщений всего: 31
Дата рег-ции: Июнь 2010  


Помог: 0 раз(а)




Попробовал, ничего не изменилось.

Мой вопрос.
Напишите, пожалуйста, чёткий порядок действий по созданию и подключению расширения (dll) для РНР.

Условия:
1. Я работаю в винде.
2. исходники РНР есть, версия 5.2.12
3. Microsoft Visual Studio установлен.
4. Папка Skeleton имеется.

Повторюсь, я новичок. Но мне действительно нужно создать эту длл. Я бьюсь уже 2-ую неделю, результата никакого. Очень прошу помочь...
 
 Top
JustUserR
Отправлено: 02 Июля, 2010 - 02:08:48
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




MoZart пишет:
Попробовал, ничего не изменилось
По идее после проведения нейтрализации макроса проверки типа assert поведение компиляции должно было измениться - даже если бы она и не прошла успешно то соответствующие сообщения про нулевую длину статического массива должны были исчезнуть
MoZart пишет:
Мой вопрос.
Напишите, пожалуйста, чёткий порядок действий по созданию и подключению расширения (dll) для РНР
При компиляции расширения для PHP используют шаблонную схему в которой происходит сборка PHP-интерпретатора из исходников - и при этом в конфигурационный файл сборки типа configure добавляется список новых расширение и прописываются все необходимые пути - таким образом make-сборщик автоматически подхватит и скомпилирует все подключенные расширения Как правило такой configure-скрипт предназначен для командной оболочки sh в linux - и чтобы выполнить его в windows потребуется специальный командный интерптетатор из CoreUtils http://gnuwin32[dot]sourceforge[dot]net/[dot][dot][dot]es/coreutils[dot]htm Благодаря данным утилитам вы можете совершить все необходимую настройку по добавлению модуля в конфигурацию с помощью стандартных прилагаемых linux-овых скриптов - и вам останется только запустить процесс сборки командой nmake && nmake install из командной строки в корневой директории с проктом
Можете также посмотреть еще одну статью от официального разработчика ядра PHP компании Zend - там также описан процесс сборки собственного динамического PHP-расширения под linux http://ru.php.net/manual/en/inte....ze1.zendapi.php


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Quantum
Отправлено: 07 Июня, 2011 - 10:18:29
Post Id


Новичок


Покинул форум
Сообщений всего: 1
Дата рег-ции: Июнь 2011  


Помог: 0 раз(а)




Столкнулся с той же самой ошибкой, когда пытался собрать eAccelerator в VC++ 2008. Всё гораздо проще оказалось.

В struct stat есть поля типа time_t, который в текущей версии VC++ является __int64, в отличие от своего 32-битного аналога в struct _stat32. Чтобы скомпилировать правильно, достаточно добавить в опцию проекта Preprocessor Definitions константу _USE_32BIT_TIME_T.

P.S. Возможно, кому-нибудь ещё пригодится.
 
 Top
Страниц (2): « 1 [2]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Операционная система и системные вызовы »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB