Wątek przeniesiony 2016-10-06 02:13 z Newbie przez furious programming.

Komunikacja między PHP a Delphi - pomysły?

0

Jak można wysłać polecenie z poziomu PHP do programu w Delphi? Myślałem po prostu o bazie SQL, żeby PHP dodawał rekord do bazy, a Delphi odczytywał co 1 sec tabelę z rekordami i jak natrafi na nowy to wykonuje jakieś działanie. Wiem, że to kiepski pomysł i szukam innego rozwiązania. Po prostu wystarczy przesłać jakiś tekst z PHP, a Delphi na innym komputerze ten tekst odbiera i coś wykonuje. Jakieś pomysły?

0

Jeśli obydwa komputery znajdują się w tej samej sieci, bez problemu można wykorzystać do tego celu sockety.

0

Najważniejsze pytanie czy skrypt PHP i program w Delphi są uruchomione na tym samym komputerze, czy PHP wykonuje się na jakimś zewnętrznym serwerze a Ty chcesz przekazać coś do programu u siebie na kompie?

0

Są to dwa różne komputery ale w tej samej sieci lokalnej. Jak skomunikować się poprzez sockety?

0

Nie można po prostu wystawić jakiegoś API ?

2

W Delphi wystawić webservice i niech PHP do niego woła. Z doświadczenia wiem, że integracja przez baze danych jest kiepska, sprawia problemy.

0

Skoro to jedna sieć to tworzenie webservice aby przekazać jakiś "tekst" do aplikacji jest wyciąganiem armaty na komara ... używając socketów jak @Patryk27 pisał da się to zrobić szybko i bezproblemowo. Nawet nie znając adresu można wykorzystać UDP i odpowiednio "rozgłaszać" komunikat na konkretnym porcie do wszystkich aplikacji w delphi.
Odpowiadając na pytanie pytacza jak:
http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_11

0
Zimny Pomidor napisał(a):

Jakieś pomysły?

Zależy co ma się dziać, czy to po prostu przesłanie zdarzenia czy większa logika?
Tylko zdarzenie - użyj MQTT (na pewno wygoglujesz co i jak) lub WebSocket, jeśli to ma iść z klienta (AJAX), ale MQTT ma też swoją implementację w JS/TypeScript.
Jeśli coś więcej, to serwer aplikacyjny oparty o REST - np. mORMot.

0

Ostatnio postawiłem na docelowym komputerze prosty serwer rest na express node..js Z bazą można komunikować się wykorzystując moduł bazy w node np (mysql-node) lub wywołując consolę PHP. W odpowiedzi pobierasz obiekt json.
pozdrawiam
AK

0

Ostatnio postawiłem na docelowym komputerze prosty serwer rest na express node..js
Z bazą można komunikować się wykorzystując moduł bazy w node np (mysql-node)
lub wywołując consolę PHP. W odpowiedzi pobierasz obiekt json.

Powyższy post pisałem z komórki bez logowania, dlatego nie mogę go edytować. Zamieszczę fragment routingu z modułu REST.JS :

var execPhp = require('exec-php');
const util = require('util');
var path_to_php_exe = "/usr/bin/php";
var path_to_php_script = "/var/www/node-rest/php-scripts/php-shuffle-gen.php";
 
 
function REST_ROUTER(router,connection,md5) {
    var self = this;
    self.handleRoutes(router,connection,md5);
}
 
