Поддержка PHP скриптов

Форум для обсуждения деталей разработки программы SAS.Планета

Модераторы: vdemidov, Tolik

Поддержка PHP скриптов

Сообщение zed » 28 мар 2011, 12:44

Набрёл случайно на интересную библиотеку: PHP4Delphi, которая позволяет без лишнего напряга прикрутить php скрипты к делфи.
Линк на загрузку:Download php4delphi.7.2.zip (1.7 MB) (в комплекте идут инструкции и примеры).

Небольшая цитата из readme:

Код: Выделить всё
PHP4Delphi library                       
PHP - Delphi interface and PHP extensions development framework                 

{ $Id: readme.txt,v 7.2 10/2009 delphi32 Exp $ }

PHP4Delphi is a Delphi interface to PHP for Delphi 5, 6, 7, Delphi 2005 - Delphi 2010

PHP4Delphi consists of 3 big subprojects:

1. PHP scripting (using PHP as a scripting language in Delphi applications)
PHP4Delphi allows to execute the PHP scripts within the Delphi program using
TpsvPHP component directly without a WebServer.
It is a PHP extension that enables you to write client-side GUI applications.
One of the goals behind it was to prove that PHP is a capable general-purpose scripting
language that is suited for more than just Web applications.
It is used by "Delphi for PHP" from CodeGear.

2. PHP extensions development framework (using Delphi to extend PHP functionality)
Visual Development Framework gives possibility to create custom PHP
Extensions using Delphi.
PHP extension, in the most basic of terms, is a set of instructions that is
designed to add functionality to PHP.

3. PHP4Applications (integrate PHP in any application)
Supports C, C++, Visual Basic, VBA, C#, Delphi, Delphi .NET, Visual Basic .NET etc.


More detail information available in php4Delphi manual php4Delphi.pdf

Что мне понравилось - с ним легко работать в run-time, т.е. его не нужно устанавливать в IDE (хотя, есть и такая возможность) и для базового функционала ему достаточно одной dll от php - php5ts.dll (правда, она весьма увесистая). Ну и нет статической зависимости от библиотек php как таковых - если php не установлен и соответствующей dll не найдено, приложение запускается и работает нормально (до момента вызова скрипта, конечно же).

Если вкратце, то всё что нужно, это создать/проинициализировать пару классов, указать файл скрипта который будем выполнять (а можно просто и строку из памяти), задать/предопределить (при желании) переменные, которые будут доступны в скрипте, выполнить и забрать результат :)

Набросал тестовую утилитку (модифицировал один из примеров), чтобы можно было по быстрому оценить возможности.
Вот момент предопределения переменных и получение результата (собственно, соль работы с компонентом):

Код: Выделить всё
// передаём необходимые параметры в скрипт:

    FPHP.Variables.Add.Name := 'url';
    FPHP.Variables.ByName('url').AsString := 'http://google.com/';

    FPHP.Variables.Add.Name := 'x';
    FPHP.Variables.ByName('x').AsInteger := 10;

    FPHP.Variables.Add.Name := 'y';
    FPHP.Variables.ByName('y').AsInteger := 20;

    FPHP.Variables.Add.Name := 'z';
    FPHP.Variables.ByName('z').AsInteger := 5;

    // выполняем
    FPHP.Execute;

    // забираем результат
    SetLength(tmp, FBody.Size);
    FBody.Read(tmp[1], FBody.Size); // тело ответа хранится в TMemoryStream

    Result := FHeaders + #13#10#13#10 + tmp;

А вот скрипт:

Код: Выделить всё
<?php 

   $body = '$url = '.$base_url."\r\n".
         '$x = '.$x."\r\n".
         '$y = '.$y."\r\n".
         '$z = '.$z."\r\n";
   
   header("HTTP/1.1 200 OK");
   header('Content-type: text/html');
   header('Content-length: '.StrLen($body) );
   header('Connection: Close');
   
   print $body;
?>

ну и результат на лицо (точнее в консоль :)):
phptest.jpg


php_test_src.zip
Исходники Delphi2007 (компонент прописан в конфигах по относительному пути)
(110.73 KiB) Скачиваний: 87

php_test.zip
Бинарник + test.php
(269.88 KiB) Скачиваний: 91

