Добрый день!
PHP я занимаюсь недавно. Так вот, появилась следующая проблема.
Существует трудоёмкая и довольно тяжеловесная программа, написанная на С++. Программа оочень активно использует базы данных, различные вычисления, сложные графические выводы... Да ещё и работает постоянно в режиме реального времени...
Существует задача создать сайт, отображающий результаты работы этой программы.
В связи с этим вот такой вопрос: каким образом это можно сделать?
Понимаю, что такой вопрос слишком общий, поэтому попытаюсь его конкретизиромать массивом вопросов поменьше и поконкретней...
1. Можно ли на сервере запустить эту программу?
2. Можно ли обращаться к этой программе из РНР скрипта?
3. Можно ли подключить к скрипту скомпилированную DLL, содержащую в себе сложные вычислительные алгоритмы, чтобы не переписывать их в скрипты?
4. Если можно, то как это сделать?
5. Каким ещё способом можно подключить внешние алгоритмы?
Если ответы на первые 5 вопросов "нет", то
6. Неужели необходимо переписывать все вычислительные алгоритмы в РНР скрипты и только тогда использовать? Длина кодов измеряется километрами, Число таблиз базы данных - сотнями. Если всё переписать в РНР и при каждом обращении производить все запросы и вычисления, то, как мне кажется, база данных загнётся, а обновление страницы будет жутко долгим... Если же есть возможность как-то подключить внешнюю программу, то это уменьшит разного рода затраты, ибо 70% параметров, запрашиваемых из базы данных, она хранит в своей памяти.
Не уверен, что понятно объяснил... Просто ОООчень нужна помощь!
Заранее спасибо за ответы.
1. MoZart - 18 Июня, 2010 - 17:19:05 - перейти к сообщению
2. Мелкий - 18 Июня, 2010 - 17:27:40 - перейти к сообщению
exec и компания далее по сссылкам.
Замечу, что по дефолту скрипт будет ждать завершения вызванной программы и если программа представляет собой что-то типа демона, то ей понадобится программный интерфейс (файлы, сокеты), через который с ней можно будет общаться.
Замечу, что по дефолту скрипт будет ждать завершения вызванной программы и если программа представляет собой что-то типа демона, то ей понадобится программный интерфейс (файлы, сокеты), через который с ней можно будет общаться.
3. JustUserR - 19 Июня, 2010 - 10:52:21 - перейти к сообщению
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-сервер сразу будет заточен под необходимые цели
4. MoZart - 21 Июня, 2010 - 11:40:53 - перейти к сообщению
JustUserR пишет:
Если вы хотите подключить к PHP-скрипту определенную dll-библиотеку то это возможно например с помощью функции http://php.su/functions/?dl - но в таком случае расширение конечно же должно быть написано с учетом соответствующего API
Можно поподробнее объяснить этот пункт? Что значит учёт API?
(Добавление)
JustUserR пишет:
Если продразумевается что ваша программа работает как daemon-сервис то есть непрерывно в фоновом режиме - то вы можете обмениваться данными между ней и PHP-скриптом быстрым способом типа memcached
Скорее всего это и подразумевается. С методом memcached я ещё не работал. Исходя из документации, которую я видел, не совсем понятно, как это работает. Поясните, пожалуйста, архитектуру этого метода и, если не затруднит, реализацию.
Кстати, как запустить daemon-сервис на сервере. Я с этим ещё не сталкивался.
Заранее спасибо.
5. JustUserR - 21 Июня, 2010 - 12:26:08 - перейти к сообщению
MoZart пишет:
Дело в том что интерпретатор 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 Можно поподробнее объяснить этот пункт? Что значит учёт API?
MoZart пишет:
Пожалуйста! Использование сервиса 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 Скорее всего это и подразумевается. С методом memcached я ещё не работал. Исходя из документации, которую я видел, не совсем понятно, как это работает. Поясните, пожалуйста, архитектуру этого метода и, если не затруднит, реализацию.
Кстати, как запустить daemon-сервис на сервере. Я с этим ещё не сталкивался.
Заранее спасибо.
Кстати, как запустить daemon-сервис на сервере. Я с этим ещё не сталкивался.
Заранее спасибо.
Что касается запуска daemon-сервиса то подразумевается что у вас будет сетевой приложение которое будет работать в фоновом режиме и обрабатывать соединения - в таком случае PHP и Apache как таковые сообще не нужны При этом если ваша програма будет работать от имени привелегированного пользователя - то нужно позаботиться об интеграции модулей suexec или sudo для запуска непривелегирированных процессов или процессов от имени другого пользователя
6. MoZart - 21 Июня, 2010 - 12:48:13 - перейти к сообщению
JustUserR пишет:
Что касается запуска daemon-сервиса то подразумевается что у вас будет сетевой приложение которое будет работать в фоновом режиме и обрабатывать соединения - в таком случае PHP и Apache как таковые сообще не нужны
Всмысе... Как не нужны?
Сайт-то я делаю с помощью php, который есть модуль Apache. Разве не так?
JustUserR пишет:
При этом если ваша програма будет работать от имени привелегированного пользователя - то нужно позаботиться об интеграции модулей suexec или sudo для запуска непривелегирированных процессов или процессов от имени другого пользователя
Кто по сути является кем? Я так понимаю, что привилегированный пользователь - по сути админ либо root, одним словом системный. Непривилегированыый - любой зашедший на страничку в интернете?
7. JustUserR - 21 Июня, 2010 - 12:58:04 - перейти к сообщению
MoZart пишет:
Во-первых PHP является обычной программой-интерпретатором работающей по протоколу CGI - и следовательно может работать хоть из командной строки в частности в консолькой CLI-версии Кроме того вы говорите что у вас есть большое приложение на C/C++ с собственной архитектурой - а PHP нужен лишь для вывода информации от этого приложения в web-виде - но ничто не мешает ему самому работать как web-серверу и выводить соответствующую инфомациюВсмысе... Как не нужны?
Сайт-то я делаю с помощью php, который есть модуль Apache. Разве не так?
Сайт-то я делаю с помощью php, который есть модуль Apache. Разве не так?
MoZart пишет:
Здесь имеются в виду системные unix-пользователи - в общем случае это вообще не люди а работающие процессы и deamon-сервсиы К тому же все люди зашедние на web-страничку работают от имени одного и того же пользователя www-data - и сами по себе не имеют никакого доступа к системе вообще
Кто по сути является кем? Я так понимаю, что привилегированный пользователь - по сути админ либо root, одним словом системный. Непривилегированыый - любой зашедший на страничку в интернете?
8. MoZart - 21 Июня, 2010 - 14:04:51 - перейти к сообщению
JustUserR пишет:
ничто не мешает ему самому работать как web-серверу и выводить соответствующую инфомацию
Немного конкретизирую. Существует многостраничный сайт. Он написан преимущественно на РНР. Теперь на нём делаются ещё 5 страниц, которые имеют поля типа img. На каждой странице есть хотя бы одно такое поле.
Страница 1. Просто отображение картинки. Картинка изменяется при обновлении страницы, которое происходит раз в минуту.
Статус - реализовано.
Способ реализации - написаный РНР скрипт, который по сути есть переписаный фрагмент ТОЙ МЕГАПРОГИ (далее МГП). Обращается к БД, производит вычисления, генерит картинку, выводит в окно браузера. Типа того.
Страница 2. Похоже на страницу 1. Отображение картинки в зависимости от выбраных посетителем сайта условий (checkbox). Соответственно при каждом условии сценарий разный. Картинка изменяется при обновлении страницы, которое происходит раз в минуту.
Статус - в процессе реализации
Способ реализации - РНР документ, который в зависимости от CASE выполняет одну из 3х ветвей кода, которые, как и в первом случае, являются фрагментами МГП.
Страница 3. Похоже на страницу 2, только ещё усложнили. Из БД забираются несколько значений, над которыми производятся вычисления. Вычисление объёмные. В результате получается порядка 200 значений, которые снова обрабатываются и выводятся в график. Сей график и должен отображаться на странице.
Статус - не реализована.
Причина - не найден способ реализации. Конечно можно перевести всё в РНР скрипт, как в первых 2х случаях, но это очень трудоёмкая работа, да и время выполнения такого скрипта у меня вызывает опасения (боюсь, что до нескольких минут). Тут основная головоломка.
Ещё 2 страницы - как третья.
Основная проблема в том, что страницы сайта должны быть интерактивными. И в зависимости от этого программа бы производила свои вычисления и выводила графический результат. Причём это явно задумывается для одновременного просмотра многими пользователями.
Как я понимаю, в идеале нужно примерно следующее. Пользователь заходит на сайт, лезет на определённую страничку и выбирает какие-то параметры. Исполняемый скрипт принимает эти параметры и передаёт их в МГП, которая запущена в качестве демона. Она в свою очередь что-то там творит и выдаёт поток изображения (не уверен, что правильно выразился). Именно это изображение скрипт выводит в браузер. Вот с этой ситуацие и связаны все мои вопросы ибо я не понимаю(зелёный я ещё), как это делается. Как это приложение интегрируется на страницу сайта?
Однако, как такая система поведёт себя при обращении 2х и более пользователей одновременно?
Если подключать библиотеку - это будет оочень медленно. Ведь скрипт будет ждать пока обработаются все данные. Это не выход.
И ещё дилетантский вопрос. Можно ли сделать следующим образом?
Создать дополнительную БД, в которую МГП будет записывать значения, необходимые только для построения графиков и генерирования картинок. Исполняющий скрипт обращается не к основной, а к дополнительной БД и сам генерит изображения. Это конечно не мгновенно, но явно быстрее ( до 5 секунд).
Если реализовывать так, не "засрётся" ли канал связи с дополнительной БД? Частота записи - несколько раз в секунду, частота чтения - не могу себе представить, зависит от количества народу на сайте.
Авторы МГП говорят, что это не выход. Но и переписывать прогу не хотят.
Если переделывать МГП как web-приложение, то как сохранить действующую структуру сайта? Что к чему присоединять?
Или может сделать по "тупому": создать несколько копий МГП, чтобы каждая копия выполняла только одну вычислительную функцию и на выходе имела результирующее изображение, к которому и будет обращаться скрипт?
9. qbik - 21 Июня, 2010 - 23:13:47 - перейти к сообщению
п.3. можно сделать так
авторизованный пользователь задает параметры, они все пишутся в базу с идентификатором строки - его session номером
далее, МГП генерит разные изображения вида session+тип изображения.png
до генерации в этот файл записывается пустая картинка с текстом "оставайтесь на линии"
ну и последнее, простенький php отбражает ссылки вида <img src=session+тип изображения.png
МГП-же построчно читает из базы параметры для генерации и складывает картинки в папку
файлы допустим, суточной давности стирауются (man find)
п.1. МГП перезаписывает файл main.png страница 1 содержит ссылку <img src=session+тип изображения.png
п.2 идентично п.3
imho
если что, пиши в личку спецификации, накидаю скрипты, делов на день
авторизованный пользователь задает параметры, они все пишутся в базу с идентификатором строки - его session номером
далее, МГП генерит разные изображения вида session+тип изображения.png
до генерации в этот файл записывается пустая картинка с текстом "оставайтесь на линии"
ну и последнее, простенький php отбражает ссылки вида <img src=session+тип изображения.png
МГП-же построчно читает из базы параметры для генерации и складывает картинки в папку
файлы допустим, суточной давности стирауются (man find)
п.1. МГП перезаписывает файл main.png страница 1 содержит ссылку <img src=session+тип изображения.png
п.2 идентично п.3
imho
если что, пиши в личку спецификации, накидаю скрипты, делов на день
10. MoZart - 22 Июня, 2010 - 09:06:26 - перейти к сообщению
qbik пишет:
авторизованный пользователь задает параметры, они все пишутся в базу с идентификатором строки - его session номером
Спасибо!
Жаль только, что до этого я сам додумался 2 дня назад, а разработчики МГП сказали что необходим другой подход... Самое интересное, что в этом случае даже не надо пользователей авторизовывать (это исходя из выводимых результатов МГП), можно и без этого обойтись, хотя я уже реализовал авторизацию. Да и замену картинок вроде тоже)))
Меня заинтересовал метод memcached. Если кто поможет разобраться, как эта штука работает, буду очень признателен. По этому методу есть вопрос: как я понял из того что прочитал, происходит обращение к оперативной памяти (КАК?), из которой считываются необходимые текущие параметры. Вот тут возникает интересная ситуация. МГП работает постоянно, ВСЕ переменные в ней ПОСТОЯННО переопределяются. Процесс рассчёта всего необходимого не мгновенный. Если пользователь зашёл на сайт и нажал на кнопку в тот момент, когда часть рассчётов уже переопределилась от предыдущего шага на нынешний, а часть нет, а часть вообще ещё накапливается различными итерационными методами и такие значения вкорне некорректны - так что же делать в этой ситуации? Как это обойти? Как получить корректные данные? Можно ли вообще это обойти?
И ещё вопросик чуть всторону. МГП пользуется БД Microsoft SQL Server. А РНР, как я понимаю, взаимодействует с MySQL. Как это совместить? Как из РНР подключиться к "НЕ_MySQL" БД?
Уважаемые эксперты. Мой предыдущий вопрос (тот трактат повыше от 21 Июня, 2010 - 14:04:51) является для меня таким же актуальным как и этот.
Заранее спасибо за вашу помощь!
11. movEAX - 22 Июня, 2010 - 11:00:18 - перейти к сообщению
MoZart пишет:
И ещё вопросик чуть всторону. МГП пользуется БД Microsoft SQL Server. А РНР, как я понимаю, взаимодействует с MySQL. Как это совместить? Как из РНР подключиться к "НЕ_MySQL" БД?
Ну почему...
Есть к примеру:
- mssql_connect ( MS SQL server);
- pg_connect (PostgreSQL).
12. MoZart - 22 Июня, 2010 - 11:52:27 - перейти к сообщению
movEAX пишет:
Ну почему...
Есть к примеру:
- mssql_connect ( MS SQL server);
- pg_connect (PostgreSQL).
MoZart пишет:
И ещё вопросик чуть всторону. МГП пользуется БД Microsoft SQL Server. А РНР, как я понимаю, взаимодействует с MySQL. Как это совместить? Как из РНР подключиться к "НЕ_MySQL" БД?
Ну почему...
Есть к примеру:
- mssql_connect ( MS SQL server);
- pg_connect (PostgreSQL).
Спасибо, movEAX!
Жду ещё Ваши коментарии, уважаемые эксперты.
(Добавление)
movEAX пишет:
Ну почему...
Есть к примеру:
- mssql_connect ( MS SQL server);
- pg_connect (PostgreSQL).
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
Почему?
13. JustUserR - 22 Июня, 2010 - 14:04:18 - перейти к сообщению
MoZart пишет:
При параллельной работе приложений всегда возникает проблемы с их синхронизацией - поэтому для этих целей используется определенные механизмы такие как transactions или message passing В любом случае использование обмена за счет оперативной памяти гораздо лучше чем использования файловой системы - ведь даже если произойдет обращеение к некоторой переменной в памяти то сначала ее запишет один процесс а только потом другой - в отличие от файла которые также вследстве буферазации может быть испорчен такой параллельной записьюМеня заинтересовал метод memcached. Если кто поможет разобраться, как эта штука работает, буду очень признателен. По этому методу есть вопрос: как я понял из того что прочитал, происходит обращение к оперативной памяти (КАК?), из которой считываются необходимые текущие параметры. Вот тут возникает интересная ситуация. МГП работает постоянно, ВСЕ переменные в ней ПОСТОЯННО переопределяются. Процесс рассчёта всего необходимого не мгновенный. Если пользователь зашёл на сайт и нажал на кнопку в тот момент, когда часть рассчётов уже переопределилась от предыдущего шага на нынешний, а часть нет, а часть вообще ещё накапливается различными итерационными методами и такие значения вкорне некорректны - так что же делать в этой ситуации? Как это обойти? Как получить корректные данные? Можно ли вообще это обойти?
Кроме того использование memcached вовсе не значит то все переменные в том числе расчетные должны храниться в нем - и если расчет занимает некоторое время то в его процессе никакие переменные в разделенной области памяти менять не надо - а вот когда расчеты закончены то полученные значения туда можно поместить причем мгновенно - например будет установки указателя на них
Также вы не уточняете один очень важный момент - а именно каким образом дейтсвия пользователя влияют на расчет Является ли его посещение страницы маркером начала новых расчетов - а также являются ли расчеты уникальными для каждого из пользователей В последнем случае проблемы с сихнронизацией почти нет - например пользователя загружает статическую HTML-страницы с JS-скриптом и Iframe-элементом для динамического обмена данными с сервером - и запрашивает определенный PHP-скрипт который смотрит некую переменную в memcached-области и транслирует пользователю данные
14. MoZart - 22 Июня, 2010 - 14:37:50 - перейти к сообщению
JustUserR пишет:
Также вы не уточняете один очень важный момент - а именно каким образом дейтсвия пользователя влияют на расчет Является ли его посещение страницы маркером начала новых расчетов - а также являются ли расчеты уникальными для каждого из пользователей В последнем случае проблемы с сихнронизацией почти нет - например пользователя загружает статическую HTML-страницы с JS-скриптом и Iframe-элементом для динамического обмена данными с сервером - и запрашивает определенный PHP-скрипт который смотрит некую переменную в memcached-области и транслирует пользователю данные
Посещение пользователем страницы НЕ ЯВЛЯЕТСЯ маркером для начала новых вычислений. МГП должна работать всегда. Пользователь, в зависимости от того, куда он зашёл и что выбрал, запрашивает вывод лишь одного потока данных. Таким образом ему в принципе можно вывести уже сгенерированную программой картинку (но это нежелательно).
Меня интересуют следующие вопросы.
1. Что нужно прописать в МГП, чтобы она в нужный момент "выкидывала" значения в память? И как к ней обратиться из РНР, чтобы не было путаницы? Может в МГП сформировать массив данных, который в определённый момент "выдать" в память?
2. Можно ли реализовать механизм путём дополнительной БД (описывал в сообщении от 21 Июня, 2010 - 14:04:51)? Будет ли это корректно?
Также актуальным остался вопрос о подключении Ms SQL - прочитал много, толку мало.
Заранее спасибо.
15. JustUserR - 22 Июня, 2010 - 14:44:45 - перейти к сообщению
MoZart пишет:
В этом и заключается суть простого обмена данными между процессами - ведь в случае если данные модфицирует только один из них а второй просто считывает то не нужно огранизовывать никаких средств для синхронизации - просто ваша МПГ будет записывать данные в разделенную область памяти а PHP-скрипт будет считывать их в режиме реального времени
Что нужно прописать в МГП, чтобы она в нужный момент "выкидывала" значения в память? И как к ней обратиться из РНР, чтобы не было путаницы? Может в МГП сформировать массив данных, который в определённый момент "выдать" в память?