• XSS.stack #1 – первый литературный журнал от юзеров форума

Выполнение php скрипта в delphi

one_deal

RAID-массив
Пользователь
Регистрация
14.12.2019
Сообщения
58
Реакции
5
Доброго времени суток!

Скачал архив с php интерпертатором, с официального сайта.

Передаю через командную строку имя php скрипта через delphi,
для выполнения, скрипт выполняется. Передаю get параметры, все ок.

Не могу понять, как отправлять и получать post параметры. Помогите пожалуйста.

Код:
var
  s: string;
begin
  s := Path('php\php.exe ');
  s := s + Path('index.php');
  s := s + //передаем параметры get
  TextToWebBrowser(WebBrowser1, GetDosOutput(s));
end.

function Path(s: string): string;
begin
  Result := PathAppend(ExtractFilePath(paramstr(0)), s);
end; //Path

function PathAppend(path, str: string): string;
begin
  if path[Length(path)] <> '\' then path := path + '\';
  result := path + str;
end; //PathAppend 

procedure TextToWebBrowser(WB: TWebBrowser; Text: string);
var             
  V: OleVariant;
  Document: IHTMLDocument2;
begin
   if WB.Document = nil then WB.Navigate('about:blank');
   while WB.Document = nil do Application.ProcessMessages;
   Document := WB.Document as IHtmlDocument2;
   V := VarArrayCreate([0, 0], varVariant);
   V[0] := Text;
   Document.Write(PSafeArray(TVarData(v).VArray));
   Document.Close;
end; //TextToWebBrowser

function GetDosOutput(DosApp: String): string;
const
  ReadBuffer = 2400;
var
  Buffer: PChar;
  BytesRead: DWord;
  Apprunning: DWord;     
  start: TStartUpInfo;   
  ReadPipe, WritePipe: THandle; 
  Security: TSecurityAttributes;
  ProcessInfo: TProcessInformation;
begin
  result := '';
 
  with Security do
  begin
    nlength := SizeOf(TSecurityAttributes);
    binherithandle := true;
    lpsecuritydescriptor := nil;
  end;

  if Createpipe(ReadPipe, WritePipe, @Security, 0) then
  begin
    Buffer  := AllocMem(ReadBuffer + 1);
    FillChar(Start,Sizeof(Start),#0);
    start.cb          := SizeOf(start);
    start.hStdOutput  := WritePipe;
    start.hStdInput   := ReadPipe;
    start.dwFlags     := STARTF_USESTDHANDLES +
                         STARTF_USESHOWWINDOW;
    start.wShowWindow := SW_HIDE;

    if CreateProcess(nil,
          PChar(DosApp),
          @Security,
          @Security,
          true,
          NORMAL_PRIORITY_CLASS,
          nil,
          nil,
          start,
          ProcessInfo)
    then
    begin
      repeat
        Apprunning := WaitForSingleObject(ProcessInfo.hProcess, 100);
        Application.ProcessMessages;
      until (Apprunning <> WAIT_TIMEOUT);
      repeat
        BytesRead := 0;
        ReadFile(ReadPipe, Buffer[0], ReadBuffer, BytesRead, nil);
        Buffer[BytesRead]:= #0;
       //OemToAnsi(Buffer,Buffer);
        result := result + String(Buffer);
      until (BytesRead < ReadBuffer);
    end;
    CloseHandle(ProcessInfo.hProcess);
    CloseHandle(ProcessInfo.hThread);
    CloseHandle(ReadPipe);
    CloseHandle(WritePipe);   
    FreeMem(Buffer);
  end;
end;
 
Хороший вопрос) Запустить несколько проектов на php, без привязки к браузеру, апачу и т.д.
 
Эмм?


Все новые слова сразу решили употребить в одном предложении?

Имел в виду, запустить php скрипт в своем exe, не используя другие программы, типа апача, браузеров и т.д.
 
В моем примере, если в php.exe передать параметры get запроса, все ок.
Не понятно как сделать с post запросом, например отправить туда данные формы.

Из предположений, может можно поднять свой сервер, или самому создавать сокет.
Не понятно что для этого нужно, и как это соединить вместе.
 
Последнее редактирование:
Имел в виду, запустить php скрипт в своем exe, не используя другие программы, типа апача, браузеров и т.д.
Если не хочется тащить сторонний веб сервер, то в php есть встроенный.
 
Имел в виду, запустить php скрипт в своем exe, не используя другие программы, типа апача, браузеров и т.д.
Технически - это возможно, практически - это х#йня. Есть интерпретаторы на delphi для разных языков, сейчас сразу не найду, но вот то, что валяется на гите и имеет множество ссылок: https://github.com/perevoznyk/php4delphi
Даже если мы будем интерпретировать часть кода - будут ошибки из-за ссылок. Такое прокатит, если каждый модуль независим.

Используйте контейнер. Можно заготовить массу контейнеров и разворачивать их быстро не имея при этом проблем с выполнением. Это просто и удобно.


Не понятно как сделать с post запросом, например отправить туда данные формы.
GET запросом можно также посылать параметры.

Из предположений, может можно поднять свой сервер, или самому создавать сокет.
Не понятно что для этого нужно, и как это соединить вместе.
Что по итогу вы хотите сделать и для чего это нужно?

Если не хочется тащить сторонний веб сервер, то в php есть встроенный.
Это просто CLI. Если у него дипломная работа - такое прокатит только в шараге какой-то.
 
>>GET запросом можно также посылать параметры. - можно пожалуйста по подробнее?

в проекте есть форма, которая передает данные методом post:
Код:
echo '<form class = "page" action = "index.php" method = "post">';