REST_ROUTER.prototype.handleRoutes= function(router,connection,md5) {
    router.get("/",function(req,res){
        res.send('root');
    })
 
    router.get("/show/:what",function(req,res){
       var query="";
        query = "SHOW "+req.params.what;
        connection.query(query,function(err,rows){
            if(err) {
                res.json({"Error" : true,"errMsg": err, "Message" : "Error executing MySQL query:"+query});
            } else {
                res.json({"Error" : false, "Message" : "Success", "Show" : rows});
            }
        });        
    })
 
    router.get("/generate/:numall/:inrow/:rows",function(req,res){
        execPhp(path_to_php_script, path_to_php_exe, function(error, php, output){
            php.php_shuffle_gen(req.params.numall, req.params.inrow, req.params.rows, function(error, result, output, printed){
            res.json({"Error" : error, "Message" : "Success","Output":output,"Printed":printed,"result" : result });
            });
        });
    });
....

masz tu przykład dwu metod routingu zapytań :

  1. router.get("/show/:what", - wywołuje bezposrednio zapytanie z modułu node "mysql"
  2. router.get("/generate/:numall/:inrow/:rows" - wywołuje skrypt php, wywołuje skrypt php korzystając z modułu node "exec-php"

zamieszczę ponizej zawartość paczki instalacyjnej node : package.json

{
  "name": "RESTful-API",
  "version": "0.0.1",
  "scripts": {
    "start": "node server.js"
  },
  "dependencies": {
    "MD5": "~1.2.1",
    "body-parser": "~1.12.0",
    "exec-php": "0.0.3",
    "express": "~4.12.2",
    "mysql": "~2.5.5",
    "util": "^0.10.3"
  }
}

pozdrawiam
AK

2

Olej TCP/IP (i UDP), to rozwiązanie z lat 70 zeszłego stulecia, dzisiaj stosowane tylko w wysokowydajnych aplikacjach typu miliony transakcji/s (telecom).
Biorąc pod uwagę Twoje ogólne pytanie, raczej nie chodzi o taką aplikację.

REST
Jak chcesz synchronicznie - użyj REST API. Klient musi czekać na odpowiedź, ale jest to rozwiązanie najprostsze i wspierane bezpośrednio w Delphi.

https://www.embarcadero.com/images/dm/technical-papers/rest-servers-in-delphi-xe-using-datasnap.pdf
https://www.embarcadero.com/rad-in-action/datasnap-rest
http://blog.marcocantu.com/blog/mobile_jquery_delphi_rest.html
http://www.tmssoftware.com/site/xdata.asp
http://www.thedelphigeek.com/2015/11/connect-your-applications-with-rest.html

Kolejka
Jak chcesz asynchronicznie - użyj kolejki. Możesz spróbować użyć biblioteki dedykowanej.

https://www.habarisoft.com/habari_rabbitmq.html
https://www.habarisoft.com/habari_activemq.html
http://zguide.zeromq.org/dpr:spqueue
http://www.danieleteti.it/using-amqp-from-delphi-with-zeromq/

Edit: to były nawet lata 70-te...

1
vpiotr napisał(a):

REST
Jak chcesz synchronicznie - użyj REST API. Klient musi czekać na odpowiedź, ale jest to rozwiązanie najprostsze i wspierane bezpośrednio w Delphi.

Zapomniałeś dodać, że DataSnap jest słaby. Wolny. Pamięciożerny. No i oczyścicie cholernie drogi (nie ma tego w wersji starter ani pro).
Ale a to łatwy w używaniu;
mORMot jest free, szybszy o rząd wielkości, a zużycie pamięci to chyba 1/100 tego co potrzebuje DataSnap. I działa nawet z Delphi 7 oraz FPC/Lazarus.
Natomiast krzywa wejścia jest zdecydowanie większa niż w DataSnap.

A tu taki mały blog o wydajności DataSnap...
https://robertocschneiders.wordpress.com/2013/01/09/datasnap-analysis-based-on-speed-stability-tests-part-2/

Kolejka
Jak chcesz asynchronicznie - użyj kolejki. Możesz spróbować użyć biblioteki dedykowanej.

https://www.habarisoft.com/habari_rabbitmq.html
https://www.habarisoft.com/habari_activemq.html
http://zguide.zeromq.org/dpr:spqueue
http://www.danieleteti.it/using-amqp-from-delphi-with-zeromq/

To jest tylko klient, który wymaga dodatkowo serwera.
Dla prostych implementacji to niepotrzebny narzu, a wystarczy użyć tego:
https://github.com/pjde/delphi-mqtt

Edit: to były nawet lata 70-te...

I co z tego?
Uważasz, ze to co było, było złe? Zatem czym jest WebSocket jak nie właśnie powrotem do lat 70 w nowym ubranku?

1 użytkowników online, w tym zalogowanych: 0, gości: 1