php5ts.rar
Для тех у кого не установлен php - положить php5ts.dll рядом с exe
(2.06 MiB) Скачиваний: 97


P.S. Собственно, почему и зачем я это всё тут написал: интересно мнение разработчиков по поводу возможности внедрения всего этого дела в SAS. Со своей стороны - готов принять участие во внедрении. А может и ещё кто заинтересуется?

P.P.S. Ах да, компонент бесплатный и full source.
Хитрости GoogleEarth - то, чего вы не знаете о гугле
Аватара пользователя
zed
Гуру
 
Сообщения: 2888
ICQ: 357167611
Зарегистрирован: 16 авг 2008, 20:21
Откуда: Беларусь, Могилёв
Благодарил (а): 89 раз.
Поблагодарили: 525 раз.

Re: Поддержка PHP скриптов

Сообщение vasketsov » 28 мар 2011, 14:51

На каждый тайл будет исполняться connect-disconnect из скрипта php?
vasketsov
Специалист
 
Сообщения: 901
Зарегистрирован: 25 июл 2009, 21:15
Благодарил (а): 0 раз.
Поблагодарили: 193 раз.

Re: Поддержка PHP скриптов

Сообщение zed » 28 мар 2011, 15:18

vasketsov писал(а):На каждый тайл будет исполняться connect-disconnect из скрипта php?

Т.е. "connect-disconnect"?

Как мне видится, как это можно использовать в SAS: в настройках zmp определить пункт включающий/отключающий поддержку скриптов для данной карты. Если поддержка включена - выполнять скрипт и забирать у него тайл, если выключена - ходить в интернет самостоятельно как и прежде. Это позволит закрыть хотелки типа: Невозможность определять headers сокетов и Невозможность использовать метод POST во встроенной качалке, которые в свою очередь направлены на борьбу с баном.
Хитрости GoogleEarth - то, чего вы не знаете о гугле
Аватара пользователя
zed
Гуру
 
Сообщения: 2888
ICQ: 357167611
Зарегистрирован: 16 авг 2008, 20:21
Откуда: Беларусь, Могилёв
Благодарил (а): 89 раз.
Поблагодарили: 525 раз.

Re: Поддержка PHP скриптов

Сообщение vasketsov » 28 мар 2011, 15:29

zed писал(а):Т.е. "connect-disconnect"?.....
...выполнять скрипт и забирать у него тайл

Коннект по tcp (на прокси или к сервису напрямую) открывается в скрипте (после выполнения скрипта он закрывается или подхватывается при выполнении нового скрипта) или программой (и как тогда передать коннект в скрипт)?

>Это позволит закрыть хотелки
Это-то понятно, вопрос только, какой ценой, может проще докрутить паскальскрипт на предмет хедеров.
vasketsov
Специалист
 
Сообщения: 901
Зарегистрирован: 25 июл 2009, 21:15
Благодарил (а): 0 раз.
Поблагодарили: 193 раз.

Re: Поддержка PHP скриптов

Сообщение zed » 28 мар 2011, 15:40

vasketsov писал(а):после выполнения скрипта он закрывается или подхватывается при выполнении нового скрипта

Закрывается, естественно.
Хитрости GoogleEarth - то, чего вы не знаете о гугле
Аватара пользователя
zed
Гуру
 
Сообщения: 2888
ICQ: 357167611
Зарегистрирован: 16 авг 2008, 20:21
Откуда: Беларусь, Могилёв
Благодарил (а): 89 раз.
Поблагодарили: 525 раз.

Re: Поддержка PHP скриптов

Сообщение vasketsov » 28 мар 2011, 16:20

zed писал(а):
vasketsov писал(а):после выполнения скрипта он закрывается или подхватывается при выполнении нового скрипта

Закрывается, естественно.

А раз так - значит столь дорогостоящая процедура как коннект будет выполняться на каждый тайл по одному разу. Чего в нормальной реализации хотелось бы избежать.

