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?
Jeśli obydwa komputery znajdują się w tej samej sieci, bez problemu można wykorzystać do tego celu sockety.
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?
Są to dwa różne komputery ale w tej samej sieci lokalnej. Jak skomunikować się poprzez sockety?
Nie można po prostu wystawić jakiegoś API ?
W Delphi wystawić webservice i niech PHP do niego woła. Z doświadczenia wiem, że integracja przez baze danych jest kiepska, sprawia problemy.
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
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.
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
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ń :
- router.get("/show/:what", - wywołuje bezposrednio zapytanie z modułu node "mysql"
- 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
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...
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?