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 :: Подключение внешнего кода
Покинул форум
Сообщений всего: 31
Дата рег-ции: Июнь 2010
Помог: 0 раз(а)
Добрый день!
PHP я занимаюсь недавно. Так вот, появилась следующая проблема.
Существует трудоёмкая и довольно тяжеловесная программа, написанная на С++. Программа оочень активно использует базы данных, различные вычисления, сложные графические выводы... Да ещё и работает постоянно в режиме реального времени...
Существует задача создать сайт, отображающий результаты работы этой программы.
В связи с этим вот такой вопрос: каким образом это можно сделать?
Понимаю, что такой вопрос слишком общий, поэтому попытаюсь его конкретизиромать массивом вопросов поменьше и поконкретней...
1. Можно ли на сервере запустить эту программу?
2. Можно ли обращаться к этой программе из РНР скрипта?
3. Можно ли подключить к скрипту скомпилированную DLL, содержащую в себе сложные вычислительные алгоритмы, чтобы не переписывать их в скрипты?
4. Если можно, то как это сделать?
5. Каким ещё способом можно подключить внешние алгоритмы?
Если ответы на первые 5 вопросов "нет", то
6. Неужели необходимо переписывать все вычислительные алгоритмы в РНР скрипты и только тогда использовать? Длина кодов измеряется километрами, Число таблиз базы данных - сотнями. Если всё переписать в РНР и при каждом обращении производить все запросы и вычисления, то, как мне кажется, база данных загнётся, а обновление страницы будет жутко долгим... Если же есть возможность как-то подключить внешнюю программу, то это уменьшит разного рода затраты, ибо 70% параметров, запрашиваемых из базы данных, она хранит в своей памяти.
Не уверен, что понятно объяснил... Просто ОООчень нужна помощь!
Заранее спасибо за ответы.
Мелкий
Отправлено: 18 Июня, 2010 - 17:27:40
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
exec и компания далее по сссылкам.
Замечу, что по дефолту скрипт будет ждать завершения вызванной программы и если программа представляет собой что-то типа демона, то ей понадобится программный интерфейс (файлы, сокеты), через который с ней можно будет общаться.
----- PostgreSQL DBA
JustUserR
Отправлено: 19 Июня, 2010 - 10:52:21
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
MoZart пишет:
Существует задача создать сайт, отображающий результаты работы этой программы.
В связи с этим вот такой вопрос: каким образом это можно сделать?
Понимаю, что такой вопрос слишком общий, поэтому попытаюсь его конкретизиромать массивом вопросов поменьше и поконкретней...
Ваша задача является вполне выполнимой и в зависимости от конкретных условий может иметь более сложные или простые решения Если у вас имеется скомпилированная windows-программа и вы хотите запускать ее на linux-сервере то для такой эмуляции можно использовать wine - правда он может запросить дополнительные библиотеки если при разработке вы использовали бибилиотеки какого-то framework-а и скорость работы будет медленной - но при этом можно написать конфигурационный файл на Perl который будет выполнять некоторые замены в исходный C++-файла и установки модулей в результате чего можно будет скомпилировать ваше приложение под linux
Если продразумевается что ваша программа работает как daemon-сервис то есть непрерывно в фоновом режиме - то вы можете обмениваться данными между ней и PHP-скриптом быстрым способом типа memcached - потому что использование файлов по определению достаточно медленно и в случае многопоточности это может привести к проблемам совместного доступа
Если вы хотите подключить к PHP-скрипту определенную dll-библиотеку то это возможно например с помощью функции http://php.su/functions/?dl - но в таком случае расширение конечно же должно быть написано с учетом соответствующего API Кроме того если ваша программа все-таки является deamon-сервисом то переводить ее на PHP основным образом не имеет смысла - поскольку будут тратиться лишние ресурсы при перезагрузке PHP-скрипта и расширения для него а также на PHP-скрипт будут накладываться ограничения Apache
Также надо заметить что если ваша программа на C++ является сложным и функциональным проектом - то вероятно имеет смысл сразу встроить в нее web-сервер - причем существует достаточно-большое число таких библиотек и реализаций Плюсом такого подхода будет то что вам не нужно будет заботиться о внешней синхронизации и определенной сериализации данных при передаче их PHP-скрипту - а значит увеличится и производительнсть и даже функциональность потому что встроенный web-сервер сразу будет заточен под необходимые цели
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
MoZart
Отправлено: 21 Июня, 2010 - 11:40:53
Новичок
Покинул форум
Сообщений всего: 31
Дата рег-ции: Июнь 2010
Помог: 0 раз(а)
JustUserR пишет:
Если вы хотите подключить к PHP-скрипту определенную dll-библиотеку то это возможно например с помощью функции http://php.su/functions/?dl - но в таком случае расширение конечно же должно быть написано с учетом соответствующего API
Можно поподробнее объяснить этот пункт? Что значит учёт API? (Добавление)
JustUserR пишет:
Если продразумевается что ваша программа работает как daemon-сервис то есть непрерывно в фоновом режиме - то вы можете обмениваться данными между ней и PHP-скриптом быстрым способом типа memcached
Скорее всего это и подразумевается. С методом memcached я ещё не работал. Исходя из документации, которую я видел, не совсем понятно, как это работает. Поясните, пожалуйста, архитектуру этого метода и, если не затруднит, реализацию.
Кстати, как запустить daemon-сервис на сервере. Я с этим ещё не сталкивался.
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
MoZart пишет:
Можно поподробнее объяснить этот пункт? Что значит учёт API?
Дело в том что интерпретатор PHP позволяет подключать к себе внешние скомпилированные расширения типа статических и динамических библиотек - при этом при использовании данного расширения конечный разработчик увидит его как надор некоторых функций и классов Однако просто так подключить ваш набор алгоритмов не получится - ведь PHP должен знать как связать типа данных в PHP-скрипте и в вашем расширении и тд - то есть как связать синтексические PHP-инструкции которые предоставляет ваш модуль с реальными вызовами из библиотеки Набор таких правил которые по сути являются описаниями структур и сигнатурами функций и называется API - то ест прикладным интерфейсом Здесь можно конкретно посмотреть данный интерфейс и пример написания собтсвенного расшинения http://www[dot]samag[dot]ru/cgi-bin/go[dot]p[dot][dot][dot]s;n=11[dot]2005;a=13
MoZart пишет:
Скорее всего это и подразумевается. С методом memcached я ещё не работал. Исходя из документации, которую я видел, не совсем понятно, как это работает. Поясните, пожалуйста, архитектуру этого метода и, если не затруднит, реализацию.
Кстати, как запустить daemon-сервис на сервере. Я с этим ещё не сталкивался.
Заранее спасибо.
Пожалуйста! Использование сервиса memcached нужно для того чтобы инстанции PHP-скрипта могли обмениваться информацией между собой - причем делатб это быстрым образом через память а не через файл при работе с которым вдобавок возможны различные коллизии Некоторую информацию об этой технологии и интеграци с PHP можно посмотреть здесь http://www[dot]skillz[dot]ru/dev/freebsd[dot][dot][dot]P_MemCached[dot]html и здесь http://www.php[dot]ru/manual/ref[dot]memcache[dot]html
Что касается запуска daemon-сервиса то подразумевается что у вас будет сетевой приложение которое будет работать в фоновом режиме и обрабатывать соединения - в таком случае PHP и Apache как таковые сообще не нужны При этом если ваша програма будет работать от имени привелегированного пользователя - то нужно позаботиться об интеграции модулей suexec или sudo для запуска непривелегирированных процессов или процессов от имени другого пользователя
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
MoZart
Отправлено: 21 Июня, 2010 - 12:48:13
Новичок
Покинул форум
Сообщений всего: 31
Дата рег-ции: Июнь 2010
Помог: 0 раз(а)
JustUserR пишет:
Что касается запуска daemon-сервиса то подразумевается что у вас будет сетевой приложение которое будет работать в фоновом режиме и обрабатывать соединения - в таком случае PHP и Apache как таковые сообще не нужны
Всмысе... Как не нужны?
Сайт-то я делаю с помощью php, который есть модуль Apache. Разве не так?
JustUserR пишет:
При этом если ваша програма будет работать от имени привелегированного пользователя - то нужно позаботиться об интеграции модулей suexec или sudo для запуска непривелегирированных процессов или процессов от имени другого пользователя
Кто по сути является кем? Я так понимаю, что привилегированный пользователь - по сути админ либо root, одним словом системный. Непривилегированыый - любой зашедший на страничку в интернете?
JustUserR
Отправлено: 21 Июня, 2010 - 12:58:04
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
MoZart пишет:
Всмысе... Как не нужны?
Сайт-то я делаю с помощью php, который есть модуль Apache. Разве не так?
Во-первых PHP является обычной программой-интерпретатором работающей по протоколу CGI - и следовательно может работать хоть из командной строки в частности в консолькой CLI-версии Кроме того вы говорите что у вас есть большое приложение на C/C++ с собственной архитектурой - а PHP нужен лишь для вывода информации от этого приложения в web-виде - но ничто не мешает ему самому работать как web-серверу и выводить соответствующую инфомацию
MoZart пишет:
Кто по сути является кем? Я так понимаю, что привилегированный пользователь - по сути админ либо root, одним словом системный. Непривилегированыый - любой зашедший на страничку в интернете?
Здесь имеются в виду системные unix-пользователи - в общем случае это вообще не люди а работающие процессы и deamon-сервсиы К тому же все люди зашедние на web-страничку работают от имени одного и того же пользователя www-data - и сами по себе не имеют никакого доступа к системе вообще
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
MoZart
Отправлено: 21 Июня, 2010 - 14:04:51
Новичок
Покинул форум
Сообщений всего: 31
Дата рег-ции: Июнь 2010
Помог: 0 раз(а)
JustUserR пишет:
ничто не мешает ему самому работать как web-серверу и выводить соответствующую инфомацию
Немного конкретизирую. Существует многостраничный сайт. Он написан преимущественно на РНР. Теперь на нём делаются ещё 5 страниц, которые имеют поля типа img. На каждой странице есть хотя бы одно такое поле.
Страница 1. Просто отображение картинки. Картинка изменяется при обновлении страницы, которое происходит раз в минуту.
Статус - реализовано.
Способ реализации - написаный РНР скрипт, который по сути есть переписаный фрагмент ТОЙ МЕГАПРОГИ (далее МГП). Обращается к БД, производит вычисления, генерит картинку, выводит в окно браузера. Типа того.
Страница 2. Похоже на страницу 1. Отображение картинки в зависимости от выбраных посетителем сайта условий (checkbox). Соответственно при каждом условии сценарий разный. Картинка изменяется при обновлении страницы, которое происходит раз в минуту.
Статус - в процессе реализации
Способ реализации - РНР документ, который в зависимости от CASE выполняет одну из 3х ветвей кода, которые, как и в первом случае, являются фрагментами МГП.
Страница 3. Похоже на страницу 2, только ещё усложнили. Из БД забираются несколько значений, над которыми производятся вычисления. Вычисление объёмные. В результате получается порядка 200 значений, которые снова обрабатываются и выводятся в график. Сей график и должен отображаться на странице.
Статус - не реализована.
Причина - не найден способ реализации. Конечно можно перевести всё в РНР скрипт, как в первых 2х случаях, но это очень трудоёмкая работа, да и время выполнения такого скрипта у меня вызывает опасения (боюсь, что до нескольких минут). Тут основная головоломка.
Ещё 2 страницы - как третья.
Основная проблема в том, что страницы сайта должны быть интерактивными. И в зависимости от этого программа бы производила свои вычисления и выводила графический результат. Причём это явно задумывается для одновременного просмотра многими пользователями.
Как я понимаю, в идеале нужно примерно следующее. Пользователь заходит на сайт, лезет на определённую страничку и выбирает какие-то параметры. Исполняемый скрипт принимает эти параметры и передаёт их в МГП, которая запущена в качестве демона. Она в свою очередь что-то там творит и выдаёт поток изображения (не уверен, что правильно выразился). Именно это изображение скрипт выводит в браузер. Вот с этой ситуацие и связаны все мои вопросы ибо я не понимаю(зелёный я ещё), как это делается. Как это приложение интегрируется на страницу сайта?
Однако, как такая система поведёт себя при обращении 2х и более пользователей одновременно?
Если подключать библиотеку - это будет оочень медленно. Ведь скрипт будет ждать пока обработаются все данные. Это не выход.
И ещё дилетантский вопрос. Можно ли сделать следующим образом?
Создать дополнительную БД, в которую МГП будет записывать значения, необходимые только для построения графиков и генерирования картинок. Исполняющий скрипт обращается не к основной, а к дополнительной БД и сам генерит изображения. Это конечно не мгновенно, но явно быстрее ( до 5 секунд).
Если реализовывать так, не "засрётся" ли канал связи с дополнительной БД? Частота записи - несколько раз в секунду, частота чтения - не могу себе представить, зависит от количества народу на сайте.
Авторы МГП говорят, что это не выход. Но и переписывать прогу не хотят.
Если переделывать МГП как web-приложение, то как сохранить действующую структуру сайта? Что к чему присоединять?
Или может сделать по "тупому": создать несколько копий МГП, чтобы каждая копия выполняла только одну вычислительную функцию и на выходе имела результирующее изображение, к которому и будет обращаться скрипт?
Покинул форум
Сообщений всего: 114
Дата рег-ции: Июнь 2010
Помог: 0 раз(а)
п.3. можно сделать так
авторизованный пользователь задает параметры, они все пишутся в базу с идентификатором строки - его session номером
далее, МГП генерит разные изображения вида session+тип изображения.png
до генерации в этот файл записывается пустая картинка с текстом "оставайтесь на линии"
ну и последнее, простенький php отбражает ссылки вида <img src=session+тип изображения.png
МГП-же построчно читает из базы параметры для генерации и складывает картинки в папку
файлы допустим, суточной давности стирауются (man find)
imho
если что, пиши в личку спецификации, накидаю скрипты, делов на день
MoZart
Отправлено: 22 Июня, 2010 - 09:06:26
Новичок
Покинул форум
Сообщений всего: 31
Дата рег-ции: Июнь 2010
Помог: 0 раз(а)
qbik пишет:
авторизованный пользователь задает параметры, они все пишутся в базу с идентификатором строки - его session номером
Спасибо!
Жаль только, что до этого я сам додумался 2 дня назад, а разработчики МГП сказали что необходим другой подход... Самое интересное, что в этом случае даже не надо пользователей авторизовывать (это исходя из выводимых результатов МГП), можно и без этого обойтись, хотя я уже реализовал авторизацию. Да и замену картинок вроде тоже)))
Меня заинтересовал метод memcached. Если кто поможет разобраться, как эта штука работает, буду очень признателен. По этому методу есть вопрос: как я понял из того что прочитал, происходит обращение к оперативной памяти (КАК?), из которой считываются необходимые текущие параметры. Вот тут возникает интересная ситуация. МГП работает постоянно, ВСЕ переменные в ней ПОСТОЯННО переопределяются. Процесс рассчёта всего необходимого не мгновенный. Если пользователь зашёл на сайт и нажал на кнопку в тот момент, когда часть рассчётов уже переопределилась от предыдущего шага на нынешний, а часть нет, а часть вообще ещё накапливается различными итерационными методами и такие значения вкорне некорректны - так что же делать в этой ситуации? Как это обойти? Как получить корректные данные? Можно ли вообще это обойти?
И ещё вопросик чуть всторону. МГП пользуется БД Microsoft SQL Server. А РНР, как я понимаю, взаимодействует с MySQL. Как это совместить? Как из РНР подключиться к "НЕ_MySQL" БД?
Уважаемые эксперты. Мой предыдущий вопрос (тот трактат повыше от 21 Июня, 2010 - 14:04:51) является для меня таким же актуальным как и этот.
Покинул форум
Сообщений всего: 750
Дата рег-ции: Авг. 2009
Помог: 16 раз(а)
MoZart пишет:
И ещё вопросик чуть всторону. МГП пользуется БД Microsoft SQL Server. А РНР, как я понимаю, взаимодействует с MySQL. Как это совместить? Как из РНР подключиться к "НЕ_MySQL" БД?
Ну почему...
Есть к примеру:
- mssql_connect ( MS SQL server);
- pg_connect (PostgreSQL).
----- армия.. самое убогое место
MoZart
Отправлено: 22 Июня, 2010 - 11:52:27
Новичок
Покинул форум
Сообщений всего: 31
Дата рег-ции: Июнь 2010
Помог: 0 раз(а)
movEAX пишет:
MoZart пишет:
И ещё вопросик чуть всторону. МГП пользуется БД Microsoft SQL Server. А РНР, как я понимаю, взаимодействует с MySQL. Как это совместить? Как из РНР подключиться к "НЕ_MySQL" БД?
Ну почему...
Есть к примеру:
- mssql_connect ( MS SQL server);
- pg_connect (PostgreSQL).
Спасибо, movEAX!
Жду ещё Ваши коментарии, уважаемые эксперты. (Добавление)
movEAX пишет:
MoZart пишет:
И ещё вопросик чуть всторону. МГП пользуется БД Microsoft SQL Server. А РНР, как я понимаю, взаимодействует с MySQL. Как это совместить? Как из РНР подключиться к "НЕ_MySQL" БД?
Ну почему...
Есть к примеру:
- mssql_connect ( MS SQL server);
- pg_connect (PostgreSQL).
В ответ происходит следующее:
Fatal error: Call to undefined function mssql_connect() in W:\home\navtest1.ru\www\login.php on line 50
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
MoZart пишет:
Меня заинтересовал метод memcached. Если кто поможет разобраться, как эта штука работает, буду очень признателен. По этому методу есть вопрос: как я понял из того что прочитал, происходит обращение к оперативной памяти (КАК?), из которой считываются необходимые текущие параметры. Вот тут возникает интересная ситуация. МГП работает постоянно, ВСЕ переменные в ней ПОСТОЯННО переопределяются. Процесс рассчёта всего необходимого не мгновенный. Если пользователь зашёл на сайт и нажал на кнопку в тот момент, когда часть рассчётов уже переопределилась от предыдущего шага на нынешний, а часть нет, а часть вообще ещё накапливается различными итерационными методами и такие значения вкорне некорректны - так что же делать в этой ситуации? Как это обойти? Как получить корректные данные? Можно ли вообще это обойти?
При параллельной работе приложений всегда возникает проблемы с их синхронизацией - поэтому для этих целей используется определенные механизмы такие как transactions или message passing В любом случае использование обмена за счет оперативной памяти гораздо лучше чем использования файловой системы - ведь даже если произойдет обращеение к некоторой переменной в памяти то сначала ее запишет один процесс а только потом другой - в отличие от файла которые также вследстве буферазации может быть испорчен такой параллельной записью
Кроме того использование memcached вовсе не значит то все переменные в том числе расчетные должны храниться в нем - и если расчет занимает некоторое время то в его процессе никакие переменные в разделенной области памяти менять не надо - а вот когда расчеты закончены то полученные значения туда можно поместить причем мгновенно - например будет установки указателя на них
Также вы не уточняете один очень важный момент - а именно каким образом дейтсвия пользователя влияют на расчет Является ли его посещение страницы маркером начала новых расчетов - а также являются ли расчеты уникальными для каждого из пользователей В последнем случае проблемы с сихнронизацией почти нет - например пользователя загружает статическую HTML-страницы с JS-скриптом и Iframe-элементом для динамического обмена данными с сервером - и запрашивает определенный PHP-скрипт который смотрит некую переменную в memcached-области и транслирует пользователю данные
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
MoZart
Отправлено: 22 Июня, 2010 - 14:37:50
Новичок
Покинул форум
Сообщений всего: 31
Дата рег-ции: Июнь 2010
Помог: 0 раз(а)
JustUserR пишет:
Также вы не уточняете один очень важный момент - а именно каким образом дейтсвия пользователя влияют на расчет Является ли его посещение страницы маркером начала новых расчетов - а также являются ли расчеты уникальными для каждого из пользователей В последнем случае проблемы с сихнронизацией почти нет - например пользователя загружает статическую HTML-страницы с JS-скриптом и Iframe-элементом для динамического обмена данными с сервером - и запрашивает определенный PHP-скрипт который смотрит некую переменную в memcached-области и транслирует пользователю данные
Посещение пользователем страницы НЕ ЯВЛЯЕТСЯ маркером для начала новых вычислений. МГП должна работать всегда. Пользователь, в зависимости от того, куда он зашёл и что выбрал, запрашивает вывод лишь одного потока данных. Таким образом ему в принципе можно вывести уже сгенерированную программой картинку (но это нежелательно).
Меня интересуют следующие вопросы.
1. Что нужно прописать в МГП, чтобы она в нужный момент "выкидывала" значения в память? И как к ней обратиться из РНР, чтобы не было путаницы? Может в МГП сформировать массив данных, который в определённый момент "выдать" в память?
2. Можно ли реализовать механизм путём дополнительной БД (описывал в сообщении от 21 Июня, 2010 - 14:04:51)? Будет ли это корректно?
Также актуальным остался вопрос о подключении Ms SQL - прочитал много, толку мало.
Заранее спасибо.
JustUserR
Отправлено: 22 Июня, 2010 - 14:44:45
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
MoZart пишет:
Что нужно прописать в МГП, чтобы она в нужный момент "выкидывала" значения в память? И как к ней обратиться из РНР, чтобы не было путаницы? Может в МГП сформировать массив данных, который в определённый момент "выдать" в память?
В этом и заключается суть простого обмена данными между процессами - ведь в случае если данные модфицирует только один из них а второй просто считывает то не нужно огранизовывать никаких средств для синхронизации - просто ваша МПГ будет записывать данные в разделенную область памяти а PHP-скрипт будет считывать их в режиме реального времени
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.