Кроме того, передача любого параметра по результатам выполнения скрипта (параметры ответа) в следующий запуск скрипта (для всяких динамических печенюшек и прочих вкусняшек) потенциально проблематична и по определению либо костылеобразна (если сериализацию и десериализацию выполнять все программы), либо ничем не проще нормального вкорячивания хедеров в паскальскрипт (всё равно необходимо резервировать параметры, которые читать в программе после выполнения скрипта и пропихивать в последующий запуск, фактически это и есть те же самые хедеры, вопрос только в их хранении между запусками скрипта). Другое дело, если скрипт php звать из паскальскрипта, но в этом случае очевидно паскальскрипт исполняется не на каждый тайл по разу, а один раз.
vasketsov
Специалист
 
Сообщения: 901
Зарегистрирован: 25 июл 2009, 21:15
Благодарил (а): 0 раз.
Поблагодарили: 193 раз.

Re: Поддержка PHP скриптов

Сообщение zed » 28 мар 2011, 16:32

vasketsov писал(а):А раз так - значит столь дорогостоящая процедура как коннект будет выполняться на каждый тайл по одному разу. Чего в нормальной реализации хотелось бы избежать.

Я на 99% уверен, что и сейчас сас открывает новое соединение каждый раз при загрузке нового тайла. Не такая уж это и дорогостоящая процедура, чтоб заради неё отказаться от php.
vasketsov писал(а):Кроме того, передача любого параметра по результатам выполнения скрипта (параметры ответа) в следующий запуск скрипта (для всяких динамических печенюшек и прочих вкусняшек) потенциально проблематична

Да нету тут проблем: с лёгкостью можно ввести n переменных любого типа (на стадии проектирования), которые будут доступны скрипту для модификации. Скажем, сохранить строку с куки и заново передать её скрипту при следующем вызове проблем не вызывает.
Хитрости GoogleEarth - то, чего вы не знаете о гугле
Аватара пользователя
zed
Гуру
 
Сообщения: 2888
ICQ: 357167611
Зарегистрирован: 16 авг 2008, 20:21
Откуда: Беларусь, Могилёв
Благодарил (а): 89 раз.
Поблагодарили: 525 раз.

Re: Поддержка PHP скриптов

Сообщение vasketsov » 28 мар 2011, 17:14

zed писал(а):Я на 99% уверен, что и сейчас сас открывает новое соединение каждый раз при загрузке нового тайла

Проверять не побегу, но то, что сейчас именно так, не значит, что это правильно.

zed писал(а):Не такая уж это и дорогостоящая процедура, чтоб заради неё отказаться от php

Скажем немного по-другому:
а) если сейчас на каждый тайл создаётся и убивается по коннекту, то php в этом плане (коннект на тайл) ничего не изменит, если же нет - все подобные скриптовые расширения потенциально мертворожденные (до нормального вкорячивания хедеров в паскальскрипт);
б) если смысл прикручивания внешних подобных скриптов исключительно в генерации и обработке параметров запроса (в расширенном смысле), то это также наталкивает на мысли о мертворожденности (до нормального вкорячивания хедеров в паскальскрипт);
в) можно ли где-то ещё применить сторонние скрипты - другой вопрос.

zed писал(а):с лёгкостью можно ввести n переменных любого типа (на стадии проектирования), которые будут доступны скрипту для модификации

Дело в том, что публикация глобальных переменных и функций в паскальскрипте немногим проще публикации свойств объектов, имеющих геттеры и сеттеры, и даже полностью все свойства (интерфейс) объекта публиковать не надо. Но это не сделано. А раз так, то это проблема политическая, и техническими методами не решается по определению. Как вариант - представьте себе, что уже сейчас есть простейшие неклассовые функции типа SetHeader() и GetHeader() для обработки хедера по имени, и всё отдано на откуп автору zmp. Даже неизвестно, что проще в программе сделать, это сразу прямо или заранее неизвестное количество зарезервированных параметров вариантного типа как костыль для работы с хедерами.

зы. Передача параметров от запуска к запуску скрипта (любого) сама по себе отдельная вещь и не связана напрямую именно с php или хедерами. Вещь интересная и простая, я как-то делал аналогичную по сути феньку через простой стринглист, простые параметры совал в строку (по имени), объекты - в объекты.
vasketsov
Специалист
 
Сообщения: 901
Зарегистрирован: 25 июл 2009, 21:15
Благодарил (а): 0 раз.
Поблагодарили: 193 раз.

Re: Поддержка PHP скриптов

Сообщение zed » 28 мар 2011, 17:55

Вопрос в том, что внутрях SAS универсальная качалка, а для некоторых сервисов желателен всё же индивидуальный подход. И насколько мне известно, разработчики SAS принципиально не идут на индивидуальность, оставляя это дело гипотетическим плагинам, ждать которых ещё неизвестно сколько. Поэтому, сомневаюсь что будет какое-либо "нормальное вкорячивание" хидеров через паскалевские скрипты. И кстати, а что делать если нужно юзать POST запросы для получения кукей?

Я же предлагаю не ждать плагинов, а уже в следующей версии SAS прикрутить php. Смысл в том, что можно прикрутить свою качалку тайлов вместо универсальной сасовской, со всеми её ограничениями. И будет оно работать ровно до того момента, пока не появятся плагины. А может и дальше, а может и вообще не будет, судя по активности разработчиков в этой теме...

У некоторых пользователей работают различные костыли вроде проксей с теми же неповоротливыми скриптами. Но это только у некоторых (не каждый готов заморачиваться этим), а если же сделать поддержку php + написать скриптов для "проблемных" сервисов, то будет работать у всех.

По поводу переменных - достаточно завести одну строковую переменную и хранить в ней всё что надо (а надо, имхо, только куки - все остальные хидеры определяются в скрипте в design-time).
Хитрости GoogleEarth - то, чего вы не знаете о гугле
Аватара пользователя
zed
Гуру
 
Сообщения: 2888
ICQ: 357167611
Зарегистрирован: 16 авг 2008, 20:21
Откуда: Беларусь, Могилёв
Благодарил (а): 89 раз.
Поблагодарили: 525 раз.

Re: Поддержка PHP скриптов

Сообщение vasketsov » 28 мар 2011, 19:11

zed писал(а):что делать если нужно юзать POST запросы для получения кукей?

Если необходим дополнительный post-запрос, очевидно, его необходимо исполнить и взвести некий признак того, что больше этого делать не надо (на формат ответа в общем случае нельзя полагаться). Чем именно его исполнять - вопрос опять же упирается в полититку разработчиков, то есть, это не технический вопрос. Можно из скрипта попросить это сделать программу, а можно самому из скрипта его выполнить.

zed писал(а):Я же предлагаю не ждать плагинов, а уже в следующей версии SAS прикрутить php

А почему-то есть обоснованное мнение, что (не)прикручивание сторонних скриптов - менее политическая проблема, чем хедеры в паскальскрипте? Сколь бы ни было проще испускать запросы с нужными параметрами на php или perl по сравнению с паскальскриптом, вопрос с прикручиванием сторонних скриптов возник тоже не в этой теме, и пока что ответ был только типа "не в этой жизни".

zed писал(а):пока не появятся плагины

Есть стойкая уверенность, что надежда на реализацию плагинов в данной ситуации не поможет. Пока что разработка плагинов в программе - некая вещь в себе, и никуда не материализуется, потому что у разработчиков есть проблемы с пониманием того, что они хотят видеть в плагинах, а что нет. Это видно по некоторым ответам, когда речь идёт о реализации чего-нибудь через плагины, тогда как работа по реализации этого непосредственно в программе проще, чем даже докрутить программу на предмет существования плагинов подобного типа. Так что я бы про плагины забыл вообще и навсегда.

zed писал(а):По поводу переменных - достаточно завести одну строковую переменную и хранить в ней всё что надо (а надо, имхо, только куки - все остальные хидеры определяются в скрипте в design-time).

На моей памяти 99% допущений типа "это достаточно" или "такого не может быть никогда" нарушались довольно быстро. Впрочем, на худой конец динамические параметры можно через файлы передавать между скриптами на php или perl-е, файл будет постоянно болтаться в кэше и проиводительность не просядет. А может это и не столь худой конец получится, ибо браузеры те же куки тоже где-то хранят на диске.
vasketsov
Специалист
 
Сообщения: 901
Зарегистрирован: 25 июл 2009, 21:15
Благодарил (а): 0 раз.
Поблагодарили: 193 раз.

След.

Вернуться в Раздел для разработчиков программы SAS.Планета

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1