Скрипт принимает эти параметры таким образом:
Код:
if(isset($_POST['submit']))
    {
        $filename = $_POST['filename'];
        if(!empty($filename))
        {
            $content = trim($_POST['content']);
            if(!empty($content)) file_put_contents($filename, $content);
        }
    }

Была идея создавать текстовые файлы, например с расширением file1.post, в которых сохранять текст запроса,
потом скриптом перебирать файлы в дирректории, и если есть файлы с таким расширение созранять данные из них в переменную.

В get запросах передавать текст с именем файла, чтобы обойти ограничение на длину get запроса.

Только не понятно, как это сделать, например обработать отправку формы.

>>Технически - это возможно, практически - это х#йня. Есть интерпретаторы на delphi для разных языков, сейчас сразу не найду, но вот то, что валяется на гите и имеет множество ссылок: https://github.com/perevoznyk/php4delphi - есть портативные вебсерверы с php например https://usbwebserver.yura.mk.ua/, технически да возможно, не хочу использовать чужой код, об php4delphi знаю, проект немного сырой.

>>Используйте контейнер. Можно заготовить массу контейнеров и разворачивать их быстро не имея при этом проблем с выполнением. Это просто и удобно. - я так и делал, в том то и дело что не очень удобно.

>>Что по итогу вы хотите сделать и для чего это нужно? - понятно, что мой вопрос звучит как очередная попытка нуба создать какие-то элитные эльфийские технологии. У меня несколько проектов на php, которые я время от времени использую, сделаны в виде контейнеров,
в них каждый модуль независим, и вряд ли будут проблемы со ссылками. Недавно понял что все это можно упростить, если научиться
принимать параметры post передаваемые из форм. Вот и пытаюсь найти решение или какие-то идеи.
 
Ты извращенец? Ищи веб-сервер на дельфи, а пхп выкинь.
Этот сервер сможет пхп скипт выполнить? Нет.
 
Перешел по ссылке. Что из того, что там есть, относится к моему вопросу? В основе моего проекта php скрипт. Его надо интерпретировать и вывести результат в моей программе. О чем речь? pascalweb? WebBroker?
 
Попытаюсь объяснить, что это, и для чего нужно.

У меня есть несколько проектов на php, которые я время от времени
запускаю на портативном веб сервере Open Server'e, или Denver ( Apache + PHP).

Я понимаю, что то что я сейчас пишу, выглядит как полная ахинея.
Первое, что я сделал - задал себе вопросы "а нафига это нужно?"

Для того чтобы убедиться, запустил веб сервер на localhost, потом в своем exe загрузил localhost в WebBrowser,
в интерфейсе добавил несколько новых элементов, которые нельзя сделать на php, и понял что в моем случае must have.

В php скриптах каждый модуль независим, и вряд ли будут
проблемы со ссылками(я не использую PhpMyAdmin и СУБД).

И да, я понимаю что эта задача выглядит немного странно.
 
Была идея создавать текстовые файлы, например с расширением file1.post, в которых сохранять текст запроса,
потом скриптом перебирать файлы в дирректории, и если есть файлы с таким расширение созранять данные из них в переменную.
Че? Базы данных? Не, пфф, не слышали..зачем они нам?

есть портативные вебсерверы с php например https://usbwebserver.yura.mk.ua/,
Пахнет говном. Контейнер - вин, счет 2:0.

не хочу использовать чужой код,
А мой будешь использовать. Странный. И тебе стоит начать читать чужой код и учиться на нем.

проект немного сырой.
Он подошел к своему логическому завершению и не нуждается больше в обновлениях. Ты можешь посмотреть его и самостоятельно дописать все то, что тебе не хватает. Это хороший каркас, который сделали за тебя. Лепи - не хочу.

я так и делал, в том то и дело что не очень удобно.

Для того чтобы убедиться, запустил веб сервер на localhost, потом в своем exe загрузил localhost в WebBrowser,
в интерфейсе добавил несколько новых элементов, которые нельзя сделать на php, и понял что в моем случае must have.
Покажи.

я не использую PhpMyAdmin и СУБД
Плохо.


И да, я понимаю что эта задача выглядит немного странно.
Точно понимаешь? Я вот из всей темы ничего не понял. Человек сделал какаху на php, которая не использует никакую известную миру сему базу данных и какает под себя. Потом какой-то скрипт-чистильщик прилетает и подчищает за ним. Тут еще нарисовалась delphi и во все щели открывает бедный localhost через TWebBrowser, потом не сформированный текст пытается сформировать как нужно. Я пребываю в прострации после всего прочитанного.
Ты страдаешь конкретной херней. Все это можно и нужно переписать в таком случае на 1 язык и использовать его. И даже если выполнишь php код в delphi - ты вызовешь с вероятностью 90% ошибку при обращении к диску, так как твой код будет выполняться отдельно в своей виртуальной среде. Максимум, ты можешь использовать какие-то криптографические ф-ции в нем и отдавать конечный результат переменным. При интерпретации кода ты НЕ ПОЛУЧАЕШЬ 24/7 рабочий веб сервер. Он запускается лишь на 1 такт и после выполнения листинга - отваливается. Нет никакого смысле использовать это вообще, и на твоем текущем уровне даже думать рано о таком.
Твой единственный вариант для выхода - это использовать nodejs + sqlite. Первый собрать в exe не проблема и запускать тогда, и только тогда, когда он жизненно необходим.


Выкладывай все, что было сделано и пиши ТЗ. За бутылку виски может быть соглашусь посидеть.
 
Покажи.
 

Вложения

  • Новый точечный рисунок.jpg
    Новый точечный рисунок.jpg
    101.7 КБ · Просмотры: 18
deleted
 
Последнее редактирование:


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх