Att öppna ett externt program via tex php [projektarbete 100p]

Permalänk
Medlem

Att öppna ett externt program via tex php [projektarbete 100p]

Jag och en klasskamrat har precis påbörjat gymnasiekursen projektarbete 100p på teknikprogrammet åk3.

Vi har beslutat oss för att studera kommunikationen mellan en mobiltelefon och en pc. En del av vårat projekt kommer att innefatta att skriva ett "simpelt" program i php. Programmet skall till en början enbart kunna öppna ett externt program (tex notepad). Senare i projektet är våran vision att man skall kunna använda sin 3g telefon för att starta ett program på en dator på en annan geografisk plats.

Nu till frågan:
Hur gör jag för att öppna ett externt program med php? Alltså tex att jag gör en hemsida med en länk som startar notepad på samma dator. Var kan jag läsa mer om det?

Tacksam för svar!

En viss kunskap innom php finns redan, det är därför jag tidigare har haft det språket som exempel men det är inget måste. Kanske finns något javascript eller liknande som kan göra samma sak (helst inte asp).

Permalänk
Medlem

system(), eller exec() ..

http://se.php.net/manual/sv/function.exec.php

Lär er läsa manualer.. kommer att underlätta ganska mycket.

Visa signatur

Intel Core i7-3770K | NVIDIA Geforce GTX 980 | 16 GB DDR3 | DELL P2415Q | DELL U2711 | DELL U2410

Permalänk
Medlem

Vi har nu läst manualen på php.net utan större framgång. Vi vill öppna hela programet inte bara processen som den gör nu.

system("notepad.exe"); <<---startar notepad processen men inte själva programmet.

Är det någon som kan förklara funktionen på ett lite "bättre" och framförallt lättare sätt än på php.net?

Permalänk
Medlem

En process är ett program som körs.

Permalänk
Medlem

hehe joo, om man ser det så. Men vårat mål är att hela applikationen skall öppnas i ett nytt fönster som om du öppnar den i windows via dubbelklick med mus.

Permalänk
Medlem

Prova starta en bat-fil som i sin tur startar exe-filen, vet inte om det funkar men det är iaf fulhack på hög nivå

Permalänk
Medlem

Är det inte bättre att göra en serverkomponent som php jobbar mot och som i sin tur kan göra det mesta med datorn (servern där php är)?! Det var på det sättet jag byggde en asp-sida som kunde låsa upp en dörr på distans.

Permalänk
Medlem

vad skulle det vara för server komponent?

Permalänk
Medlem

En sak att tänka på när man startar program via t.ex. php är att php i många fall väntar på att processen ska avslutas innan kontrollen återgår till php. Använd kommandot "start <sökväg till körbar fil>" för att låta php tugga vidare utan problem.

Visa signatur

Asus Nforce4 A8N-SLI premium | AMD64-X2 3800+ E6 @ 2,30Ghz (Arctic Cooling Freezer 64 pro) | 2x1GB corsair XMS 2-3-3-7 1T | XFX 7900GT @ 520MHz/1.60GHz | Antec P180 | 2x500GB Seagate 7200.11 2x320GB Seagate 7200.10 SATA2 + 1x250GB Seagate 7200.9 + 2x160GB Seagate 7200.7 SATA1 + 1x160GB Hitachi | NEC 3550A DVD+-RW | Twinhan VisionDTV DVB-S
Bärbar dator: Fujitsu-Simens Si1520, Core 2 duo 1,66GHz, 1GB ram, 80GB hdd.

Permalänk
Medlem

Vi har fått hjälp på annat håll just med att använda komandot start som eje_s föreslår. Vi fick ändra en inställing under Administrationsverktyg>>tjänster som gör att apache tillåter att ett program körs externt.

Nu till det riktiga problemet:
Vi använder det vanilga kommandot exec(start C://sökväg//namn.exe); för att starta programmet. Det fungerar utmärkt men vårat mål är ju att starta programet på en annan måldator och inte datorn som kör scriptet.

Finns det något bra sätt att styra kommandot exec så att det körs på ett annat ip eller liknande?

Alternativt att man anropar ett program/fil på måldatorn (tex en .bat) som startar programet.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av rokk
Vi har fått hjälp på annat håll just med att använda komandot start som eje_s föreslår. Vi fick ändra en inställing under Administrationsverktyg>>tjänster som gör att apache tillåter att ett program körs externt.

Nu till det riktiga problemet:
Vi använder det vanilga kommandot exec(start C://sökväg//namn.exe); för att starta programmet. Det fungerar utmärkt men vårat mål är ju att starta programet på en annan måldator och inte datorn som kör scriptet.

Finns det något bra sätt att styra kommandot exec så att det körs på ett annat ip eller liknande?

Alternativt att man anropar ett program/fil på måldatorn (tex en .bat) som startar programet.

Nej du absolut inte starta ett program på en annan dator än den som scriptet körs på. Det vore ju ett oerhört allvarligt säkerhetshål om någonting sådant skulle fungera.

Men du kan ju skriva en liten server som lyssnar på nån port och genom att skicka kommandon till den serven så kan du få den serven att exekvera program lokalt på den datorn där servern körs.

Visa signatur

Confused by earlier errors. Bailing out...
pluggakuten.se - Din läxhjälp på internet

Permalänk
Medlem

gör som Kydyl och Skogga säger och skriv en serverkomponent! Ni kan aldrig klara er på enbart PHP för att utföra det ni vill... Om ni inte har kunskapen får ni skaffa er det, se det som en rolig extrautmaning.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av ErikHK
gör som Kydyl och Skogga säger och skriv en serverkomponent! Ni kan aldrig klara er på enbart PHP för att utföra det ni vill... Om ni inte har kunskapen får ni skaffa er det, se det som en rolig extrautmaning.

Det där var väl lite kryddat va? Vad är det som hindrar dem från att skriva en daemon i PHP?

Visa signatur

Brass knuckles and a 2x4

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av jonasc
Det där var väl lite kryddat va? Vad är det som hindrar dem från att skriva en daemon i PHP?

Kan man verkligen skriva nåt i PHP som verkligen använder andra program då? Dom vill ju starta t.ex. Anteckningar osv vad jag förstått, och enbart med exec o grejer så kan man ju inte direkt använda programmet. I vilket fall som helst så blir det antagligen mycket smidigare att skriva en daemon eller liknande i ett annat språk, som man sedan kommunicerar med via PHP.

Permalänk
Medlem

Nah, att använda Antecknignar från PHP är väl inte så jävla lätt, men vad är det du kan göra i ett annat språk som du inte kan göra i PHP, som dessutom är viktigt nog att motivera sig att lära sig ett nytt språk? Kom ihåg att vi snackar 100h här.

Visa signatur

Brass knuckles and a 2x4

Permalänk
Medlem

jonasc, var kan jag läsa mer om att skriva "en daemon i PHP"? Låter intressant! Jag håller med om att skriva en serverkomponent verkar lite väl "mycket" och att det kanske är dags at börja tänka på ett annat ämmne om det blir allt för avancerat.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av rokk
jonasc, var kan jag läsa mer om att skriva "en daemon i PHP"? Låter intressant! Jag håller med om att skriva en serverkomponent verkar lite väl "mycket" och att det kanske är dags at börja tänka på ett annat ämmne om det blir allt för avancerat.

Det är inte så advancerat att bara skriva en server som ligger och lyssnar på en port och gör något när någon ansluter/sänder något till servern. Fast sedan med säkerhet och stabilitet så är det en helt annan fråga :>.

Permalänk
Medlem

Okej, men var börjar jag?...var kan jag hitta information om detta? och vad kallas en sådan server? (i google synpunkt )

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av rokk
Okej, men var börjar jag?...var kan jag hitta information om detta? och vad kallas en sådan server? (i google synpunkt )

Menar du en "en daemon i PHP" eller en "vanlig" server nu =/?

Permalänk
Medlem

Nu när du säger det menar jag både-och, jag måste ju kunna läsa om båda för att kunna bilda mig en uppfattning om vad som är bäst (här verkar det ju vara delade meningar om den saken)!

Permalänk
Medlem

Beej's Guide to Network Programming är ganska känd, det är dock om du ska skriva den i c/c++, vilket kanske inte är det bästa språket att börja i, python har liknande funktioner. Och dendära daemon-grejen får någon annan ta eftersom att jag känner att jag inte är så inne på det.

Permalänk
Medlem

Beej's Guide to Network Programming verkar lovande, vi har läst A-kursen i c/c++ samt håller på att läsa B och C kursen. Så jag tror nog att c-programmering kan vara lägligt. Har börjat skumma guiden (Beej's Guide to Network Programming) och det verkar som sagt lovande, jag får återkomma då problemen börjar tränga sig på.

Permalänk
Medlem

Ett tillägg till "1.5. Note for Windows Programmers", http://msdn.microsoft.com/library/default.asp?url=/library/en...

edit: Lyckad bb-code eller vad det heter som gör smilyes i url:er...

Permalänk
Medlem

Det verkar som tåget har bytt spår igen då vi diskuterat möjligheterna med att skriva en liten server i c/c++. Alla jag har talat med (guiden också) säger att om det inte är omöjligt åtminstone väldigt jobbigt att göra detta på ett windows system. Och eftersom vi endast har jobbat med windows så känns det lite jobbigt att byta OP.

Så än en gång faller tankarna på jonasc's förslag om att skriva en daemon i PHP. Har sökt lite men inte hittat något riktigt bra. Är det någon som känner till en guide eller liknande som jag kan läsa för att få veta lite mer om detta?

Permalänk
Medlem

Tja, jag googlade bara på php daemon, men jag har inte läst vidare noga, jag skulle nog inte skriva det här i PHP själv, men det är absolut inte omöjligt för det, det är bara mina egna preferenser som står emellan!

http://risingcode.com/exponent/index.php?section=46
http://se2.php.net/sockets

Sen är det bara att googla vidare eller nåt.

Visa signatur

Brass knuckles and a 2x4

Permalänk
Medlem

Vi är tillbaks på ruta ett igen. Har börjat kika på exec kommandot än en gång. Problemet är att php-scriptet ligger pausat ända tills processen är avslutad. Har kikat på ett gäng olika metoder bl.a.

<?php function fork($shellCmd) { exec("nice $shellCmd > /dev/null 2>&1 &"); } ?>

Men jag har hela tiden samma problem. Någon som har ännu en metod att dela med sig av? Eller om det är någon som orkar beskriva hur ovanstående funktion fungerar vore det bra.

Permalänk
Medlem

<?php
function fork($shellCmd) {
exec("nice $shellCmd > /dev/null 2>&1 &");
}
?>

Fungerar nog inte så himla bra på Windows.

Den startar $shellCmd som i detta fall borde vara ett program som ligger i Apache PATH variabel, typ "vi". Sedan redirectar den all outout till "/dev/null" som är ett svarthål. Sedan kör den allt i bakgrunden med högre prioritet. Tror default är -10 med nice där -20 är max och 0 standard.

Lite kortfattat.

Visa signatur

IBM Thinkpad x60s - Gentoo Linux

Permalänk
Medlem

Tack för svaret. Som du själv säger är det problem på ett windows system att köra ovanstående metod. Nu använder jag istället MS tillägg psexec.exe som möjliggör just att scriptet fortsäter samtidigt som processen kör. Ser ut följande och fungerar ypperligt:

if($prog == 'notepad'){ $programdir='C:/WINDOWS/system32/notepad.exe'; $filnamn='filnamn.txt'; } $var = 'psexec -d '.$programdir.' D:/webdesign/work/'.$filnamn; exec($var);

Permalänk
Medlem
Citat:

I too wrestled with getting a program to run in the background in Windows while the script continues to execute. This method unlike the other solutions allows you to start any program minimized, maximized, or with no window at all. llbra@phpbrasil's solution does work but it sometimes produces an unwanted window on the desktop when you really want the task to run hidden.

start Notepad.exe minimized in the background:
$WshShell = new COM("WScript.Shell");
$oExec = $WshShell->Run("notepad.exe", 7, false);

start a shell command invisible in the background:
$WshShell = new COM("WScript.Shell");
$oExec = $WshShell->Run("cmd /C dir /S %windir%", 0, false);

start MSPaint maximized and wait for you to close it before continuing the script:
$WshShell = new COM("WScript.Shell");
$oExec = $WshShell->Run("mspaint.exe", 3, true);

For more info on the Run() method go to:
http://msdn.microsoft.com/library/en-us/script56/html/wsMthRu...

Ifrån http://se.php.net/manual/sv/function.exec.php

Har inte testat det själv.. menmen..

Sen om ni vill kunna öppna program via wap, så borde det ju inte vara så svårt, borde ju räcka med en liten login, när man loggat in kommer man till en sida med någon länk och trycker man på den, så öppnas ett program...

Permalänk
Medlem

Tack för alla svar...

Nu har vi fått det att fungera ordentligt.

Våran lösning blev att ha en global sida (som alla kan nå) med inloggnig samt en installerad appache server med en lokal sida som ligger på maskinen där programmet ska köras. Utifrån den globala sidan kontaktar du den lokala med det kommando du vill köra (t.ex. test.txt med notpad)
Vi använder även psexec.exe för att slippa starta processen på en egen tråd. (http://www.microsoft.com/technet/sysinternals/utilities/psexe...)

Kanske inte är den snyggaste lösningen men som sagt den fungerar felfritt!

del ur den lokala sidan

if($prog == 'excel') { if(strlen($filnamn) > 0) { $ext = '.xls'; $filnamn = $filnamn.$ext; } else $filnamn='filnamn.xls'; if(strlen($progdir) == 0) $progdir='C:/Program/Microsoft_Office/OFFICE11/EXCEL.EXE'; } $var = 'psexec -d '.$progdir.' D:/webdesign/work/'.$filnamn; exec($var);

*edit: kanske inte fullt så snygga tabbar som i orginalkoden